Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
mathias hat geschrieben:
Zitat:
Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.
Ich dachte es lege daran, das ich Real anstelle single verwendete, aber dies hatte keine grossen Unterschied gemacht.
Ist die GPU so viel schneller als der Mathe-Teil der CPU ? Oderr läuft da etwa etwas anders. ?
Naja wenn man mal von herstellerspezifischen Kram, wie etwa die verwendeten Datentypen, absieht, dann hast du bei der GPU zwei große Vorteile: - Du kannst mehr Sachen gleichzeitig machen. - Du hast in der Regel schnelleren Speicher.
Dadurch kann der jeweilige Compiler halt auch ganz anderen Output erzeugen. Deine Schleife könnte zum Beispiel X mal gleichzeitig durchlaufen, wohingegen auf der CPU alles nacheinander passiert. Außerdem musst du auch noch Bedenken das die GPU im Prinzip eine rein funktionale Geschichte ist und Pascal eben Imperativ. Sprich du hast eigentlich gar keine Variablen sondern nur Parameter.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.
Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).
Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Lord Horazont hat geschrieben:
yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.
Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).
Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).
viele Grüße, Horazont
Das kommt ganz darauf an was man darunter Versteht. Ich habe hier jetzt keine aktuellen Zahlen im Kopf, es kann also mittlerweile auch schneller sein.
Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.
Beim Off-Chip Speicher gibt es in Cuda 3 verschiedene Arten: - Global, kann sowohl von der GPU als auch der CPU angefasst werden und ist somit die langsamste Variante. Ausserdem kommt hier noch der jeweilige Anschluss, also z.B. PCIe, als Bottleneck hinzu. - Constant oder Texture, ist Read-Only Speicher und damit sehr speziell. Der einzige Vorteil gegenueber den globalen Speicher ist halt das man in der Regel weniger Bandbreite braucht. - Local, wird von den Threads fuer automatische Array Variablen benutzt. Dabei handelt es sich aber lediglich um Spezielle Form von Globalen Speicher die nur geringfuegig schneller ist. Also auch wieder eher ne reine Optimierung statt echten Vorteil.
Beim On-Chip Speicher gibt es nun 2 verschiedene Arten unter Cuda: - Register, speichern im Gegensatz zur CPU ALLE automatischen Variablen bis auf Arrays. Das ist aber eher ein Vorteil der durch die schon angesprochene Funktionale Architektur entsteht als ein tatsaechlicher Unterschied. - Shared und L1-Cache, besitzen jeweils eine Bank pro Thread. Soweit ich weiss arbeitet Cuda hier mit 64kb Einheiten pro Block die in 16kb Schritten auf Shared oder L1 (16+48, 32+32 oder 48 + 16) Verteilt werden. Das Maximum liegt hier bei insgesamt 32 Baenken pro Warp, 512/32 pro Block (also 16 Warps) und 2 Blocks pro Grid aber keine Ahnung ob das irgendeine GPU ausreizt.
Alles in Allen ist eine GPU also genau das gleiche wie ein moderner Intel. Der einzige Unterschied ist halt du mehr Threads hast die auf weniger Speicher zugreifen und deine Variablen an sich in schnelleren Speicher landen.
Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.
Ich dachte, das bisschen Quellcode ist im schnellen L1-Cache der CPU.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
@mathias: Auf Cache kannst du dich nicht mehr wirklich verlassen, sobald Multitasking im Spiel ist. Den teilst du dir ja mit anderen Programmen und dem Kernel.
Die Parallelität der GPU ist aber auf jeden Fall etwas, was so bei per-Pixel-Code extrem viel Performance rausholt. Einfach weil da zig Threads gleichzeitig dran rechnen, während auf der CPU bei naiver implementierung nur /ein/ Thread dran rechnet.
grüße Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.