- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序,其目的是将特定数据添加到一个主数组中。随机数测试 passesTest(randomNumber)
每秒执行数百万次,并且极少数情况下测试会通过并且随机数被推送到数组的末尾。因此,大多数时候,当计算正在进行时,数组只是坐在那里。
我决定使用 MPI 并行化此过程,因为我认为执行随机数测试的 1000 个处理器将大大加快速度,并且由于内存写入非常罕见,因此 MPI 应该非常适合这项工作。令我沮丧的是,我的程序使用 mpirun -np 1
速度最快,但随着我添加的每个进程,速度明显变慢。
在包含 passesTest(randomNumber)
的 while
循环末尾,我有 MPI::COMM_WORLD.Allgather()
来收集每个进程的一个标志,指示是否有需要推送到数组的新随机数。如果任何标志为 true
,那么我会执行另一个 Allgather()
来实际收集此数据并将其推送到每个进程的数组的本地拷贝。同样,第二个 Allgather()
很少执行,因为测试很少通过。
所以我猜测我的瓶颈是从每个 MPI 进程收集所有标志以查看是否有新数据。每个随机数的测试执行速度很快,因此我假设每秒数十亿个 while 循环现在已显着减少,因为从多个进程收集数据的开销。这是一个好的猜测吗?我是 MPI 新手,所以我不知道 Allgather()
涉及什么样的时间尺度。
如果是这个原因,那么当测试通过时我怎样才能只与其他进程“交互”呢?这确实是我想做的。换句话说,如果随机数通过测试,则向所有其他进程发送一条消息以停止它们正在执行的操作并将该数字添加到它们的数组中。
最佳答案
首先,我强烈支持 Voo 和 Hristo Iliev 的评论。
从 MPI_Allreduce
开始检查传递显然更快 - 它需要传输的数据少得多。然而 Allreduce 仍然需要 > 2 * log2(n) * 延迟
。对于 1000 个进程,可能需要大约 100 微秒,具体取决于您的系统。如果您每秒进行数百万次测试,这意味着每个测试只需要 100 纳秒,那么很明显,每次测试后的集体操作确实会降低您的性能 - 无论每个单独的通信步骤设计得多么优化。
现在,如果不了解依赖性,就很难提出根本性的改进建议。您可以考虑假设没有命中,推测性地执行多次迭代,并在发现命中后丢弃无效的迭代。
此外,我建议使用 MPI_Allreduce
和 MAX
来确定需要添加的最高随机数。重复此操作,直到添加完所有内容。显然,只有在通常添加很少的情况下,这才有效。
关于c++ - MPI_Allgather 是我的代码瓶颈吗?如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104129/
我在一个大型软件的一部分中遇到了 MPI_Allgather 问题。 以下函数传递每个节点上不同的 double 和相关标志,然后该函数应该找到全局最小 double ,并将所有节点设置为相应的值。
根据评论编辑 我正在学习 MPI,我正在做一些练习以了解它的某些方面。我编写了一个应该执行简单蒙特卡洛的代码。 其中有两个必须完成的主要循环:一个关于时间步长 T 和一个更小的关于分子数量 N 的循环
我首先在每个处理器上生成一个随机数。在第二步中,我想将生成的数字发送到其他所有处理器。也就是说,在使用 MPI_Allgather 之后,每个处理器都拥有一个包含所有生成的随机数的列表: #inclu
经过大量谷歌搜索,我不知道是什么导致了这个问题。在这里: 我在我的代码中有一个对 MPI_Allgather 的简单调用,我对它进行了双重、三次和四次检查以确保正确(发送/接收缓冲区大小合适;调用中的
我在用 C 编写并行分子动力学算法时遇到了一个问题,其中所有核心计算最小碰撞时间,然后通过 MPI_Allgather 将碰撞伙伴与所有其他核心通信,以查看哪个碰撞最早。我内置了一个时间测量函数来查看
我必须使用 MPI_Allgather() 向所有进程发送一个结构。我似乎没有收到任何明显的错误,但是代码不起作用。当我检查我是否在 recv[] 中收到任何值时,它显示没有。如果我只发送一个变量而不
我有一个程序,其目的是将特定数据添加到一个主数组中。随机数测试 passesTest(randomNumber) 每秒执行数百万次,并且极少数情况下测试会通过并且随机数被推送到数组的末尾。因此,大多数
#include #include #include #include #include #define h 1 #define XY0 0 #define MAX_XY 5 #define
您好,我希望找到所有进程的局部最大值,然后将所有局部最大值传递给所有进程以形成单个数组,然后使用 MPI 环形拓扑比较局部最大值,最后输出全局最大值。 我可以更有效地执行 MPI_ALLreduce
MPI_Allgather()有什么区别和 MPI_Allgatherv() ? 最佳答案 来自 MPI standard MPI_GATHERV extends the functionality
MPI 中的 MPI_Allgather 和 MPI_Alltoall 函数之间的主要区别是什么? 我的意思是有人可以给我举例说明 MPI_Allgather 有帮助而 MPI_Alltoall 没有
我正在尝试计算一些基于其先前位置的物体的位置。因此,在每个 k 循环中,我需要使用计算并存储在 Cw 数组中的物体的新坐标 (x,y,z) 来更新每个 C 数组。我尝试了 MPI_Allgather
在MPI中,是否可以在不分配缓冲区的情况下立即丢弃接收到的数据?我正在使用 MPI_Allgather 从多个进程收集数据,但在某个时刻,一个或多个进程没有要发送的有用数据。 我最初的解决方案是让无用
我有一个带有mpi和MPI_Allgather和MPI_pack的problem。 我有结构: typedef struct{ float a; int b; int c[];
我正在使用 MPI-2 编写一个优化程序,其中我需要一个等长的 std::vector 的 std::vector(概念上) ,在所有进程之间共享。此 vector 包含针对当前发现的问题的最佳 k
我是一名优秀的程序员,十分优秀!