OpenACC



  • Hey,

    ich bin heute zufällig auf OpenACC gestolpert und fand es echt ganz interessant. Da stecken auch ziemlich große Investoren hinter.

    Aber wo genau liegen die Vorteile? Kann ich so meinen normalen C, C++ oder Fortran Code mit den wenigen Befehlen einfach auf CPU und GPU verteilen? Woher weiß der Compiler, dass der eine Code z.B. auf der GPU besser läuft oder gibt man das bei den Pragmas mit an?

    Dann noch eine weitere Frage zu den Bibliotheken - wie kann ich z.B. Bibliotheken wie Blas/Lapack auf der GPU nutzen? Werden dort die CUDA-Bibliotheken für eingebunden?

    Ich würde mich auch allgemein über ein paar mehr Informationen freuen, da das Internet noch nicht so viel hergibt. Gibt es schon Literatur (in Form von Büchern) dazu?


  • Mod

    SLx64 schrieb:

    Ich würde mich auch allgemein über ein paar mehr Informationen freuen, da das Internet noch nicht so viel hergibt. Gibt es schon Literatur (in Form von Büchern) dazu?

    Red doch keinen Quatsch. Hier:

    Woher weiß der Compiler, dass der eine Code z.B. auf der GPU besser läuft oder gibt man das bei den Pragmas mit an?

    http://en.wikipedia.org/wiki/OpenACC (zweiter Absatz)

    Dann noch eine weitere Frage zu den Bibliotheken - wie kann ich z.B. Bibliotheken wie Blas/Lapack auf der GPU nutzen?

    Erst einmal Begriffserklärung, da du Blas/Lapack als Bibliotheken bezeichnest:
    http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
    http://en.wikipedia.org/wiki/LAPACK
    Mit diesem Wissen: Google: lapack gpu und Google: blas gpu

    War das wirklich so schwer? Sind Google und Wikipedia so obskur? Du scheinst die Begriffe zu denen du Fragen stellst noch nicht einmal gegoogelt zu haben, da du sie falsch benutzt und auch noch Fragen dazu stellst, die quasi in der Begriffsdefinition bereits beantwortet werden. Wenn du noch echte Fragen hast, dann kannst du sie gerne stellen.



  • SeppJ schrieb:

    Red doch keinen Quatsch. Hier:
    http://en.wikipedia.org/wiki/OpenACC (zweiter Absatz)

    Ich hab den Artikel vorher gelesen aber so viel gibt der nicht gerade her. Aus dem zweiten Absatz geht nur hervor, dass ich ihn verteilen kann aber nicht ob er von alleine erkennt, dass er z.B. auf der Grafikkarte besser läuft oder ich explizit angeben muss, was er tun soll.

    SeppJ schrieb:

    Erst einmal Begriffserklärung, da du Blas/Lapack als Bibliotheken bezeichnest:
    http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
    http://en.wikipedia.org/wiki/LAPACK

    Ich kenne auch diese beiden Wiki-Artikel und für mich sind das immer noch Programmbibliotheken 😕

    SeppJ schrieb:

    Mit diesem Wissen: Google: lapack gpu und Google: blas gpu

    Das habe ich vorher auch gegoogelt und ich weiß, dass es das für CUDA und OpenCL gibt aber es beantwortet nicht meine Frage ob ich diese nutzen muss oder Funktionen parallelisiert und dann dort ausgeführt werden.

    Das sind reine Verständnisfragen, die mir der Wiki-Artikel nicht beantwortet. Deswegen frage ich hier. 😉


  • Mod

    SLx64 schrieb:

    SeppJ schrieb:

    Red doch keinen Quatsch. Hier:
    http://en.wikipedia.org/wiki/OpenACC (zweiter Absatz)

    Ich hab den Artikel vorher gelesen aber so viel gibt der nicht gerade her. Aus dem zweiten Absatz geht nur hervor, dass ich ihn verteilen kann aber nicht ob er von alleine erkennt, dass er z.B. auf der Grafikkarte besser läuft oder ich explizit angeben muss, was er tun soll.

    Like in OpenMP, the programmer can annotate C, C++ and Fortran source code to identify the areas that should be accelerated using compiler directives and additional functions.[2]

    Was lässt dies am Ablauf unklar? Oder wenn noch etwas unklar ist, wird dies doch beispielsweise in den weiterführenden Links ganz genau am Beispiel erklärt.

    SeppJ schrieb:

    Erst einmal Begriffserklärung, da du Blas/Lapack als Bibliotheken bezeichnest:
    http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
    http://en.wikipedia.org/wiki/LAPACK

    Ich kenne auch diese beiden Wiki-Artikel und für mich sind das immer noch Programmbibliotheken 😕

    Es sind APIs, also Schnittstellen, die von einer konkreten Bibliothek implementiert werden. (Ok, LAPACK ist historisch gesehen eine Bibliothek, aber der Begriff wird mittlerweile benutzt, als wäre es eine API). Demzufolge brauchst du eine Implementierung dieser Schnittstellen für die GPU.

    es beantwortet nicht meine Frage ob ich diese nutzen muss oder Funktionen parallelisiert und dann dort ausgeführt werden.

    Um sie zu benutzen, musst du sie benutzen. 😕 Oder was meinst du mit "sie" und "dort"?



  • SeppJ schrieb:

    Um sie zu benutzen, musst du sie benutzen. 😕 Oder was meinst du mit "sie" und "dort"?

    Naja ob sowas hier möglich wäre:

    funktion(){...}
    ...
    #OpenACC
    <--
    funktion() 
    -->
    

    oder nur sowas:

    funktion(){
    #OpenACC
    <--
    ...
    -->
    }
    

    Also ob es nur funktioniert, wenn die Parallelisierung innerhalb der Funktion erfolgt.


  • Mod

    Ich dachte dieser Teil deiner Fragen bezöge sich auf BLAS und LAPACK 😕 .

    Parallelisierte Funktionsaufrufe müssen normalerweise transparent sein, d.h. der Parallelisierer muss den Inhalt der Funktion kennen. OpenACC wird da sicherlich keine Ausnahme sein.

    PS: Ganz sicher sogar, denn es gibt extra die acc device Direktive, mit der man eine Funktion so übersetzen lassen kann, dass sie dann später mit anderen Direktiven parallel aufgerufen werden kann.
    PPS: Ich habe von OpenACC das erste Mal gehört, als du deine erste Frage gestellt hast und ich neugierig war, was das wohl ist. Seither habe ich insgesamt nicht mehr als 5 Minuten gebraucht, um alle deine Fragen zu beantworten (+Zeit zum Tippen). Eigeninitiative? Diese Fragen sind alle simpelst googelbar!



  • SeppJ schrieb:

    Ich dachte dieser Teil deiner Fragen bezöge sich auf BLAS und LAPACK 😕 .

    Nein das war nur ein Beispiel. Mir ist kein besseres eingefallen. Es ging mir darum, ob ich die Funktion parallelisieren kann, wenn ich sie aus der Bibliothek aufrufe.

    SeppJ schrieb:

    Parallelisierte Funktionsaufrufe müssen normalerweise transparent sein, d.h. der Parallelisierer muss den Inhalt der Funktion kennen. OpenACC wird da sicherlich keine Ausnahme sein.

    PS: Ganz sicher sogar, denn es gibt extra die acc device Direktive, mit der man eine Funktion so übersetzen lassen kann, dass sie dann später mit anderen Direktiven parallel aufgerufen werden kann.

    Danke, das beantwortet doch meine Frage.

    SeppJ schrieb:

    PPS: Ich habe von OpenACC das erste Mal gehört, als du deine erste Frage gestellt hast und ich neugierig war, was das wohl ist. Seither habe ich insgesamt nicht mehr als 5 Minuten gebraucht, um alle deine Fragen zu beantworten (+Zeit zum Tippen). Eigeninitiative? Diese Fragen sind alle simpelst googelbar!

    Natürlich sind diese Fragen einfach zu googlen, was ich auch getan habe aber ob die Antworten zu meinem Verständnis beitragen ist eine andere Sache. Deswegen frag ich hier noch einmal nach, ob es mir jemand besser erläutern kann.

    Außerdem wollte ich etwas darüber diskutieren. An einigen Stellen wird es als das neue Wunder hervorgehoben und an anderen Stellen als nicht hilfreich dargestellt.


  • Mod

    SLx64 schrieb:

    Danke, das beantwortet doch meine Frage.

    Das mag vielleicht so sein, aber nur weil du die falsche Frage (aka eine "dumme" Frage) gestellt hast. Denn wenn es darum geht, wie du BLAS oder LAPACK beschleunigst, dann hilft dir diese Antwort überhaupt nicht weiter.



  • SeppJ schrieb:

    Denn wenn es darum geht, wie du BLAS oder LAPACK beschleunigst, dann hilft dir diese Antwort überhaupt nicht weiter.

    Darum ging es aber nicht 😉


Anmelden zum Antworten