今年夏天我要掌握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_Scan
和MPI_Reduce
在array
上按元素工作,例如。
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_Scatter
的1
,然后执行MPI_Scan
。有关更大的阵列,请参见this question。