1

私はこのコードについて少し混乱しています。まず、MPIでポインタを送信しないようにアドバイスする多くの投稿を読みました。しかし、私はここに1つ送っていて、それは機能しています。このコードで私が抱えているもう1つの問題は、他のプロセスから最大4文字を書き込んで、コードのように0に割り当てられたメモリを処理できることです。誰かが少し説明できますか?

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

int main(int argc, char *argv[])
{
    int MyRank, NumProcs, index, ret;
    MPI_Status status;
    MPI_File cFile;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&MyRank);
    MPI_Comm_size(MPI_COMM_WORLD,&NumProcs);
    //Allocated memory for a double pointer.
    char **var;
    MPI_Alloc_mem(sizeof(char *)*NumProcs, MPI_INFO_NULL, &var);
    for(index = 0; index < NumProcs; index++)
        MPI_Alloc_mem(sizeof(char)*50, MPI_INFO_NULL, &var[index]);
    if(MyRank == 0)
    { 
        //Copied data to the 0th position of the double pointer
        strcpy(var[MyRank],"KKKKKK");
        //Process 0 sent the array to other process to overwrite the data
        for(index = 1; index < NumProcs; index++)
            MPI_Send(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD );
        for(index = 1; index < NumProcs; index++)
            MPI_Recv(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD,&status);
    }
    else
    {
        //Overwrite of data is done. 
        MPI_Recv(var[MyRank],1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
        strcpy(var[MyRank],"MMMMMM");
        MPI_Send(var[MyRank],1,MPI_INT,0,1,MPI_COMM_WORLD );
    }
    if(MyRank == 0)
    {
        //After writing data, printed in process 0;
        printf("My Rank is -%d\n", MyRank);
        for(index = 0; index < NumProcs; index++)
            printf(" %s\n",var[index]);
    }
    MPI_Finalize();
    return 0;
}
4

1 に答える 1

3

あなたが言うときMPI_Send(var[index],1,MPI_INT,index,1,MPI_COMM_WORLD );、コンパイラに1つの整数を送るように指示します。32 ビット システムでは、これはわずか 4 バイトです。

すべての送信行と受信行を変更して、同じパラメーターを持つようにすることをお勧めします。MPI_Send(var[index],50,MPI_CHAR,index,1,MPI_COMM_WORLD );

ポインターの送信に関する誤解を解消するために、MPI は実際には「ポインターを送信」し​​ません。上記のコードは、char指定された by から開始し、それと次の 49var[index]を送信します。charchars

于 2012-09-17T07:08:30.217 に答える