# GPU Benchmark C#?



## Headshot-97 (28. Dezember 2010)

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 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

Greetz


----------



## Skysnake (29. Dezember 2010)

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


----------



## bingo88 (29. Dezember 2010)

Headshot-97 schrieb:


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


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 ^^


----------



## Skysnake (29. Dezember 2010)

Naja, ich find OpenCL in C/C++ einfacher  Die ganze Doku setzt halt darauf auf. Für C# hab ich den Einstieg irgendwie unlogisch gefunden. 

Thysol hat damit aber angefangen und war recht zufrieden soweit ich das mitbekommen hab.


----------



## bingo88 (29. Dezember 2010)

Ja genau, der wars ^^. @TE: Evtl. fragst du mal bei thysol nach, der kann dir da sicher weiterhelfen


----------



## Skysnake (29. Dezember 2010)

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.


----------



## Fragile Heart (29. Dezember 2010)

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.


----------



## Headshot-97 (29. Dezember 2010)

bingo88 schrieb:


> Naja, Speicher allozieren und rumkopieren? Große Arrays oder sowas...


?  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


----------



## Skysnake (29. Dezember 2010)

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.


----------



## Fragile Heart (29. Dezember 2010)

@Headshot
Kannst du denn mal hier posten? Wäre mal interessant zu sehen was du da genau machst.


----------



## Headshot-97 (29. Dezember 2010)

bingo88 schrieb:


> Naja, Speicher allozieren und rumkopieren? Große Arrays ..


Kansste mir des mal erklären oder hasste ein beispiel ?


----------



## Skysnake (29. Dezember 2010)

Fragile Heart schrieb:


> @Headshot
> Kannst du denn mal hier posten? Wäre mal interessant zu sehen was du da genau machst.



Ich kann meinen Code mal die Tage hochladen, wobei ich den etwas cleanen muss 

Hab in dem 4 Wochen rumgepfuscht, von 0 Peilung angefangen bis hin zum fertigen Test.

Eine Version davon geistert aber hier durch das Forum.


----------



## Fragile Heart (29. Dezember 2010)

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.


----------



## Skysnake (29. Dezember 2010)

Und dir erstmal nen riesen Kopf drum machen, wie du den I/O auf den GPU-Ram minimierst 

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 (29. Dezember 2010)

Wenn es einfach wäre, dann würden wir uns doch auch zu schnell langweilen oder meinst du nicht?


----------



## Headshot-97 (29. Dezember 2010)

@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


----------



## Skysnake (29. Dezember 2010)

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  so 1k Seiten Doku lesen macht echt Spaß  Vorallem wenn nVidia meint sich nicht an die offiziellen OpenCL Begriffe in ihrer Doku halten zu müssen  GANZ lustig sag ich dir. Da gibts tolle verwechslungen und planlosigkeit, wenn die gleichen Namen unterschiedliche bedeutungen haben bei OpenCL und nVidias OpenCL Doku...


----------



## Headshot-97 (29. Dezember 2010)

@Skysnake weißt du wie man den ram auslastet (ein bsp wäre dann ganz nett)
greetz


----------



## Skysnake (29. Dezember 2010)

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.


----------



## thysol (29. Dezember 2010)

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.


----------



## Headshot-97 (29. Dezember 2010)

Skysnake schrieb:


> 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.
> 
> ...



Nein Nein ich meine Arbeitspeicher Benchen ! du hast mal was geschrieben wie das gehen soll das hab ich aber net verstanden


----------



## Skysnake (29. Dezember 2010)

naja, steht doch da.

Mit CPU RAM mein ich den ganz normalen RAM  Also einfach das machen was ich geschrieben hab fertig.


----------



## Headshot-97 (29. Dezember 2010)

kannste mir den 2ten satz mal umformulieren ich versteh ihn net so ganz ich erstelle ein 1d array und dann sry
greetz


----------



## Skysnake (29. Dezember 2010)

int array=new int [großeZahl];
for(intj=0; i<irgendeineZahl; j++{
   for(int i=0; i<großeZahl; i++){
      array_=array;
   }
}

und dazwischen misste die Zeit.

statt array=array, bei dem du eigentlich nur die RAM Leistung dir anschaust, kannste auch array=array*1; machen Da bekommste dann noch etwas CPU Last dazu. 

Oder array*array+array;

solche Spielereien eben._


----------



## Headshot-97 (30. Dezember 2010)

thx läuft perfekt


----------

