2013-04-10 2 views
0

Итак, я реализовал свою собственную библиотеку mpi (упрощенную версию), и мне нужно отправить/получить между процессами некоторые данные. MPI_Send выглядит следующим образом (void * buf, int count, dataatype data и т. Д.). SO, это означает, что мне нужно послать счетные элементы данных типа (char, double или int), указанные в адресе buf. Мне нужно отправить их через очередь сообщений (mq). MPI_Recv принимает те же параметры. На данный момент вот что я делаю в Send и Recv:Отправка объекта void * через очередь сообщений [linux]

//Sender part of code 
    ret=mq_send(mq,buf,sizeof(buf),0); 
     if(ret < 0) 
    return MPI_ERR_IO; 
    //Receiver part of code 
    ret = mq_receive(mq, buf, MSGSIZE, NULL); 
    if(ret < 0) 
    return MPI_ERR_IO; 

Прямо сейчас я получаю только первый элемент массива. Как я могу отправить все это? Вот что я имею в виду

//Sender part of pseudocode 
    for(i=0,count) 
     element=(cast to datatype)buf[i]; 
     mq_send(mq,element,sizeof,0); 
    //Receiver part of pseudocode 
    //i receive the count number of elements prior to this message 
    for(i=0,count) 
     mq_receive(mq,local_variable,etc...) 
     somehow store them into my void *buf which i receive as an argument ?? 

Если что-то не достаточно ясно, я отвечу

ответ

0

Вы указываете количество данных, которые вы ставите в очередь с третьим аргументом mq_send. В вашем случае это:

ret=mq_send(mq,buf,sizeof(buf),0); 

Предполагая, что ЬиЙ инициализируются где-то вдоль линий

float f[2]; 
void *buf = f; 

Тогда выражение sizeof(buf) означает: размер указатель называется «ЬиМ». В то время как это может работать на некоторых архитектурах, надлежащим образом будет

ret=mq_send(mq,buf,sizeof(float) * <number of elements>, 0); 

, что означает, размер поплавка, умноженной на количество поплавков, хранящихся в массиве.

В этом случае вы поставили бы весь массив в очередь. Вы также избегаете итерации и используете только постоянное количество сообщений вместо линейного числа.

+0

Я так глуп, я на самом деле пробовал это, но приказал сделать if/case и сделать sizeof (datatype) * count i только попробовал sizef (char) * count. Теперь он работает, спасибо вам большое :) – user1272703