C中的MPI前缀和

时间:2012-11-23 20:55:57

标签: c mpi

我很难用MPI实现前缀和。我想我错过了几行,但我不知道哪些缺失,应该放在哪里。这就是我所拥有的:

int main(int argc, char** argv){  
 int i, size, nprocs, rank;
 int array[atoi(argv[1])];

int Destination, Destination_tag;
int Source, Source_tag, RecvData;

int len = sizeof(array)/sizeof(int);

for(i = 0; i < size; i++) 
     {
    array[i] = i+rank*size;
}

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

int id = rank;

      //I believe the error is here
for(i = 0; i < size, i++)
{
    message = (rank - pow(2,x));

    Destination = message ;
    Destination_tag = array.id; 
    MPI_Send(&message, 1, MPI_INT, Destination, Destination_tag, MPI_COMM_WORLD); 

    Source = message ;
    Source_tag = message; 
    MPI_Recv(&RecvData, 1, MPI_INT, Source, Source_tag, MPI_COMM_WORLD, &Status); 
   //End of problem area
    printf("My rank is  %d n =%d \n",i,size); 

    MPI_Finalize();
    return 0;

}

2 个答案:

答案 0 :(得分:8)

不要使用MPI_SendMPI_Recv手动计算前缀和,而是使用MPI_ScanMPI_Scan执行process_ {0}到process_ {your rank}的元素的部分包容性减少,允许您非常轻松地(并且有效地!)执行前缀求和。

例如,假设单个整数分布在这样的过程中:
过程0 = 2
过程1 = 3
过程2 = 4
过程3 = 5

使用MPI_Scan作为缩减操作调用MPI_SUM后,结果如下:
过程0 = 2
过程1 = 5
过程2 = 9
过程3 = 14

调用MPI_Exscan进行独占扫描,这意味着减少将不包括调用过程中减少的数据。结果将如下所示:
进程0 =未定义(将你的recv_buffer设置为0或那里会有垃圾)
过程1 = 2
过程2 = 5
过程3 = 9

答案 1 :(得分:0)

您的MPI发送和接收呼叫可能是错误。总的来说,我被告知你应该总是通过一个

告诉MPI进程发送和接收的位置
 if (rank == 0)
    {
      MPI_Send(...
    }

if (rank == 1)
    {
     MPI_Recieve(...