【问题标题】:MPI sending messages with MPI_Send and MPI_ReduceMPI 使用 MPI_Send 和 MPI_Reduce 发送消息
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 啊,好吧,我一定误解了 MPI_Reduce 的作用。所以这将处理求和部分,但是我能否确定树结构以将其打印出来?谢谢。
    • 并非如此。在后台进行缩减的方式是 MPI 内部的。我不知道有任何公开此信息的实现。如果代码对您真的很重要,您可以随时深入研究代码(假设您正在使用和开源实现)。您可能还可以追踪一些调试标志或环境变量,这些信息可以为您提供更多信息。
    • 该死,这是一个书本练习,它明确告诉我生成一个树形图,所以我猜 MPI_Reduce 不合适。我刚刚修改了我的代码,它使用 MPI_Reduce 正确求和,但是由于我需要树,所以使用 Send/Recv 编写程序是否明智?
    • 如果这是一个练习,那么是的,您将基本上实现您自己的MPI_REDUCE 发送和接收呼叫。显然,这不会那么有效,但这并不重要。
    猜你喜欢
    • 2018-05-25
    • 2013-03-27
    • 2014-01-25
    • 1970-01-01
    • 2015-08-20
    • 2011-05-03
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多