【发布时间】:2014-01-24 17:02:04
【问题描述】:
所以我正在学习并行编程并正在编写一个程序来计算数字列表的全局总和。该列表分为几个子列表(取决于我有多少核心),并且这些列表是单独并行汇总的。在每个核心都有自己的总和后,我使用 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 是一个结构数组,所以只是指向第一个结构的指针(对吗?)。这会因为内存没有共享而不起作用吗?
对不起,我对并行编程很陌生,需要帮助理解这一点,谢谢。
【问题讨论】:
标签: c concurrency parallel-processing sum mpi