2016-08-03 7 views
0

ich einen bestimmten Teil eines großen Programms zu beschleunigen versuchen, die Ausnahmebehandlung auf hohem Niveau durchgeführt wird, ursprünglich sieht der Code wieWurf std :: runtime_error innerhalb OpenMP Region stürzt das Programm

for(....) 
{ 
... 
    if(...) 
    { 
    throw std:: runtime_error("Terminated by user") 
    } 
} 

Jetzt ich habe es etwas geändert wie

#pragma omp parallel for ... 
for(....) 
{ 
... 
    if(...) 
    { 
    throw std:: runtime_error("Terminated by user") 
    } 
} 

Und jetzt, wenn Kündigung ausgelöst wird, stürzt das Programm ab, ich diese Ausnahme erwarten hier Handhabung kann ohne Änderung der höheren Ebene Sachen auf elegante Weise getan werden?

+0

Mögliches Duplikat von [Elegantes Ausnahmehandling in OpenMP] (http://stackoverflow.com/questions/11828539/elegant-exceptionhandling-in-openmp) –

Antwort

2

Die OpenMP specification Aufträge, die von einem Thread geworfen Ausnahmen von demselben Thread und innerhalb desselben parallel Bereich (Abschnitt 2.5, S. 49). Behandelt werden müssen:

A throw ausgeführt in einem parallel Region muss verursachen Ausführung innerhalb derselben Region parallel fortzusetzen, und derselbe Thread, der die Ausnahme ausgelöst hat, muss sie abfangen.

Compiler wie GCC diese Forderung durchzusetzen, indem den Code des parallelen Bereichs mit einer Umhüllungs allumfassenden dazu ähnliches Konstrukt:

try 
{ 
    ... 
} 
catch 
{ 
    terminate(); 
} 

Somit jede Ausnahme, die das Ende der parallel Region uncaught erreicht bewirkt, dass das Programm abgebrochen wird.

Die Regel ist tatsächlich strenger als es gilt auch für OpenMP Konstrukte wie for, critical, single usw. Eine Ausnahme innerhalb eines solchen Konstrukts geworfen muss, dass sie warf innerhalb des gleichen Konstrukts und durch den Faden aufgefangen werden. In Ihrem Fall ist es das Konstrukt for, das zur Beendigung führt, da sein impliziter Catch-All-Handler vor dem impliziten Catch-All-Handler der Region parallel erreicht wird.

+0

Also muss ich diese Ausnahme innerhalb Pragma fangen und auf höhere Ebene propagieren ? – lorniper

+0

Ja, Sie können es mit einem expliziten try/catch-Block machen oder sich einen eleganteren Ansatz vorstellen, wie er in der Frage von Adri C.S. –

Verwandte Themen