2011-12-04 7 views
1

入れ子になった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) 

助けてくれてありがとう!

+0

プラットフォーム/コンパイラはどれですか? GCC 4.5のOpenMPにバグがあると聞きました。 –

+0

@larsmans \t それはMAC OS Lionとllmvまたはgcc-4.2のどちらかですが、私は単にCMakeを使っているのかどうかはわかりません...私はこれを調べる場所を知っていますか? – guinny

+0

'CMAKE_CXX_COMPILER'を設定してみてください。 –

答えて

2

EDIT:詳細を書き直しました。

openmpはgcc 4.2で断続的な障害を引き起こしますが、gcc 4.6.1(またはおそらく4.6)で修正されています。 http://hpc.sourceforge.net/から4.6.1バイナリを得ることができます(gcc-lion.tar.gzを探してください)。

gcc 4.6.1未満のライオンのopenmpの不具合は断続的です。多くのopenmp呼び出しの後に起こるようですので、入れ子にする可能性は高くなりますが、入れ子は必要ありません。このlinkにはopenmpがネストされていません(標準のシングルスレッド内にはforがあります)が失敗します。私自身のコードは、gcc 4.2(ネストされたプラグマなし)のライオンでうまく動作し、gcc 4.6.1で完全に修正されたので、openmpのために断続的にぶら下がったり、クラッシュしたりしていました。

gcc 4.2でコードをダウンロードしてコンパイルしましたが、マシン上で正常に動作しました(Waiter w;wait();の両方のオプションがあります:-)。私はちょうど使用:

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

私はループmaxesを増やす試みたが、まだそれが失敗することができませんでした。私は開始と終了の両方を参照してくださいblub

どのようなエラーメッセージが表示されますか?

ダウンロードしたgcc 4.6が使用されていますか(確かめるには-vを使用してください)?

hereも参照してください。

+1

gcc 4.2はネスティングがない限り正常に動作します。私はgcc 4をダウンロードしました。6 macportを使用しても問題は解決しません.... – guinny

+0

@Y CHAI:私の更新された答え、特に '-v'を見てください。 – Ramashalanka

+0

@Y CHAI:コードを実行しているときに 'omp_get_thread_num()'の出力を追加して、 'OMP_NESTED'が内部ループのために働いていることを確認しました。 – Ramashalanka

関連する問題