2016-04-13 10 views
3

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?

+0

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? –

+0

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

+0

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 .... –

Antwort

2

In der Tat wurde Ihr aktuelles Problem von @Andrew Henle in den Kommentaren beantwortet: Sie müssen -fopenmp sowohl während der Kompilierung und Verknüpfung verwenden.

Allerdings wollte ich erweitern und zu sagen, dass Ihr Code wie besehen stellt einen Lehrbuchfall, wann OpenMP verwenden sections. Sie sollten Ihren Code ändern Vorteil dieser Semantik zu nehmen:

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 
     } 
    } 
} 

Dies hat den Vorteil von (a) Seriennummer wird beim Kompilieren nicht mit OpenMP-Unterstützung, einer der ursprünglichen Lehren des OpenMP; und (b) leicht eine Erweiterung für mehr section s und/oder mehr Threads zulassen. OpenMP behandelt den gesamten Lastenausgleich für Sie, wenn Sie mehr als section s als Threads haben.

+0

Danke, das ist wirklich sehr nützlich! – Bob

Verwandte Themen