gpt4 book ai didi

c - MPI 使用 MPI_Send 和 MPI_Reduce 发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:49 25 4
gpt4 key购买 nike

所以我正在学习并行编程,并且正在编写一个程序来计算数字列表的全局总和。该列表分为几个子列表(取决于我有多少个内核),并且这些列表分别并行求和。在每个核心都有自己的总和后,我使用 MPI_Reduce 将值发送回其他核心,直到它们最终返回到根。我们不是直接将它们的值发送回根 (O(n)),而是将它们并行发送回其他核心 (O(log(n)),如下图所示:http://imgur.com/rL2O3Tr

因此,在 54 之前一切正常。我想我可能误解了 MPI_Reduce。我的印象是 MPI_Reduce 只是在一个线程中获取一个值,在另一个线程(目标线程)中获取一个值,并对值执行操作,然后将其存储在第二个线程中的同一位置。这至少是我想要的。我想从发送线程中获取 my_sum,并将其添加到接收线程中的 my_sum。你能在不同线程的相同地址上使用 MPI_Reduce 吗?他们都有相同的名字。

此外,我想生成这样的二叉树表示:http://imgur.com/cz6iFxl

其中 S02 表示总和已发送到线程 2,而 R03 表示总和已被线程 3 接收。为此,我为总和中的每个步骤(log(n) 步)创建了一个结构数组。每一步都发生在第 59 - 95 行,while 循环的每次迭代都是一个步骤。第 64-74 行是线程将其总和发送到目标线程的位置,并将信息记录在结构数组中。

我想我可能以错误的方式使用了 MPI_Send。我是这样使用它的:

MPI_Send(srInfo, 1, MPI_INT, root, 0, MPI_COMM_WORLD);

其中 srInfo 是一个结构数组,所以只是指向第一个结构的指针(对吗?)。这会因为内存不共享而不起作用吗?

抱歉,我是并行编程的新手,只需要帮助理解这一点,谢谢。

最佳答案

您可能误解了 MPI_REDUCE 在更高层次上应该做什么。您真的需要手动分配减排量吗?通常,MPI 集体会更好地针对您可以自己完成的大型通信器进行优化。我建议只使用 MPI_REDUCE 函数对所有等级进行归约。

所以你的代码会做这样的事情:

  1. 以某种方式将工作分配给所有级别(可以是从文件中读取,从某个“根”进程发送到所有其他进程等)。
  2. 每个排名总结了自己的值(value)观。
  3. 每个等级都进入一个具有自己值的 MPI_REDUCE。这看起来像:MPI_Reduce(&myval, &sum, 1, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD);

这应该会自动以某种树状方式自动为您完成所有求和。

关于c - MPI 使用 MPI_Send 和 MPI_Reduce 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com