具有 MPI 的 OpenMP - 访问仅对主进程可用的数组值
OpenMP with MPI- accessing array values which is available only to Master process
假设我有一个在主进程中初始化的数组 (rank=0) 并且包含随机整数。
我想通过一个从属进程 (rank=1) 对它的所有(数组)元素求和,当整个数组只对主进程可用时(这意味着我不能 MPI_SEND 完整的阵列到奴隶)。
我知道我可以使用 schedule 来在多个线程之间分配工作,但我不确定如何在不将整个数组发送到从属进程的情况下执行此操作。
此外,我在尝试解决问题时一直在检查不同的条款并遇到了 REDUCTION,我不确定它到底是如何工作的。
谢谢!
你要做的确实是一个以sum为操作的归约。以下是缩减的工作原理:您有一个项目集合和您希望执行的操作,该操作将 减少 它们为单个项目。例如,您想对数组中的每个元素求和,并以一个数字作为它们的总和作为结尾。
为了有效地做到这一点,您将集合分成大小相等的块并将它们分发给每个参与进程。每个进程将操作应用于集合中的元素,直到该进程具有单个值。在我们的 运行 示例中,每个进程将其数组块加在一起。然后一半的进程将它们的结果发送到另一个节点,然后该节点将操作应用于它计算的值和它接收的值。此时只有一半的原始进程参与。我们重复这一过程,直到一个过程得到最终结果。
这里有一个 link 的图形,应该可以使它更容易理解:http://3.bp.blogspot.com/-ybPe3bJrpgc/UzCoG9BUFuI/AAAAAAAAB2U/Jz6UcwV_Urk/s1600/TreeStructure.JPG
这里是一些用于减少的 MPI 代码:https://computing.llnl.gov/tutorials/mpi/samples/C/mpi_array.c
假设我有一个在主进程中初始化的数组 (rank=0) 并且包含随机整数。
我想通过一个从属进程 (rank=1) 对它的所有(数组)元素求和,当整个数组只对主进程可用时(这意味着我不能 MPI_SEND 完整的阵列到奴隶)。
我知道我可以使用 schedule 来在多个线程之间分配工作,但我不确定如何在不将整个数组发送到从属进程的情况下执行此操作。
此外,我在尝试解决问题时一直在检查不同的条款并遇到了 REDUCTION,我不确定它到底是如何工作的。
谢谢!
你要做的确实是一个以sum为操作的归约。以下是缩减的工作原理:您有一个项目集合和您希望执行的操作,该操作将 减少 它们为单个项目。例如,您想对数组中的每个元素求和,并以一个数字作为它们的总和作为结尾。
为了有效地做到这一点,您将集合分成大小相等的块并将它们分发给每个参与进程。每个进程将操作应用于集合中的元素,直到该进程具有单个值。在我们的 运行 示例中,每个进程将其数组块加在一起。然后一半的进程将它们的结果发送到另一个节点,然后该节点将操作应用于它计算的值和它接收的值。此时只有一半的原始进程参与。我们重复这一过程,直到一个过程得到最终结果。
这里有一个 link 的图形,应该可以使它更容易理解:http://3.bp.blogspot.com/-ybPe3bJrpgc/UzCoG9BUFuI/AAAAAAAAB2U/Jz6UcwV_Urk/s1600/TreeStructure.JPG
这里是一些用于减少的 MPI 代码:https://computing.llnl.gov/tutorials/mpi/samples/C/mpi_array.c