2

我使用各种#pragma omp 指令用C 编写了一个库来并行执行。我在 Mac OS X 10.6 上。然后,我将这些函数包装在一个 JNI 库中,并从我的 Java 应用程序中调用它们。

如果从主线程之外的 Java 线程调用它们,则似乎对包含 OpenMP 指令的本机函数的调用会因 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

You did not show the native code that you call via JNI and that utilizes OpenMP so this is just a guess: if you access any jvm resources using the JNIEnv* (that you obtained as a parameter to the native method) inside the parallelized code, you are asking for trouble. The JNIEnv* should only be used from within the thread that it was obtained in. Please see http://java.sun.com/docs/books/jni/html/pitfalls.html#11233

There's a further link there that points to explanation how you can obtain the JNIEnv* for the current thread. I have no idea how fast or slow that might be, so it's possible that it may eat up the benefits you gain by parallelizing in the first place if your parallelized calculation is smallish.

于 2010-02-02T07:16:44.030 回答
0

我非常怀疑我可以根据我有限的 OpenMP 编程经验来解释您的问题。由于没有其他人登记入住,所以就这样吧。

OpenMP 想要管理进程中的线程。这就是它的工作原理;它使线程。它期望从主线程启动并从那里开始。

我假设即使没有 JNI,从非主线程启动 OpenMP 也会令人担忧。您能否发布问题的回溯,这也可能提供线索?

请记住,JVM 的其余部分不是使用启用 OpenMP 的编译器选项编译的。

于 2010-01-04T01:18:44.940 回答
0

Java 官方 afaik 不支持 OpenMP。多个机构正在探索线程执行模型,其中一种探索是JOMP(Java for OpenMP)

于 2010-01-04T06:47:58.863 回答
0

使用 gcc 4.7.3 或更高版本。

当我使用 gcc 4.2.1(与 Xcode 一起安装)时,我看到了同样的错误。但是使用gcc 4.7.3,没有出现错误。

于 2013-08-19T04:20:00.150 回答