使用MPI_Scan实现简单的前缀和

时间:2012-08-06 07:52:56

标签: c parallel-processing mpi

我将在今年夏天掌握MPI。我开始阅读Peter Pacheco撰写的“并行编程简介”并解决它的练习。在其中一个MPI练习中,他要求用MPI_Scan实现简单的前缀和,但我无法用MPI_Scan实现它。我通过使用MPI_Scatter和MPI_Gather找到了解决方案。请帮我找到MPI_Scan的答案。

// declaring array and result
// generating random array
MPI_Bcast( &array, n, MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Scan(array, result, n, MPI_FLOAT, MPI_SUM, MPI_COMM_WORLD);

我希望结果中有前缀和,但由于某种原因,它无效。

1 个答案:

答案 0 :(得分:3)

您肯定没有使用MPI_PROD操作获得前缀 sum - 您应该使用MPI_SUM操作。另请注意,MPI_Scan上的MPI_Reducearray 元素 ,例如。

result[i] = array_0[i] op array_1[i] op array_2[i] op ... (i = 0,...,n-1)

其中array_0是进程0中的数组,array_1是进程1中的数组,依此类推; opMPI_Op句柄指定的操作,例如MPI_SUM+MPI_PROD*,依此类推。

如果您的数组元素与子句数量一样多,那么您首先需要执行MPI_Scatter每个进程的1元素长度,然后是MPI_Scan。对于较大的阵列,请参阅this question