【问题标题】:Using MPI_Scan to implement simple prefix sum使用 MPI_Scan 实现简单的前缀求和
【发布时间】:2012-08-06 07:52:56
【问题描述】:

我将在今年夏天掌握 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);

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

【问题讨论】:

    标签: c parallel-processing mpi


    【解决方案1】:

    您肯定没有使用MPI_PROD 操作获得前缀sum - 您应该使用MPI_SUM 操作。还要注意MPI_ScanMPI_Reducearrayelementwise 工作,例如

    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

    【讨论】:

    • 非常感谢。我知道了。我的数组应该先分散,然后 MPI_Scan 将像 MPI_Reduce 一样在数组的每个元素上工作,结果将是前缀总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多