入れ子になったompを使用するC++アプリケーションをビルドします。しかし、それはクラッシュを引き起こす。この問題は、2つのompのどちらかが削除された場合、またはwait関数がメインファイル自体の内部にある場合に解決されます。 OSはMacOS X Lionですが、コンパイラはllvm-gccまたはgcc-4.2のいずれかでなければなりません(私は確信していません、単にcmakeを使っています...):ネストされたopenmpはセグメンテーションフォールトを引き起こします(MacOS Xのみ)
EDIT: Linuxマシンでは正常に動作します。それは純粋なMACOS X(ライオン)の問題です。
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)
助けてくれてありがとう!
プラットフォーム/コンパイラはどれですか? GCC 4.5のOpenMPにバグがあると聞きました。 –
@larsmans \t それはMAC OS Lionとllmvまたはgcc-4.2のどちらかですが、私は単にCMakeを使っているのかどうかはわかりません...私はこれを調べる場所を知っていますか? – guinny
'CMAKE_CXX_COMPILER'を設定してみてください。 –