我有一个使用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 ++直接编译代码并在命令行中运行时,它会并行运行。
你知道如何解决这个问题吗?
答案 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会为您处理所有负载平衡。