gpt4 book ai didi

c++ - MPI_Allreduce : very strange false results

转载 作者:太空宇宙 更新时间:2023-11-04 13:48:51 26 4
gpt4 key购买 nike

我有一个巨大的代码,其中有一个非常奇怪的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com