GPU Benchmark C#?

Headshot-97

PC-Selbstbauer(in)
Hallo ich beschäftige mich seit einiger Zeit mit C# und habe auch schon ein CPU Benchmark Programm geschrieben welches unteranderem paralleles Threading und Multicore CPUs unterstützt ich habe so ziemlich alles damit gemacht nun muss was neues her GPU Benchmarking heisst die Devise nur leider hab ich keinen Plan:ugly: ich hab mir schon die Finger wund gegooglet aber nix ich hoffe ihr könnt mir helfen

P.S Wie kann man den RAM künstlich auslasten Ram benchen wäre doch auch cool:devil:

Greetz
 
OpenCL heist das Zauberwort.

Ich würd dir aber allgemein eher zu C/C++ raten, C# ist zwar ganz nett, wenn man aber wirklich Performance will, steigt man auf Fortran, C/C++ um, und Performance ist immer das Problem, wenn man mit GPUs arbeitet
 
P.S Wie kann man den RAM künstlich auslasten Ram benchen wäre doch auch cool:devil:
Naja, Speicher allozieren und rumkopieren? Große Arrays oder sowas...

Zum Thema GPU: Ich habe selber noch nicht mit C# in Kombination mit GPUs gearbeitet, aber durch ein anderes Forenmitglied ab und an schonmal was mit OpenCL + C# zu sehen bekommen. Vielleicht reicht dir das ja schon für Google. Es gibt wohl auch eine CUDA-Anbindung für .Net, aber da weiß ich leider überhaupt nichts zu, CUDA mache ich nur über C/C++

@skysnake: Zum Rumprobieren wird C# erstmal reichen ^^
 
Naja, ich find OpenCL in C/C++ einfacher :D Die ganze Doku setzt halt darauf auf. Für C# hab ich den Einstieg irgendwie unlogisch gefunden. :ka:

Thysol hat damit aber angefangen und war recht zufrieden soweit ich das mitbekommen hab.
 
Naja, C# ist meine Sache nicht. Damit nagelst dich halt auf Windows fest. Ja net gibts auch für Linux, aber darüber müssen wir nicht wirklich reden oder?..... Wenn dann Java, wenn man wirklich absolut auf portabilität steht.
 
Oh dieses Thema ist nicht besonders leicht. Neben der Wahl der Programmiersprache, ich persönlich mag C# gar nicht, ist auch noch die Wahl der Algos für den Test interessant. Ich hatte mir im Vorfeld der neuen ATI Karten mal Gedanken übersowas gemacht, aber keinen zufriedenstellenden Ansatz gefunden.
 
Naja, Speicher allozieren und rumkopieren? Große Arrays oder sowas...
? :huh: hast du evtl ein Beispiel

@Fragile Heart ich habe einen Algo der meinen CPU Intel T2300 für 40 sek (ohne parallelem Threading) oder 25 (mit parallelem Threading) auf Trab hält also wird die Graka ca um die 2-5 sek brauchen
 
Zuletzt bearbeitet:
Nein das kannst du so pauschal nicht sagen.

Es kann sogar sein, das du auf der GPU länger benötigst als mit der CPU.

z.B. Ich hab in der Uni was geschrieben um die Differenzen von Arrays zu berechnen. Waren 512x512x5000 Arrays. Auf der CPU hab ich insgesamt 52ms benötigt nur für die Berechnung der Differenz. Auf der GPU beim ersten Durchlauf (dort musste das Programm durch OpenCL zur Laufzeit compiliert werden, was das normale vorgehen ist, um die Portabilität zu bekommen) und danach dann 3,5ms pro Durchlauf auf der GPU. Tja das ist aber eben nur die halbe Miete. Die Daten müssen ja erstmal auf die GPU drauf und auch wieder runter.....

Tja und das waren 100ms fürs draufschieben und nochmal 100ms fürs runterschieben.
 
Ich hatte mir mal überlegt ob ich nicht eine Strömungssimulation zum Messenehme, diese müsste ich dann allerdings erst etwas vereinfachen und ein Messverfahren drumherum bauen.
 
Und dir erstmal nen riesen Kopf drum machen, wie du den I/O auf den GPU-Ram minimierst :D

Find das so ziemlich das schwerste an der ganzen GPU Programmiererei, weil du da halt die Leistung oft liegen lässt. Brauchst ja knapp 80 Tackte bis dein Lese/Schreib Zugriff auf den Ram durch ist. Die restliche Zeit musste mit Aufgaben auf den Caches füllen :/ Das garnet so einfach
 
@Fragile Heart sry war einkaufen hier ist er

.
.
.
ArrayList al = new ArrayList();
Parallel.For(0, 4000000, i =>
{
res += (Math.Sin(new Random().NextDouble()) * Math.Acos(new Random().NextDouble()));
});
al.Add("hello");
.
.
.

@ALL

ach ja ich glaue das mit der GPU lass ich mal aber Ram benchen würde ich gerne .
Vorschläge ?
Greetz
 
Naja, das mit der GPU ist eigentlich auch nicht schwer. Man muss sich halt "nur" durch die Doku etwas kämpfen, und nicht den Anspruch haben da die volle LEistung rauszukitzeln, weil das ist wirklich nicht trivial. Wenns nur laufen soll, isses eigentlich nicht schwer.

@Fragile:

Oh ja :ugly: so 1k Seiten Doku lesen macht echt Spaß :lol: Vorallem wenn nVidia meint sich nicht an die offiziellen OpenCL Begriffe in ihrer Doku halten zu müssen :wall: GANZ lustig sag ich dir. Da gibts tolle verwechslungen und planlosigkeit, wenn die gleichen Namen unterschiedliche bedeutungen haben bei OpenCL und nVidias OpenCL Doku...
 
GPU oder CPU?

CPu recht einfach, erstell einfach ein Array einer beliebigen Größe, und les dann die die du in ein zweites Array gleicher Größe schreibst. Und das machste als Loop, wobei du die Zeit misst. Fertig.

So misst du am Besten den Durchsatz etc, da du keine weiteren Opperationen von der CPU hast. Kannst das Gleiche natürlich dann auch noch mit MUL, ADD und MADD machen.

Wichtig ist halt nur ein 1D Array zu verwenden, weil dann alles schön zusammenhängend im Speicher liegt. Wenn du 2D arrays machst, dann liegen die Pointer auf die Zeilen zusammenhängend im Speicher, die einzelnen Zeilen dann aber nicht mehr! Die sind jeweils für sich zusammenhängend im RAM, aber mehrere Zeilen sind halt wild verstreut im RAM. Was dazu führt, das du prefetching etc nicht so gut ausnützen kannst und auch ansonsten mit Cachelines etc etc etc mehr Probleme bekommst, was die Performance drückt.
 
GPU Programmierung in OpenCL ist nicht so schwer wenn mann nicht unbedingt die Performance perfekt optimieren will. Wenn mann nur mit Daten Parallelen arbeiten will ist das kein Problem. Wenn mann in OpenCL aber mit Task Parallelen arbeiten will wirds komplizierter. Fuer OpenCL kann ich dieses Tutorial hier nur empfehlen:

Contents

Jetzt wisst ihr auch warum ich C# benutze.:D
 
Zurück