Сбой в программе при использовании OpenMP, только x64 - PullRequest
2 голосов
/ 28 сентября 2010

Приведенная ниже программа аварийно завершает работу, когда я собираю ее в Выпуске x64 (все остальные конфигурации работают нормально).

Я делаю это неправильно или это проблема OpenMP?Обоснованные обходные пути высоко ценятся.

Воспроизведение сборки проекта (консольного приложения) с кодом ниже.Сборка с опциями / openmp и / GL и (/ O1 или / O2 или / Ox) в конфигурации Release x64.То есть поддержка 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 Ответ

1 голос
/ 15 октября 2010

Я думаю, что это ошибка. Просмотр вывода ASM с / O2 при вызове push_back был оптимизирован, и есть только пара резервных вызовов и то, что выглядит как прямой доступ. Однако резервные вызовы, по-видимому, не находятся в критическом разделе, и в результате вы получаете повреждение кучи. Делая выпуск x64 с / openmp / GL / Od, вы увидите, что в asm есть вызов push_back, он находится между вызовами _vcomp_enter_critsect и не вылетает. Я бы сообщил об этом в MS. (протестировано с VS 2010)

...