所以我正在学习并行编程,并正在编写一个程序来计算数字列表的全局和。该列表分为几个子列表(取决于我有多少个核心),并且列表是并行单独求和的。在每个核心都有自己的总和后,我使用MPI_Reduce将值发送回其他核心,直到它们最终恢复到root。我们不是直接将它们的值发送回根(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是一个结构数组,所以只是一个指向第一个结构的指针(对吗?)。这不起作用,因为内存不共享吗?
对不起,我对并行编程很陌生,只需要帮助理解这一点,谢谢。
答案 0 :(得分:2)
您可能会误解MPI_REDUCE
应该在更高级别做什么。您是否真的需要手动分配减少量?通常情况下,MPI集体会更好地优化大规模的沟通者,你可以自己做。我建议只使用MPI_REDUCE
函数来减少所有等级。
所以你的代码会做这样的事情:
MPI_REDUCE
。这看起来像是这样的:
MPI_Reduce(&myval, &sum, 1, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD);
这应该通常以某种树形式自动为你做所有的总结。