我将在今年夏天掌握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);
我希望结果中有前缀和,但由于某种原因,它无效。
答案 0 :(得分:3)
您肯定没有使用MPI_PROD
操作获得前缀 sum - 您应该使用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。