OpenMP странное поведение - PullRequest
       28

OpenMP странное поведение

7 голосов
/ 06 февраля 2012

Здравствуйте, у меня есть следующий код, который я компилирую с помощью gcc (> 4.2) с флагом -fopenmp:

int main(void)
{
#pragma omp parallel for
    int i; 
    for(i=0;i<4;i++) while(1);

    return 0;
}

Я получаю SIGSEGV на OSX Lion (версия 1.7.3, llvm-gcc 4.2.1) и CentOS 6.2.Что я здесь не так делаю?Спасибо

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Не уверен, относится ли это к версии и конфигурации компилятора, но while(true){} завершается

Точнее, если вы напишите цикл, который

  • не вызывает функции библиотечного ввода-вывода, а
  • не имеет доступа к изменчивым объектам и не изменяет их,
  • не выполняет операций синхронизации (1.10) или атомарных операций (пункт 29)

и не завершается, у вас неопределенное поведение .

Это может в конечном итоге не относиться к вашей ситуации, но по мере того, как C ++ 11 становится более устоявшимся, остерегайтесь.

1 голос
/ 22 февраля 2012

В gcc была ошибка, связанная с этой проблемой, я сообщил об этом, и они предоставят исправление. Вот ссылка: ошибка GCC

1 голос
/ 06 февраля 2012

Очень интересно.

Я немного изменил код, чтобы

int main(void)
{
int i;
#pragma omp parallel 
  {
        while(1);
    }
    return 0;
} 

и так

inline void func() {
    while (1) ;
}

int main(void)
{
int i;
#pragma omp parallel for 
    for(i=0;i<8;i++) {
        func();
    }
    return 0;
}

И они оба работали нормально.

...