2017-09-29 2 views
0

Gemäß der OpenMP-Spezifikation muss auf "True" gesetzt werden, damit Anweisungen wie #pragma omp cancel keine Auswirkung haben. Ich muss die Abbruchfunktion aktivieren, damit mein Programm ordnungsgemäß funktioniert (eine Schaltfläche zum Abbrechen der GUI, die die Löschung auslöst, wenn es darauf ankommt).Freigabe von Innenprogramm aktivieren

Ich versuchte OMP_CANCELLATION aus dem Programm zu setzen mit

setenv("OMP_CANCELLATION", "true", 1); 

als die ersten Zeile des Programms, aber diese Aussage hat keine Wirkung. Wenn ich manuell export OMP_CANCELLATION=true von einer Shell draußen vor dem Ausführen des Programms, funktioniert die Stornierung ordnungsgemäß.

Kann die Löschung innerhalb des Programms aktiviert werden, ohne dass diese Umgebungsvariable extern gesetzt werden muss?

+0

Vielleicht wird der Wert abgefragt, noch bevor 'main()' läuft? Es gibt einen Thread [hier] (https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/700267), der zumindest darauf hinweist, dass dies möglicherweise nicht möglich ist (obwohl es um FORTRAN geht). –

+0

Es kann sich lohnen, Ihre Frage im OpenMP ARB-Forum http://forum.openmp.org/forum/viewforum.php?f=3 zu stellen. So besteht die Möglichkeit, dass Leute, die mit dem Standard zu tun haben, diese Unterlassung bemerken ... –

Antwort

0

Obwohl es nicht möglich ist eine Stornierung zu ermöglichen, sobald das Programm gestartet wird (per Zulan Antwort), gelang es mir, eine Abhilfe zu finden:

char *hasCancel = getenv("OMP_CANCELLATION"); 
if (hasCancel == nullptr) { 
    printf("Bootstrapping..."); 
    setenv("OMP_CANCELLATION", "true", 1); 
    // Restart the program here 
    int output = execvp(argv[0], argv); 
    // Execution should not continue past here 
    printf("Bootstrapping failed with code %d\n",output); 
    exit(1); 
} else { 
    puts("Bootstrapping complete"); 
} 

ich die Variable in dem Programm festgelegt und dann eine exec-Aufruf um den Prozess neu zu starten. Der neu gestartete Prozess wird OMP_CANCELLATION ordnungsgemäß eingestellt, bevor es startet.

1

Es ist nicht möglich, da gemäß der standard (Chapter 4):

Änderungen der Umgebungsvariablen, nachdem das Programm gestartet wurde, auch wenn sich durch das Programm geändert, durch die OpenMP Implementierung ignoriert werden. Die Einstellungen einiger ICVs können jedoch während der Ausführung des OpenMP-Programms durch Verwendung der entsprechenden Anweisungsklauseln oder OpenMP-API-Routinen geändert werden.

Keine solche Art und Weise, den Wert von Abbrechen-var angegeben (2.3.3) zu modifizieren.

Sie können dieses Problem lösen, indem Sie ein Wrapper-Programm/-Skript schreiben.

Einige Implementierungen könnten Möglichkeiten bieten, den Wert unabhängig vom Standard zu ändern. Aber darauf angewiesen zu sein, wäre nicht tragbar.