我如何确定MPI_Barrier正确行动?测试方法是什么?
谢谢
答案 0 :(得分:4)
我认为,为了确保MPI_Barrier正常工作,您必须编写一个程序,该程序可以保证在工作和非工作障碍方面表现不同。
我不认为@ Neeraj的答案可以保证这样做。如果屏障工作正常,则在写入第二个输出行之前,进程将全部写入其第一个输出行。然而,即使在没有障碍物的情况下也可能发生这种情况(或者如果您想以这种方式想到障碍物,则障碍物完全失效)。我的断言并不取决于他建议的非常短的睡眠时间(5ms rank)。即使您假设进程等待(5s 级别),在没有障碍的情况下,语句可能会出现在屏障强加的顺序中。不太可能我授予你,但并非不可能,特别是当你必须考虑o / s如何缓冲多次写入stdout时 - 你实际上可能正在测试该进程而不是障碍。 哦你哭了即使最不准确的计算机时钟也会导致进程1等待的时间比进程2少得多,以显示屏障的正常工作。如果是o / s则不会先发制人地抢夺处理器1(进程1试图运行)10秒,但不是。
对同步的板载时钟的依赖实际上使程序的确定性降低。所有处理器都有自己的时钟,并且硬件不保证它们都以完全相同的速率或完全相同的刻度长度打勾。
该测试也未充分探索障碍的所有失效模式。充其量只能探究完全失败;如果实施实际上是一个漏洞,那么在最后一个流程到达障碍之前,流程偶尔会通过怎么办?逐个错误在程序中非常常见。或许障碍代码是3年前编写的,只有足够的内存来记录2 ^ 12 == 4096个进程的到来,并且你把它放在一台带有2 ^ 18个处理器的全新机器上;屏障更像是一个堰而不是一个大坝。
直到现在我还没有想过这个问题,我从来没有怀疑过我使用的任何MPI实现都有错误的障碍,所以我对如何彻底测试障碍没有很好的建议。我倾向于使用并行调试器并通过屏障检查程序的执行,但这并不能保证正确的行为。
这是一个有趣的问题。
答案 1 :(得分:0)
#include <mpi.h>
int main (int argc , char *argv[])
{
int rank;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
sleep(5*rank); // make sure each process waits for different amount of time
std::cout << "Synchronization point for:" << rank << std::endl ;
MPI_Barrier(MPI_COMM_WORLD) ;
std::cout << "After Synchronization, id:" << rank << std::endl ;
MPI_Finalize();
return 0;
}
答案 2 :(得分:0)
不幸的是,这个解决方案是 典型的大多数非平凡的 同步代码:很难 确保解决方案是正确的。 通常有一种微妙的方式 通过该计划的特定路径 可能会导致错误。
更糟糕的是,测试一个 解决方案的实施不是 很有帮助。错误可能会发生 很少因为特定的路径 这可能需要一个 非常不吉利的组合 情况。这样的错误差不多 无法重现和调试 传统手段。
唯一的选择是检查 仔细编码并“证明”它是 正确。我把“证明”放在引文中 标记,因为我不是说, 必然,你必须写一个 形式证明(虽然有 鼓励这种疯狂的狂热者)。