OpenMP Problem mit shared



  • Hallo zusammen,

    ich habe ungefähr diesen Code:

    #pragma omp parallel num_threads(8) default(shared)
    {
        try
        {
    
        }
        catch(const oracle::occi::SQLException& ooex)
        {
    
        }
    }
    

    Der Code funktioniert soweit auch ganz gut. Ich möchte aber nun zur Empfehlung übergehen, alles was shared ist, explizit anzugeben.

    #pragma omp parallel num_threads(8) default(none) shared(...)
    {
        try
        {
    
        }
        catch(const oracle::occi::SQLException& ooex)
        {
    
        }
    }
    

    Und fängt mein Problem an. Ich habe ein paar Variablen über shared angegeben und das klappt auch soweit ganz gut. Allerdings bekomme ich im catch Block Probleme mit der SQLException.

    "Fehler C3052 "ooex": Die Variable wird in einer Datenfreigabeklausel nicht unter einer default(none)-Klausel angezeigt."

    Darauf hin habe ich die "oracle::occi::SQLException" ebenfalls mit aufgenommen.

    Daraufhin kommt dann die folgende Fehlermeldung:

    "Fehler C3028 "oracle::occi::SQLException": Nur eine Variable oder ein statischer Datenmember kann in einer Datenfreigabeklausel verwendet werden."

    Ich stehe etwas auf dem Schlauch...was will dieses dämliche Ding jetzt von mir?!



  • Das sagt doch die Fehlermeldung. Du musst eine Variable angeben die shared ist, nicht den typen, du schreibst ja bei

    int foo;
    

    die variable rein

    shared(foo)
    

    und nicht

    shared(int)
    


  • Ich wüsste jetzt nicht wie das gehen sollte ooex hier zu sharen.
    Da der catch Block innerhalb des omp parallel Scopes ist, kann das IMO nicht gehen. D.h. jeder Thread kann eigenständig in das catch rein und muss daher auch ne eigene ooex Variable haben.

    Kann aber auch sein dass ich omp parallel falsch verstanden habe. Wäre kein Wunder, ich hab's auch noch nie irgendwo verwendet 😉

    ps: Es sollte aber auch nicht nötig sein ooex hier zu sharen.

    ps2: Scheint ein MSVC Bug zu sein:
    https://godbolt.org/g/ifAYXw



  • Moin,

    besten Dank für die Antworten.

    @rapso: So weit war ich natürlich auch schon:-D Aber wie von hustbaer schon beschrieben, kann ich diese nicht sharen. Vielleicht eine kleine Info: Ich musste ernsthaft, weil ich auch std::string benutze, in den shared(std::string) angeben. Das schien mir zwar irgendwie nicht logisch aber danach funktionierte es jedenfalls mit std::string.

    @hustbaer: Erstmal: was ist das denn für ne geile Seite?! Die ist ja mal sehr hilfreich! Ich glaube die wird bei mir noch öfters ihren Zweck erfüllen.

    Hmm...dann werde ich gleich mal ein Ticket bei denen auf machen:-(



  • BlaBlaBlaBla schrieb:

    @hustbaer: Erstmal: was ist das denn für ne geile Seite?! Die ist ja mal sehr hilfreich! Ich glaube die wird bei mir noch öfters ihren Zweck erfüllen.

    Ja, godbolt.org ist cool.
    Gibt seit kurzem Anfang des Jahres übrigens nen Patreon dafür, falls es jmd. unterstützen will: https://xania.org/201701/compiler-explorer-is-now-on-patreon



  • BlaBlaBlaBla schrieb:

    @rapso: So weit war ich natürlich auch schon:-D

    das klang mir als ob du komplett nicht wustest was los ist

    Ich stehe etwas auf dem Schlauch...was will dieses dämliche Ding jetzt von mir?!

    exception an sich sind nicht gern gesehen im parallelen code. Eine lokale variable innerhalb des parallel blocks wird normalerweise auch nicht geshared, die sollte private sein. falls du willst dass nur ein thread zur gleichen zeit eine exception abarbeitet, musst du eine critical section einbauen, sowas wie

    catch(const oracle::occi::SQLException& ooex)
        {
             #pragma omp critical
            {
                 ...
            } 
        }
    


  • Moin,

    diesbezüglich gibt es Neuigkeiten. Es ist in der Tat ein Bug. Laut dem Microsoft Compiler Team ist es ein Fehler im Front end Compiler, welcher bereits in der Preview der Visual Studios 2017 15.5 Prev 3 behoben wurde. Ich selbst kann es noch nicht bestätigen, da ich keine Lust habe auf meiner Entwicklermaschine eine Preview zu installieren. Ich warte also das Release ab und dann mal sehen.


Anmelden zum Antworten