実行を並列化するためにさまざまな#pragmaompディレクティブを使用して、Cでライブラリを作成しました。私はMacOSX10.6を使用しています。次に、これらの関数をJNIライブラリにラップし、Javaアプリケーションから呼び出しました。
OpenMPディレクティブを含むネイティブ関数の呼び出しは、メインスレッド以外のJavaスレッドから呼び出された場合、EXC_BAD_ACCCESSでクラッシュするようです。
public static void main(String[] args) { nativeCall(); }
動作しますが、別のスレッドでライブラリを呼び出す、たとえばEventQueue
public static void main(String[] args) {
SwingUtilities.invokeLater(
new Runnable(){
public void run() { nativeCall(); }
});}
EXC_BAD_ACCESSでクラッシュします。
私はOpenMPの初心者なので、これを引き起こしている原因がわかりません。Javaの「メイン」スレッドの何が特別なのですか?OpenMP並列化タスクを初期化するために必要なリソースにアクセスできるのはそれだけであるような特権モードで実行されますか?また、OS XでのJVMの内部動作についてもよく知らないため、Javaスレッドとネイティブスレッドの関係がわかりません。
どんな助けでも大歓迎です!