0

だから、私は自分のmpiライブラリ(簡易版)を実装し、プロセス間でいくつかのデータを送受信する必要があります。MPI_Send は次のようになります (void *buf、int count、datatype data など...)。SO これは、buf によってアドレスを指しているデータ型 (char、double、または int) のカウント要素を送信する必要があることを意味します。メッセージ キュー (mq) を介して em を送信する必要があります。MPI_Recv は、ほぼ同じパラメータを取ります。現時点では、Send と Recv で私が行っていることは次のとおりです。

    //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 ??

何かが十分に明確でない場合は、返信します

4

1 に答える 1

0

mq_send の 3 番目の引数を使用して、キューに入れるデータの量を指定します。あなたの場合は次のとおりです。

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

buf が次の行に沿ってどこかで初期化されていると仮定します

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

この式sizeof(buf)は、「buf」というポインタのサイズを意味します。一部のアーキテクチャでは機能する可能性がありますが、適切な方法は次のとおりです。

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

つまり、フロートのサイズに、配列に格納されているフロートの量を掛けたものです。

その場合、配列全体をキューに入れます。また、反復を回避し、線形数ではなく一定数のメッセージのみを使用します。

于 2013-04-10T17:30:41.807 に答える