程序崩溃只使用OpenMP,x64

时间:2010-09-28 11:28:06

标签: visual-c++ 64-bit openmp

当我在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 个答案:

答案 0 :(得分:1)

我认为这是一个错误。在push_back调用中查看带有/ O2的ASM输出已经过优化,只有几个预留调用,而是看起来像直接访问。但是,保留呼叫似乎不在关键部分,最终会导致堆损坏。使用/ openmp / GL / Od执行发布x64,您将看到在asm中调用了push_back,它位于_vcomp_enter_critsect调用之间,并且不会崩溃。我会向MS报告。 (使用VS 2010测试)