使用 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?

为啥我的 x64 程序在 Windows 上静默崩溃?

QT 5.6.1 应用程序在退出插槽后仅在 x86 架构而不是 x64 上崩溃

39个史诗级奇葩代码注释,程序不会崩,但程序员会

更改字体样式后,Android 应用程序在三星设备上崩溃

openMP 的多线程崩溃