OpenMP不与JNI并行运行

时间:2016-04-13 17:53:52

标签: java c++ parallel-processing java-native-interface openmp

我有一个使用openMP并行运行的c ++代码。

void f(){
omp_set_num_threads(3);
#pragma omp parallel 
{
if (omp_get_thread_num() == 0 ){

      // do task 1   

}else if (omp_get_thread_num() == 1){

     //do task 2

}else if (omp_get_thread_num() == 2){

     //do task 3
}}

我使用SWIG JNI创建一个dll并从Java调用此代码。

System.loadLibrary("model");
model.f();

它以串行模式运行。当我使用c ++直接编译代码并在命令行中运行时,它会并行运行。

你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

事实上,@Andrew Henle在评论中回答了您当前的问题:您需要在编译和链接步骤中使用-fopenmp

但是,我想扩展并说明你的代码是一个教科书案例,说明何时使用OpenMP sections。您应该更改代码以利用这些语义:

void f() {
    omp_set_num_threads(3);
    #pragma omp parallel sections
    {
        #pragma omp section
        {
            // do task 1   
        }
        #pragma omp section
        {
            //do task 2
        }
        #pragma omp section
        {
            //do task 3
        }
    }
}

这具有以下优点:(a)当您不使用OpenMP支持进行编译时成为串行代码,这是OpenMP的原始原则之一; (b)轻松允许更多section个和/或更多线程的扩展。如果您有比线程更多section的话,OpenMP会为您处理所有负载平衡。