GPGPU Spezifikationen, bzw CUDA etc

  • Da der eine oder andere hier eine high-end Graka verbaut hat die CUDA, OpenCL etc. kann, hat sich vielleicht schon jemand mit general purpose berechnungen auf der Grafikkarte befasst.


    Ich bastle momentan an einem Projekt bei dem ich mir nicht sicher bin ob sich das Auslagern gewisser Berechnungen auf die Grafikkarte lohnen würde, da sich die Berechnungen nur widerspenstig parallelisieren lassen. Daher versuche ich nun abzuschätzen ob sich das lohnen könnte.
    Ich habe noch keine Erfahrungen mit der Programmiererei auf GraKas und frage daher, ob hier jemand eine gute Einführung ins Thema kennt? Ich kann C, C++, C# und VB programmieren. Mein primäres Interesse geht an die Datentypen, die Performance, sprich Latenz von Berechnungen, wie lange dauert eine Multiplikation, wie lange dauert eine Addition, etc. , kann ich einen uint64 erstellen, wie siehts mit Bitshifting aus, mit & | ^ und so weiter, wie stehts mit Latenz zum Speicher hin und her kopieren, Zugriff auf shared memory, private memory aus,...?
    Bevor hier jemand http://www.google.com postet, danke, das kenn ich ;)
    Ich suche eben nicht nur irgend eine Einführung, sondern eine Gute die ungefähr meine Interessen abdeckt, vielleicht kennt ja jemand so was. Dann muss ich mir nicht die Augen an 1'000 schlechten Artikeln fusselig lesen :D

  • Ich hab leider gerade nicht viel Zeit, aber folgende Inputs:


    - Wenn du C kannst, ist CUDA kein Problem für dich.
    - Wenn die Parallelisierung des Programms nicht so stark (oder einfach) ist, wenn du double-precicsion (oder meiner Vermutung nach auch uint64) benötigst, dann bringt CUDA (noch) keinen nennenswerten Speedup und die Zeit, um das Programm anzupassen, ist eher verschwendung.
    - CUDA kennt alle gängigen Datentypen inkl. uint64, aber nicht "nativ", intern wird da also getrickst. Das bedeutet, dass du entsprechend an Performance verlierst. (Speedup von 20-30 geht dann plötzlich runter auf kleine einstellige Zahlen).
    - CUDA ist tolles "learning by doing", auf der CUDA Page selbst gibt es sehr sehr viele Beispiele. Aber ich könnte dir jetzt keins nennen, das genau alle deine Fragen abdeckt :) Vielleicht taugt ja dieses Buch sogar was - aber auf jeden Fall fand ich die besten Ressourcen alle auf der CUDA-Page selbst.


    €: Die Jungs von CUDA selbst sind übrigens auch sehr hilfsbereit, falls du da richtige Probleme oder Unklarheiten antreffen solltest.

    Einmal editiert, zuletzt von GP ()

  • Meine Fragen konnte ich beantworten, indem ich hunderte Seiten auf der CUDA Homepage gelesen habe. Trotzdem danke für deine Antwort GP.


    Für alle die es interessiert:


    uint64 wird ab SM 2.0, das bezeichnet offensichtlich die Architektur oder so nativ unterstützt, sowie viele Atomic-Instructions, wie Bitoperationen And Or XOR, Min, Max, Increment, etc. das heisst, diese Berechnungen dauern dann nur noch einen Clock-Cycle, so wie ich das verstanden habe.
    Ergo ist meine GraKa mit SM 1.1 total ungeeignet für mein Projekt.
    Um Zeugs auf die GraKa zu laden, irgendwas ganz kleines zu berechnen und dann wieder zurück zu kopieren, muss man mit Millisekunden rechnen, behauptet auf jeden Fall ein Benchmark das mitgeliefert wird. Obwohl irgendwie kann man da was mit Streams machen, aber da hab ich mich noch nicht eingelesen.
    Additionen und Subtraktionen dauern 4 Clocks.
    Multiplikationen 8 Clocks.
    Zugriff auf shared Memory dauert so um die 300-400 Clocks, obwohl der Compiler die Zeit natürlich mit anderen Berechnungen versucht zu füllen, d.h. Zugriff so früh wie möglich und unabhängige Berechnungen zum Zeit füllen nutzen.
    Zu Bitshifting habe ich noch nichts gefunden.


    Fazit: Meine bisherige Idee lohnt sich nicht, allein das hin und her Kopieren dauert zu lange. Ich werde mir also einen neuen Ansatz ausdenken müssen.