2015-08-26 3 views
0

Я STRUCT так:Как отправить указатель на структуры в MPI

typedef struct 
{ 
    int x; 
    double *y; 
    int **z; 
} 
ind; 

, как я мог бы послать указатель как * у и ** г через MPI для других процессов? Я знаю, что многие ответы говорят, что никогда не посылают указатели MPI. Но если я не могу изменить * y на массив, потому что он используется в другой части основной программы, что мне делать, чтобы передать их через процессы через MPI? Специально для ** z, как мне это сделать? Спасибо заранее!

+0

Я бы предположил, что вы не можете. Скажем, что один процесс изменил '* y', как другие процессы узнают, что' * y' изменился? – immibis

+4

Вы не можете отправить указатель, потому что он не имеет смысла за пределами процесса, в котором он был выделен. Если вы хотите отправить массив данных, на которые он указывает, задайте этот вопрос. – Jeff

+0

Извините. Я новичок в программировании. Возможно, я не описал вопрос четко. Я хочу отправить массив данных, на которые он указывает. Не могли бы вы дать немного подсказки для этого. Большое спасибо! –

ответ

1

Просто следуя коду со второго примера here, я сделал следующее. Я считаю, что это то, что вы хотите.

#include <stdio.h> 
#include <stdlib.h> 
#include <mpi.h> 

int main(int argc, char *argv[]) { 
    int *send, *recv; 
    int rank, i; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    send = malloc(sizeof(int)*10); 
    recv = malloc(sizeof(int)*10); 

    for (i=0;i<10;i++) 
    send[i] = 5*i; 

    if (rank == 0) 
    MPI_Send(send, 10, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    else { 
    MPI_Recv(recv, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); 

    for (i=0;i<10;i++) 
     printf("%d\n", recv[i]); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

Забегая выходы,

$ mpiexec -n 2 mpi_test 
0 
5 
10 
15 
20 
25 
30 
35 
40 
45 

Теперь вы просто должны адаптировать его к вашей собственной проблеме.

+0

Спасибо за вашу любезную помощь. Что делать, если я хочу создать MPI_struct, чтобы включить все элементы в структуру ind и отправить их как MPI_type? Как обращаться с указателями? Особенно, как вычислить MPI_адрес из тех массивов, которые указывают указатели? –

+0

Если вы ссылаетесь на http://www.mpich.org/static/docs/v3.1/www3/MPI_Type_create_struct.html, то я скажу, что вы не можете напрямую. Я бы рекомендовал создать отдельную функцию (вы можете моделировать после MPI, если хотите), которая отправляет вашу структуру данных, как я уже писал. Куча Send/Recv/Broadcast/etc. для правильной передачи вашей структуры данных. Это будет работать. –

+0

Вы также можете использовать эту функцию для сериализации своих данных, упаковывая ее в буфер, который можно распаковать на принимающей стороне. –

Смежные вопросы