我有一個使用openMP並行運行的C++代碼。OpenMP不會與JNI並行運行
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++編譯代碼並在命令行中運行時,它會並行運行。
你知道如何解決這個問題嗎?
您是否對命令行和JNI調用相同的二進制文件?或者你編譯不同的二進制文件,命令行的可執行文件和JNI的庫? –
對於JNI,我使用swig和g ++創建一個dll,然後用Java加載它。我不創建二進制文件。 'swig -C++ -java model.i' 'g ++ -c model.cpp model_wrap.cxx -I ...' 'g ++ -shared model.o model_wrap.o -o model.dll -I ... -L ...和一些庫' 但是,對於直接使用C++,我使用g ++編譯器創建一個二進制文件並使用它。 'g ++ model.cpp -o model.exe -I ... -L ...和libraries' – Bob
假設g ++和OpenMP類似於Linux的用法,如果編譯爲'.o',文件使用'-fopenmp'參數到'g ++',但是在鏈接步驟中不要使用'-fopenmp'?我懷疑OpenMP庫沒有被JVM加載。但是我從來沒有在Windows上使用OpenMP .... –