今年夏天我要掌握MPI。我开始阅读彼得帕切科的《并行编程入门》,并解决它的练习。在其中一个MPI练习中,他要求用MPI-Scan实现简单的前缀和,但我不能用MPI-Scan实现。我找到了一个解决方案,使用MPIúu散点和MPIúu集。请帮助我找到MPI_扫描的答案。

// 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);

我希望结果中有前缀sum,但由于某种原因它不起作用。

最佳答案

使用MPI_PROD操作绝对不能得到前缀和-应该使用MPI_SUM操作。还要注意MPI_ScanMPI_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中的数组,依此类推;op是由MPI_Op句柄指定的操作,例如MPI_SUM表示+MPI_PROD表示*,依此类推。
如果数组的元素数与进程数相同,则首先需要执行每个进程的元素长度为MPI_Scatter1,然后执行MPI_Scan。有关更大的阵列,请参见this question

09-08 04:03