0

我打算在这个夏天掌握 MPI。我开始阅读 Peter Pacheco 的“An Introduction to Parallel Programming”,并解决了它的练习。在其中一个 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);

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

4

1 答案 1

3

您绝对没有使用操作获得前缀总和-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是进程 0array_1中的数组,是进程 1 中的数组,依此类推;op是句柄指定的操作MPI_Op,例如MPI_SUMfor +MPI_PRODfor*等。

如果您有一个包含与进程数一样多的元素的数组,那么您首先需要执行每个进程MPI_Scatter的元素长度,然后是. 对于更大的数组,请参阅这个问题1MPI_Scan

于 2012-08-06T09:23:03.067 回答