2

実行を並列化するためにさまざまな#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スレッドとネイティブスレッドの関係がわかりません。

どんな助けでも大歓迎です!

4

4 に答える 4

1

JNIを介して呼び出し、OpenMPを利用するネイティブコードを表示しなかったため、これは単なる推測です。並列化されたコード内でJNIEnv *(ネイティブメソッドのパラメーターとして取得したもの)を使用してjvmリソースにアクセスする場合、あなたはトラブルを求めています。JNIEnv *は、取得されたスレッド内からのみ使用する必要があります。http ://java.sun.com/docs/books/jni/html/pitfalls.html#11233を参照してください。

現在のスレッドのJNIEnv*を取得する方法を説明するリンクがさらにあります。それがどれほど速いか遅いかはわかりません。したがって、並列化された計算が小さければ、そもそも並列化によって得られるメリットを使い果たしてしまう可能性があります。

于 2010-02-02T07:16:44.030 に答える
0

私は、OpenMPのプログラミングの限られた経験に基づいて、あなたの問題を説明できるのではないかと強く疑っています。誰もチェックインしていないので、ここに行きます。

OpenMPは、プロセス内のスレッドを管理したいと考えています。それがどのように機能するかです。それはスレッドを作ります。メインスレッドから起動してそこから移動することを想定しています。

JNIがなくても、メインスレッド以外からOpenMPを起動するのは面倒だと思います。問題からのバックトレースを投稿できますか?これも手がかりになる可能性がありますか?

JVMの残りの部分全体が、OpenMPを有効にするコンパイラオプションでコンパイルされていないことに注意してください。

于 2010-01-04T01:18:44.940 に答える
0

OpenMPは、Javaでは公式にはサポートされていません。スレッド実行モデルはいくつかの機関によって調査されており、そのような調査の1つがJOMP(Java for OpenMP)です。

于 2010-01-04T06:47:58.863 に答える
0

gcc4.7.3以降を使用してください。

gcc 4.2.1(Xcodeと共にインストール)を使用した場合、同じエラーが表示されます。しかし、gcc 4.7.3を使用すると、エラーは発生しませんでした。

于 2013-08-19T04:20:00.150 に答える