使用 OpenMP 的程序崩溃,仅限 x64
Posted
技术标签:
【中文标题】使用 OpenMP 的程序崩溃,仅限 x64【英文标题】:Crash in program using OpenMP, x64 only 【发布时间】:2010-09-28 11:28:05 【问题描述】:当我在 Release x64 中构建它时,下面的程序崩溃了(所有其他配置都运行良好)。
是我做错了还是 OpenMP 问题? 高度赞赏有充分依据的解决方法。
使用以下代码重现构建项目(控制台应用程序)。 在 Release x64 配置中使用 /openmp 和 /GL 和(/O1 或 /O2 或 /Ox)选项构建。 即必须打开 OpenMP 支持和 C++ 优化。生成的程序应该(不应该)崩溃。
#include <omp.h>
#include <vector>
class EmptyClass
public:
EmptyClass()
;
class SuperEdge
public:
SuperEdge() mp_points[0] = NULL; mp_points[1] = NULL;
private:
const int* mp_points[2];
;
EmptyClass CreateEmptyClass(SuperEdge s)
return EmptyClass();
int main(int argc, wchar_t* argv[], wchar_t* envp[])
std::vector<int> v;
long count = 1000000;
SuperEdge edge;
#pragma omp parallel for
for(long i = 0; i < count; ++i)
EmptyClass p = CreateEmptyClass(edge);
#pragma omp critical
v.push_back(0);
return 0;
【问题讨论】:
【参考方案1】:我认为这是一个错误。在 push_back 调用上使用 /O2 查看 ASM 输出已被优化掉,只有几个保留调用和看起来像直接访问的东西。然而,保留调用似乎不在关键部分,您最终会遇到堆损坏。使用 /openmp /GL /Od 发布 x64 版本,您会看到 asm 中有对 push_back 的调用,它位于 _vcomp_enter_critsect 调用之间,并且不会崩溃。我会向 MS 报告。 (用 VS 2010 测试)
【讨论】:
谢谢,我确实举报了:connect.microsoft.com/VisualStudio/feedback/details/606013/…以上是关于使用 OpenMP 的程序崩溃,仅限 x64的主要内容,如果未能解决你的问题,请参考以下文章
GCC 8.1.0/MinGW64 编译的 OpenMP 程序崩溃寻找 cygwin.s?