c++ - MPI_Allreduce : very strange false results

标签 c++ debugging c++11 parallel-processing mpi

我有一个巨大的代码,其中有一个非常奇怪的 MPI 错误。 MPI 并行化是微不足道的,只需计算代码中某处的平均值,可以将其隔离为:

// Declaration
std::vector<double> local;
std::vector<double> global;
unsigned int size;
/* ... huge computations here ... */
size = 10000; // approximately
local.resize(size);
global.resize(size);
local.shrink_to_fit();
global.shrink_to_fit();
/* ... some operations to fill in the local vector ... */
MPI_Allreduce(local.data(), global.data(), int(size), 
              MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
/* ... some final operations here ... */

但是如果我绘制 global 的值,大约有 10 个错误值(超过 10000)随机分布在 vector 中(但是总是在 ~1000th~2000th 值之间):

  • 并非所有 MPI 任务都相同(约 80% 的任务具有相同的错误值,但剩余的 ~20% 具有不同的错误值)

  • 2 次不同的运行不相同(不可重现)

我已经在 1 处理器上使用 valgrind 测试了该程序(只是删除了 MPI_InitMPI_AllreduceMPI_Finalize) 并且没有内存泄漏或任何类型的问题(至少这是 valgrind 告诉我的)。

并行版本的正常任务数为1024,程序在C++11中用g++4.8.1<编译.

Valgrind 是我最后的希望,我完全不知道发生了什么。欢迎任何想法或建议!

注意:问题可能不在代码本身(MPI 配置、硬件等...)中,因此欢迎任何关于测试内容的想法。

最佳答案

仅供引用,经过2天的研究,问题现已解决。 MPI_Allreduce如果缓冲区大小不匹配,则不会崩溃,而是会产生奇怪的行为。我发现将它们替换为 MPI_Reduce + MPI_Bcast (并且 MPI_Reduce 由于缓冲区大小不匹配而崩溃)。仅使用问题中提供的信息无法找到错误: key 在线:

size = 10000; // approximately

和单词approximately因为在我的真实代码中,这个大小依赖于微分方程的大量计算和数值积分。但是这段代码使用的是混合并行化 MPI+std::thread .并且部分集成依赖于 std::thread积分的最后一位数字依赖于不可预测的操作顺序。最后的 size很大程度上取决于这一点。因此,由于每个 MPI 任务都以不同的顺序执行其线程,size两个或三个 MPI 任务略有不同......在 MPI_Allreduce 中导致未定义的行为(但没有崩溃) .

关于c++ - MPI_Allreduce : very strange false results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24397411/

相关文章:

c++ - 在 C++ 中返回假对象引用的规则

c++ - 默认参数模板与可变参数模板 : what is the last template parameter?

c++ - GTest链接错误: undefined reference to 'foo::function'

C++:检查 vector<Class> 是否是 vector<Class> 的子集

C++套接字编程: maximize throughput/bandwidth on localhost (I only get 3 Gbit/s instead of 23GBit/s)

android - 线程对象在完成后未被垃圾回收

android - 如何在 android 中查看 native 编译的 C 程序的堆栈跟踪?

c++ - 无法在 COM 端口上正确使用 windows.h ReadFile。 WriteFile 似乎工作正常

c++ - 运行测试时如何考虑依赖关系?

.net - 如何弄清楚为什么我的本地主机站点需要这么长时间才能加载?