Faust2011 schrieb:
@Nai: bitte nicht mehr von Transaktionen sprechen. Dieses Wort ist mMn deplatziert. Es bezeichnet einfach die kleinste Menge an Daten, die man aus einem Speicherfeld auslesen kann.
Faust2011, Nai hat da aber den richtigen Begriff verwendet. Im Zusammenhang mit CUDA spricht auch Nvidia (und ich^^) von Transaktion(en) oder im englischen eben von Transaction(s).
Global memory access of 32, 64, or 128-bit words by a half-warp of threads can result in as few as one (or two) transaction(s) if certain access requirements are met
Ich glaube das ist der springende Punkt, wenn ich alles richtig verstanden habe. Es geht um die Wortlänge, mit der lesend auf den Global Memory (Device Memory) zugegriffen wird. Im Idealfall ist das ein 128-bit langer Zugriff (coalesced -> threads lesen nicht 'out of sequence' + nicht 'misaligned', also Zugriff an einer Adresse, mit einem ganzzahligen Teiler von 128-bit -> richtige Startadresse). Nur wenn man das so macht, bekommt man in CUDA die volle Bandbreite hin (strided Zugriff mit einem Offset > 1 verringern die effektive Bandbreite auch drastisch (bis auf unter 10%), aber: wenn man den Offset geschickt wählt, wird es besser).
Es gibt übrigens auch fette Unterschiede zwischen den ComputeCapabilities (also den GPU Gen`s), den die Cache Hierarchie wurde seit 1.0 stark umgebaut (zb Shared Memory ~ so schnell wie Register). Ab CC 1.2 können auch kleinere Transactions genutzt werden (32 B, 64 B, 128 B).
Wenn ich was testen soll, immer her mit dem Code
Sitze hier an CC 3.5 und nvcc aus CUDA 7.0.
Und zu HBM, ich würde hier wirklich keine vorschnellen "Rechnungen" machen. Und die Behauptung, dass HBM in einem wie auch immer gearteten "worst-case" Szenario langsamer als GDDR5 ist, muss ich auch erstmal anzweifeln. Bereits vom Aufbau und Anschluss würde ich eher das Gegenteil behaupten, dass HBM GDDR5 eigentlich immer überlegen sein wird.
Ach ja und eines noch: Es heisst nicht umsonst GPGPU. Die heute aktuellen Aufbauten (Maxwell) sind auch verdammt gut für Probleme geeignet, die eben nicht
nur thread-parallel ausgeführt werden ("SIMD" / "SIMT"). Auch branching läuft mit den Caches und dem GPU Aufbau verhältnismäßig "gut" (klar CPUs sind hier besser, wenn der Programmablauf nur noch *wenig* parallelen Anteil hat, kommt halt auf das genaue Problem an. Oder man nimmt dafür gleich die Vektorinstruktionen in der CPU).
Irgendwo hat auch wer geschrieben, dass es Unified Memory noch nicht gibt. Nur mal so, das gibt es bereits und nvcc kann mit entsprechenden Programmcodes bereits umgehen.
Egal ob nun R9 oder Pascal, so viel schneller Speicher auf dem Chip wird bei GPUs den fettesten Performancesprung der letzten Jahre bringen. Da bin ich mir sicher.