Вложенный openmp вызывает ошибку сегментации (только MacOS X) - PullRequest
1 голос
/ 04 декабря 2011

Я создаю приложение на c ++, которое использует вложенный omp.Это однако вызывает сбой.Проблема решается, когда либо один из двух omp удаляется, либо функция ожидания находится внутри самого основного файла.ОС MacOS X Lion, компилятор должен быть либо llvm-gcc, либо gcc-4.2 (я не уверен, просто использовал cmake ...). Затем я создал следующее приложение, чтобы продемонстрировать:

РЕДАКТИРОВАТЬ: сейчас я попробовалто же самое на машине Linux, он работает нормально.Так что это чисто проблема MACOS X (lion).

OMP_NESTED установлен в true.

Основной:

#include "waiter.h"
#include "iostream"
#include "time.h"
#include <omp.h>


void wait(){
    int seconds = 1;

#pragma omp parallel for
    for (int i=0;i<2;i++){
        clock_t endwait;
        endwait = clock () + seconds * CLOCKS_PER_SEC ;
        while (clock() < endwait) {}
        std::cout << i << "\n";
    }
}

int main(){
    std::cout << "blub\n";

#pragma omp parallel for 
    for(int i=0;i<5;i++){
        Waiter w;  // causes crash
        // wait(); // works
    }
    std::cout << "blub\n";

    return 0;
}

заголовок:

#ifndef WAITER_H_
#define WAITER_H_

class Waiter {
public:
    Waiter ();    
};

#endif // WAITER_H_

реализация:

#include "waiter.h"
#include "omp.h"
#include "time.h"
#include <iostream>

Waiter::Waiter(){
    int seconds = 1;

#pragma omp parallel for
    for (int i=0;i<5;i++){
        clock_t endwait;
        endwait = clock () + seconds * CLOCKS_PER_SEC ;
        while (clock() < endwait) {}
        std::cout << i << "\n";
    }
}

CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (waiter)

set(CMAKE_CXX_FLAGS  "-fPIC -fopenmp")
set(CMAKE_C_FLAGS  "-fPIC -fopenmp")
set(CMAKE_SHARED_LINKDER_FLAGS  "-fPIC -fopenmp")

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

add_library(waiter SHARED waiter.cpp waiter.h)
add_executable(use_waiter use_waiter.cpp)
target_link_libraries(use_waiter waiter)

спасибо за помощь!

1 Ответ

2 голосов
/ 05 декабря 2011

РЕДАКТИРОВАТЬ: переписано с более подробной информацией.

openmp вызывает прерывистую ошибку в gcc 4.2, но это исправлено в gcc 4.6.1 (или, возможно, 4.6). Вы можете получить двоичный файл 4.6.1 из http://hpc.sourceforge.net/ (ищите gcc-lion.tar.gz).

Ошибка openmp у льва с менее чем gcc 4.6.1 является периодической. Похоже, это происходит после многих вызовов openmp, поэтому, скорее всего, это достигается за счет вложения, но вложение не требуется. Эта ссылка не имеет вложенного openmp (есть параллель для внутри стандартного однопоточного for), но завершается ошибкой. Мой собственный код периодически зависал или зависал из-за openmp после многих минут работы с gcc 4.2 (без вложенных прагм) в lion, и он был полностью исправлен gcc 4.6.1.

Я скачал ваш код и скомпилировал его с помощью gcc 4.2, и он отлично работал на моей машине (с опциями Waiter w; и wait(); :-). Я просто использовал:

g++ -v -fPIC -fopenmp use_waiter.cpp waiter.cpp -o waiter

Я пытался увеличить макс петли, но все равно не смог заставить его выйти из строя. Я вижу начало и конец blub.

Какое сообщение об ошибке вы видите?

Вы уверены, что загруженный вами gcc 4.6 используется (для проверки используйте -v)?

См. Также здесь .

...