Ich habe einen C++ Code, die OpenMP parallel zum Ausführen verwendet.OpenMP läuft nicht parallel mit 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
}}
Ich benutze SWIG JNI, um eine DLL zu erstellen und diesen Code aus Java aufzurufen.
System.loadLibrary("model");
model.f();
Es läuft im seriellen Modus. Wenn ich den Code direkt mit C++ kompiliere und in der Befehlszeile ausführe, läuft er parallel.
Wissen Sie, wie dieses Problem beheben?
Rufen Sie die gleiche binäre sowohl für Befehlszeile und JNI? Oder kompilieren Sie verschiedene Binärdateien, eine ausführbare Datei für die Befehlszeile und eine Bibliothek für JNI? –
für JNI, ich habe eine dll mit swig und g ++ erstellen und dann die DLL laden Sie es in Java. Ich erstelle keine Binärdatei. '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 ... und einige Bibliotheken Aber für direkte C++ verwenden, ich erstellen eine Binärdatei mit g ++ Compiler und verwenden Sie das. 'g ++ model.cpp -o model.exe -I ... -L ... und Bibliotheken' – Bob
Angenommen, g ++ und OpenMP sind ähnlich wie Linux, was passiert in Ihrer Binärdatei, wenn Sie zu einem' .o' kompilieren Datei mit dem '-fopenmp' Argument zu' g ++ ', aber '-fopenmp' während des Verbindungsschrittes abbrechen? Ich vermute, dass die OpenMP-Bibliothek nicht von der JVM geladen wird. Aber ich habe nie OpenMP auf Windows verwendet .... –