Heb jij een moderne videokaart en een pc die 10 seconden beschikbaar is? help dan mee!
First off, er is toestemming voor dit topic, op basis van het feit dat er discussiewaarde kleeft aan het volgende issue;
Ik ben werkzaam bij een bedrijf dat de kracht van moderne commercieel verkrijgbare videokaarten inzet om beeldbewerkingen voor de TV-industrie te kunnen verrichten. Wij hebben hiervoor eigenlijk altijd Nvidia kaarten gebruikt, maar bij de overstap van Nvidia naar de Fermi architectuur liepen wij tegen een probleem aan.
Wij gebruiken OpenGL voor onze grafische transformaties hetgeen ons platform-onafhankelijk maakt en goede performance geeft. Als er data van de GPU naar de host verscheept moet worden gebruiken wij de glReadPixels call.
En daar gaat het bij de Fermi architectuur opeens mis. Waar wij met de Nvidia GTX 285 goede performance wisten te halen, zien we bij modernere kaarten als de 450, 470 ... 580 ineens achteruitgang in prestaties!
Na een kort onderzoek bleek al snel dat meerdere mensen hier last van hadden bij de nieuwe kaarten en er gaat zelfs al een gerucht dat Nvidia bewust de commerciele kaarten geknepen heeft om hun professionele kaarten bestaansrecht te geven...
Games hebben relatief weinig data nodig VAN de GPU en zijn eigenlijk vooral bezig met data NAAR de GPU te sturen. Hierdoor kan het dus dat spellen geen hinder ondervinden van deze prestatie vermindering. Echter, nu de 2xx serie niet meer te verkrijgen is moet ik een antwoord formuleren op de vraag welke videokaart we nodig hebben voor onze producten.
Een vraag die niet zo simpel te beantwoorden blijkt. Het blijkt namelijk dat het mogelijk is om de geknepen performance te omzeilen door een API als OpenCL of CUDA te gebruiken.
Mensen met enige kennis over deze APIs zullen weten dat zowel CUDA als OpenCL over bandwidth tests beschikt en het dus niet moeilijk zou moeten zijn om de snelste kaart uit te zoeken.
Wat echter gebleken is, is dat de performance behoorlijk beinvloed wordt wanneer OpenGL wordt gebruikt om de data te genereren.
Daarom heb ik een test gemaakt die mijn daadwerkelijke scenario zo dicht mogelijk benaderd.
De test:
1 - maak een OpenGL venster zonder v-sync
2 - maak een PBO en een FBO
3 - schrijf naar de FBO
4 - download dmv. een van de mogelijke methoden
5 - gebruik de FBO als texture en teken deze op het scherm
6 - swap buffers
Waarnaar stap 3 tm 6 zich 50x herhalen en stap 4 getimed wordt. Qua timing wordt de mediaan hiervan genomen en deze wordt weggeschreven naar een output file.
De gebruikte methoden zijn als volgt:
a - OpenGL ( glReadPixels )
b - CUDA ( cudaMemcpy2D )
c - CUDA pinned ( cudaMemcpy2D naar speciaal gealloceerd geheugen )
d - OpenCL ( clEnqueueReadBuffer )
e - OpenCL pinned ( clEnqueueReadBuffer naar speciaal gealloceerd geheugen )
f - de controle test, een memset op een block data
De volgende data wordt verzameld en weggeschreven naar een result file in de executable's directory.
Hostname ; GPU vendor ; GPU naam ; test a ; test b ; test c ; test d ; test e ; test f ;
( deze file heet result_<timestamp>.csv )
Mocht je willen meedoen maar wil je niet je hostname delen met de wereld staat het je natuurlijk vrij deze handmatig aan te passen naar je nick of gewoon leeg te laten alvorens het bestand te uploaden.
LET OP: gebruik hiervoor een plain-text editor zoals notepad! als je Excel of dergelijke gebruikt kunnen de resultaten aangepast ( onbruikbaar ) worden!
De executable vind je hier: GOT_OpenGL_benchmark.zip ( ~380KB )
user: anoftp, pass: anoftp
Het resultaat mag je hier uploaden: ftp://ftp.vidigo.tv
user: tweakers, pass: bench
De test runnen stelt niet veel voor, je download de zip file, pakt deze uit en draait de executable. Er verschijnt een schermpje met wat gekleurde vlakjes en als deze weer weggaat blijft er een result_xxxxxx.csv bestand achter in de working directory. Dit bestand upload je naar bovenstaande ftp adres waar ik de resultaten verzamel en in dit topic post.
alvast bedankt!
Resultaten ( worden voortdurend geupdate )
http://houbenweb.nl/got_results.html
First off, er is toestemming voor dit topic, op basis van het feit dat er discussiewaarde kleeft aan het volgende issue;
Ik ben werkzaam bij een bedrijf dat de kracht van moderne commercieel verkrijgbare videokaarten inzet om beeldbewerkingen voor de TV-industrie te kunnen verrichten. Wij hebben hiervoor eigenlijk altijd Nvidia kaarten gebruikt, maar bij de overstap van Nvidia naar de Fermi architectuur liepen wij tegen een probleem aan.
Wij gebruiken OpenGL voor onze grafische transformaties hetgeen ons platform-onafhankelijk maakt en goede performance geeft. Als er data van de GPU naar de host verscheept moet worden gebruiken wij de glReadPixels call.
En daar gaat het bij de Fermi architectuur opeens mis. Waar wij met de Nvidia GTX 285 goede performance wisten te halen, zien we bij modernere kaarten als de 450, 470 ... 580 ineens achteruitgang in prestaties!
Na een kort onderzoek bleek al snel dat meerdere mensen hier last van hadden bij de nieuwe kaarten en er gaat zelfs al een gerucht dat Nvidia bewust de commerciele kaarten geknepen heeft om hun professionele kaarten bestaansrecht te geven...
Games hebben relatief weinig data nodig VAN de GPU en zijn eigenlijk vooral bezig met data NAAR de GPU te sturen. Hierdoor kan het dus dat spellen geen hinder ondervinden van deze prestatie vermindering. Echter, nu de 2xx serie niet meer te verkrijgen is moet ik een antwoord formuleren op de vraag welke videokaart we nodig hebben voor onze producten.
Een vraag die niet zo simpel te beantwoorden blijkt. Het blijkt namelijk dat het mogelijk is om de geknepen performance te omzeilen door een API als OpenCL of CUDA te gebruiken.
Mensen met enige kennis over deze APIs zullen weten dat zowel CUDA als OpenCL over bandwidth tests beschikt en het dus niet moeilijk zou moeten zijn om de snelste kaart uit te zoeken.
Wat echter gebleken is, is dat de performance behoorlijk beinvloed wordt wanneer OpenGL wordt gebruikt om de data te genereren.
Daarom heb ik een test gemaakt die mijn daadwerkelijke scenario zo dicht mogelijk benaderd.
De test:
1 - maak een OpenGL venster zonder v-sync
2 - maak een PBO en een FBO
3 - schrijf naar de FBO
4 - download dmv. een van de mogelijke methoden
5 - gebruik de FBO als texture en teken deze op het scherm
6 - swap buffers
Waarnaar stap 3 tm 6 zich 50x herhalen en stap 4 getimed wordt. Qua timing wordt de mediaan hiervan genomen en deze wordt weggeschreven naar een output file.
De gebruikte methoden zijn als volgt:
a - OpenGL ( glReadPixels )
b - CUDA ( cudaMemcpy2D )
c - CUDA pinned ( cudaMemcpy2D naar speciaal gealloceerd geheugen )
d - OpenCL ( clEnqueueReadBuffer )
e - OpenCL pinned ( clEnqueueReadBuffer naar speciaal gealloceerd geheugen )
f - de controle test, een memset op een block data
De volgende data wordt verzameld en weggeschreven naar een result file in de executable's directory.
Hostname ; GPU vendor ; GPU naam ; test a ; test b ; test c ; test d ; test e ; test f ;
( deze file heet result_<timestamp>.csv )
Mocht je willen meedoen maar wil je niet je hostname delen met de wereld staat het je natuurlijk vrij deze handmatig aan te passen naar je nick of gewoon leeg te laten alvorens het bestand te uploaden.
LET OP: gebruik hiervoor een plain-text editor zoals notepad! als je Excel of dergelijke gebruikt kunnen de resultaten aangepast ( onbruikbaar ) worden!
De executable vind je hier: GOT_OpenGL_benchmark.zip ( ~380KB )
user: anoftp, pass: anoftp
Het resultaat mag je hier uploaden: ftp://ftp.vidigo.tv
user: tweakers, pass: bench
De test runnen stelt niet veel voor, je download de zip file, pakt deze uit en draait de executable. Er verschijnt een schermpje met wat gekleurde vlakjes en als deze weer weggaat blijft er een result_xxxxxx.csv bestand achter in de working directory. Dit bestand upload je naar bovenstaande ftp adres waar ik de resultaten verzamel en in dit topic post.
alvast bedankt!
Resultaten ( worden voortdurend geupdate )
http://houbenweb.nl/got_results.html
[ Voor 3% gewijzigd door Arjan op 04-08-2011 11:11 ]
oprecht vertrouwen wordt nooit geschaad