Ik ben geinteresseerd in het gebruiken van een GPU voor wetenschappelijke rekenklussen. Nou heb ik een programma wat jaren geleden door een collega is geschreven in C++. Ik zou deze code graag willen wijzigen zodat de berekeningen kunnen worden uitgevoerd op een Nvidia GPU. CUDA is de sdk waarmee code gecompiled kan worden zodat een geforce GPU er wat mee kan. Ik heb heel veel zitten zoeken met google, maar kan niks vinden over mogelijkheden om al bestaande code/programma's om te zetten naar code waarmee je GPU wordt aangesproken. Bestaat dit, of zit er niks anders op dan het hele programma opnieuw te schrijven in iets waar CUDA wat mee kan? Ik heb in de basis niet heel veel kennis van programmeren, maar het lijkt mij toch dat er conversie programma's moeten bestaan waarmee dit mogelijk is?
With all due respect, maar als je niet heel veel kennis van programmeren hebt dan is het omschrijven van software zodat het op een GPU kan draaien denk ik nog even wat (veel te) hoog gegrepen 
Een GPU werkt héél anders dan een CPU en je kunt dus niet 'zomaar effe' een conversieprogramma daar op los laten ofzo.
Een GPU werkt héél anders dan een CPU en je kunt dus niet 'zomaar effe' een conversieprogramma daar op los laten ofzo.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Een GPU is alleen krachtig als je hem op de juiste manier weet aan te spreken. En het is niet alsof je WinForms GUI op je GPU kan draaien 
Een CPU is een grote Amerikaanse vrachtwagen. Groot, en er zijn er maar één of twee van maar ze zijn snel en kunnen veel aan. De GPU zijn allemaal kleine Smarts die ernaast rijden, hoewel ze niet zo snel zijn, zijn ze in een veel groter aantal en kunnen ze als ze goed worden aangesproken bepaalde taken sneller doen. Kijk maar naar rendering.
Een CPU is een grote Amerikaanse vrachtwagen. Groot, en er zijn er maar één of twee van maar ze zijn snel en kunnen veel aan. De GPU zijn allemaal kleine Smarts die ernaast rijden, hoewel ze niet zo snel zijn, zijn ze in een veel groter aantal en kunnen ze als ze goed worden aangesproken bepaalde taken sneller doen. Kijk maar naar rendering.
[ Voor 55% gewijzigd door Sebazzz op 08-10-2008 17:43 ]
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
CUDA is op zich vrij simpel; het is net C. Maar het is wel parallel. Dus sequentiele C code omzetten naar parallelle CUDA/C code is niet triviaal.
Als je code zo is opgezet dat het efficient zou kunnen draaien op 1000+ lightweight threads, dan is het simpel. Render code is dat vaak: gewoon 1 thread per pixel en een miljoen pixels die je onafhankelijk kan berekenen.
CUDA kent ook meerdere soorten geheugen, zowel host (CPU/RAM) geheugen, als device (GPU) geheugen in de form van arrays en textures. Alles dat je nodig hebt in je programma moet je eerst memcpy-en van host naar device geheugen, en naar de variant die het meest efficient is (textures hebben een 2D cache bv). Vervolgens draai je een CUDA kernel, en moet je de resultaten weer terug kopieren naar de host. (Plus dat je tijdens de executie van je CUDA kernel weer van device globaal geheugen naar thread shared/local geheugen moet kopieren... het is allemaal even uitzoeken)
Dat allemaal om aan te geven dat het niet eenvoudig is om iets automatisch om te zetten. En zelfs handmatig zal het aardig wat werk zijn. Het is het wel vaak waard: speed-ups van 8-16x oid zijn haalbaar.
Als je code zo is opgezet dat het efficient zou kunnen draaien op 1000+ lightweight threads, dan is het simpel. Render code is dat vaak: gewoon 1 thread per pixel en een miljoen pixels die je onafhankelijk kan berekenen.
CUDA kent ook meerdere soorten geheugen, zowel host (CPU/RAM) geheugen, als device (GPU) geheugen in de form van arrays en textures. Alles dat je nodig hebt in je programma moet je eerst memcpy-en van host naar device geheugen, en naar de variant die het meest efficient is (textures hebben een 2D cache bv). Vervolgens draai je een CUDA kernel, en moet je de resultaten weer terug kopieren naar de host. (Plus dat je tijdens de executie van je CUDA kernel weer van device globaal geheugen naar thread shared/local geheugen moet kopieren... het is allemaal even uitzoeken)
Dat allemaal om aan te geven dat het niet eenvoudig is om iets automatisch om te zetten. En zelfs handmatig zal het aardig wat werk zijn. Het is het wel vaak waard: speed-ups van 8-16x oid zijn haalbaar.
[ Voor 96% gewijzigd door Zoijar op 08-10-2008 18:13 ]
Rekenen lukt overigens vrij goed, omdat de memory access voorspelbaar is. Je kunt de memory layout dus daarvoor optimaliseren, zie de CUDA SDK voor details. Graaf logica bijvoorbeeld is een stuk lastiger.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Bedankt voor de reacties. Zoals ik het begrijp is het niet zo makkelijk als ik had gehoopt
Ik had gehoopt dat er wel programma's waren die 'normale' C code konden omzetten naar CUDA, of emulatie software waarmee je je binaries kan draaien op de GPU ipv de CPU. Jammer maar helaas.. Die bestaande code ga ik denk ik niet omzetten, dat is veel teveel werk. Dan maar wat langer wachten op resultaat
Dat is opgenomen in de cuda compiler zelf. Die kan een multi-threaded CPU simulatie als output geven met de -deviceemu vlag.[J.d.I.] DirtyHarry schreef op vrijdag 10 oktober 2008 @ 08:52:
of emulatie software waarmee je je binaries kan draaien op de GPU ipv de CPU.
Sorry, las het verkeerd.
[ Voor 5% gewijzigd door Zoijar op 10-10-2008 12:03 ]
Als er emulatiecode was die x86 code sneller op de GPU zou draaien dan op de CPU, dan zou NVidia in de CPU business zitten. x86 code draait sowieso niet meer "native"; sinds de Pentium wordt x86 code intern vertaald naar een interne instructieset. Een GPU mist de dedicated hardware voor die "emulatie" en bovendien is de onderliggende instructieset niet geoptimaliseerd voor zo'n emulatie. De beweging is eerder de andere kant op: het gebruik van een multi-core CPU als GPU vervanger.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
LarrabeeMSalters schreef op vrijdag 10 oktober 2008 @ 13:01:
De beweging is eerder de andere kant op: het gebruik van een multi-core CPU als GPU vervanger.
Zoals meerdere mensen hier al hebben gezegd is programmeren in CUDA niet je grootste probleem. Het omzetten van je code naar een parallele oplossing is idd niet triviaal. Bovendien is het zo optimaal mogelijk gebruik maken van de hardware ook niet bepaald een eitje. Er zijn een paar soorten geheugen die elk verschillende eigenschappen heeft, dus je moet ook nog eens rekening houden met de hardware.
Pagina: 1