View Full Version : [vari] Programmazione GP-GPU
Salve a tutti, mi sembra che ci fosse già una discussione al riguardo ma non sono riuscito a trovarla in alcun modo per cui ne apro un'altra.
Vorrei iniziare a fare qualche esperimento di programmazione GP-GPU, CUDA in questo ambito al momento sembra il framework più maturo ma preferirei qualcosa che funzioni indipendentemente dalla marca della GPU. A questo punto la scelta più ovvia sarebbe OpenCL ma non trovo una implementazione seria, ho provato OpenTK che a quanto pare dovrebbe contenere OpenCL ma se è così non capisco in che modo usarlo.
Conoscete una implementazione che abbia un buon livello di usabilità?
Alternativamente potrei optare per DirectCompute visto che mi interessa di più l'indipendenza dall'HW piuttosto che dal SO.
Qualcuno ha già qualche esperienza in ambito GP-GPU e ha qualche consiglio?
Grazie :)
Io ho appena finito di scrivere (ma sto ottimizzando) un programma di dinamica molecolare scritto con CUDA. Devo dire che è un bel lavoraccio, soprattutto per quanto riguarda l'ottimizzazione. Si deve entrare "nella materia" e capire bene l'architettura sia della gpu che di CUDA. Non ho esperienza con OpenCL o roba simile, ma da quanto ho letto passare da CUDA a OpenCL (quando sarà sufficientemente maturo) non dovrebbe essere un bagno di sangue.
Il fatto è che per CUDA sul sito di Nvidia trovi tutto quello che serve per iniziare a sviluppare. Mentre per OpenCL sul sito del Khronos Group non c'è molto e in generale su internet si trovano cose molte frammentarie. A me servirebbe una guida del tipo "installa questo e poi quello e poi fai queste impostazioni" poi il linguaggio me lo imparo senza problemi una volta che posso fare delle prove reali.
Nessuno ha mai fatto nulla con OpenCL?
Hai guardato qui ?
http://developer.amd.com/GPU/ATISTREAMSDK/pages/TutorialOpenCL.aspx
Hai guardato qui ?
http://developer.amd.com/GPU/ATISTREAMSDK/pages/TutorialOpenCL.aspx
Proverò a vedere, grazie. Per il momento forse sto iniziando a capire come funziona OpenTK e ho finalmente trovato un esempio. Tu hai già qualche esperienza con qualche framework per il GP-GPU?
Assolutamente no.
Comunque guarda anche i link in fondo a quella pagina.
Assolutamente no.
Comunque guarda anche i link in fondo a quella pagina.
Tutto già visto, alla fine per i bindings C# rimanda a OpenTK. Grazie.
Quello che non ho ancora capito è cosa fanno esattamente questi bindings, in pratica al momento della compilazione del programma permettono di chiamare le funzioni OpenCL messe a disposizione dai driver della scheda video no? Quindi non dovrebbe esserci bisogno di installare altro se non ho capito male.
PS questa mia teoria sembra essere confermata dalla presenza sul pc di alcuni file chiamati opencl.dll (in varie cartelle diverse) forniti da nvidia. Quindi se avessi una scheda ATI l'unica cosa che cambierebbe sarebbe in codice interno di quel file dll ma metterebbe a disposizione le stesse funzioni che poi sono quelle che il programma scritto con OpenCL andrebbe a chiamare
ciao a tutti, sto programmando con OpenCL ormai da un po' su piattaforma nvidia. però sto per cambiare pc e pensavo di prendere una scheda video AMD/ATI (in particolare sono orientato sulla 5850). qualcuno ha provato OpenCL su piattaforma AMD? leggendo un po' in giro mi sembra che sia un po' più indietro riguardo al supporto GP-GPU rispetto a nvidia. qualcuno ne sa di più? non ho proprio voglia di prendere una gtx470 ma neanche di trovarmi bloccato con il progetto che sto facendo per l'università. grazie
Io sapevo che se hai meno di una HD5*** l'openCL la puoi usare massimo per far girare i samples :asd:
E poi ho sentito che le OpenCL di NVidia ed AMD sono tutto tranne che compatibili ad oggi, preparati a fare un porting... in effetti l'unica demo scritta per AMD/OpenCL che ho provato non girava affatto sulla mia scheda nvidia, si limita a buttare pallini colorati e mandare in crash Aero. Le demo dello Stream SDK invece non partono proprio sulla "concorrenza".
magari la situazione m'è sembrata così grama perchè mi documento soprattutto sui forum CUDA... però anche il fatto che non esiste un corrispondente forum AMD dovrebbe voler dire qualcosa :asd:
Io sapevo che se hai meno di una HD5*** l'openCL la puoi usare massimo per far girare i samples :asd:
E poi ho sentito che le OpenCL di NVidia ed AMD sono tutto tranne che compatibili ad oggi, preparati a fare un porting... in effetti l'unica demo scritta per AMD/OpenCL che ho provato non girava affatto sulla mia scheda nvidia, si limita a buttare pallini colorati e mandare in crash Aero. Le demo dello Stream SDK invece non partono proprio sulla "concorrenza".
magari la situazione m'è sembrata così grama perchè mi documento soprattutto sui forum CUDA... però anche il fatto che non esiste un corrispondente forum AMD dovrebbe voler dire qualcosa :asd:
il forum veramente esiste http://forums.amd.com/devforum/
cdimauro
17-04-2010, 17:11
ciao a tutti, sto programmando con OpenCL ormai da un po' su piattaforma nvidia. però sto per cambiare pc e pensavo di prendere una scheda video AMD/ATI (in particolare sono orientato sulla 5850). qualcuno ha provato OpenCL su piattaforma AMD? leggendo un po' in giro mi sembra che sia un po' più indietro riguardo al supporto GP-GPU rispetto a nvidia. qualcuno ne sa di più?
Le GPU AMD sono un po' più indietro, e al momento soffrono di alcuni problemi relativi all'uso della cache L2, se non ricordo male.
Ma hanno il vantaggio di poter risolvere parecchi problemi perché dipendono fortemente dal compilatore e dall'ottimizzatore che girano sui driver. Mentre le GPU nVidia hanno molta logica di bilanciamento e ottimizzazione del carico gestita in hardware.
non ho proprio voglia di prendere una gtx470 ma neanche di trovarmi bloccato con il progetto che sto facendo per l'università. grazie
Dipende sempre dal tipo di algoritmo che dovrai far girare. Le due famiglie di GPU sono estremamente diverse. Le Ati prediligono codice altamente parallelizzabile, mentre le nVidia uno più "seriale".
E' vero che Fermi come GPU è molto più GP di Cypress, ma non è detto che abbia sempre migliori prestazioni, come dimostrano alcuni benchmark.
Poi di mezzo ci sono pure i costi e i consumi di cui tenere conto. Tanto che al momento attuale è molto più conveniente una HD5900, che ha una doppia GPU, rispetto a una GTX480, ad esempio.
B|4KWH|T3
17-04-2010, 17:45
Io ho appena finito di scrivere (ma sto ottimizzando) un programma di dinamica molecolare scritto con CUDA. Devo dire che è un bel lavoraccio, soprattutto per quanto riguarda l'ottimizzazione. Si deve entrare "nella materia" e capire bene l'architettura sia della gpu che di CUDA. Non ho esperienza con OpenCL o roba simile, ma da quanto ho letto passare da CUDA a OpenCL (quando sarà sufficientemente maturo) non dovrebbe essere un bagno di sangue.
Se non sono indiscreto, posso chiederti dove lavori?
Io mi sto laureando in Bioinformatica
Se non sono indiscreto, posso chiederti dove lavori?
Io mi sto laureando in Bioinformatica
Sono un dottorando in fisica al primo anno alla Sapienza
B|4KWH|T3
22-06-2010, 17:57
Riuppo il thread per segnalare (a chi fosse interessato al GPGPU) :
http://developer.amd.com/zones/OpenCLZone/courses/pages/Introduction-OpenCL-Programming-May-2010.aspx
e in particolare:
http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20(201005).pdf
Riuppo il thread per segnalare (a chi fosse interessato al GPGPU) :
http://developer.amd.com/zones/OpenCLZone/courses/pages/Introduction-OpenCL-Programming-May-2010.aspx
e in particolare:
http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20(201005).pdf
Oddio hanno fatto davvero della documentazione decente e mirata. Ho paura :asd:
E poi per la prima volta OpenCL supera CUDA per l'implementazione della Command Queue...
in certi tipi di applicazioni (un VG?) è vitale per evitare che il workflow si sincronizzi, e in CUDA va implementato a mano.
Interessante, potrei portare il mio render.
Si sa qualcosa della compatibilità di AMD Stream con Nvidia? in teoria dovrebbe andare senza alcun problema, in pratica per me non parte :asd:
E poi per la prima volta OpenCL supera CUDA per l'implementazione della Command Queue...
cosa intendi di preciso? ti riferisci ai miglioramenti portati con OpenCL 1.1? in questa documentazione cmq si parla ancora di OpenCL 1.0 anche perchè non esiste ancora una implementazione della versione 1.1, sul forum di amd lasciano intendere che la prossima versione dell'sdk supporterà OpenCL 1.1
pabloski
23-06-2010, 11:07
Si sa qualcosa della compatibilità di AMD Stream con Nvidia? in teoria dovrebbe andare senza alcun problema, in pratica per me non parte :asd:
non dovrebbero essere compatibili, altrimenti che senso avrebbe opencl?
riguardo opencl è una buona scelta cominciarlo ad usare perchè amd lo sta supportando fin dall'inizio e nvidia la settimana scorsa ha fatto sapere che spingerà anche lei opencl
quindi da qui in poi opencl dovrebbe migliorare molto rapidamente
per esperienza ho provato ad installare l'ambiente di sviluppo cuda su linux ma è stato un bagno di sangue....ok pure i driver nvidia danno rogne su linux ultimamente
cosa intendi di preciso? ti riferisci ai miglioramenti portati con OpenCL 1.1? in questa documentazione cmq si parla ancora di OpenCL 1.0 anche perchè non esiste ancora una implementazione della versione 1.1, sul forum di amd lasciano intendere che la prossima versione dell'sdk supporterà OpenCL 1.1
La documentazione però cita esplicitamente una Command Queue per i Kernels, quindi c'è :D
Magari al momento è un'estensione di OCL1.0 di AMD?
Comunque fa cagarissimo che tutti spacciano OpenCL come "open" ma poi ogni implementazione è binariamente incompatibile con la concorrenza...
fin quando non riuscirò a sviluppare coi tool di AMD su Nvidia e viceversa per me OpenCL può rimanere dov'è :stordita:
La documentazione però cita esplicitamente una Command Queue per i Kernels, quindi c'è :D
Magari al momento è un'estensione di OCL1.0 di AMD?
Comunque fa cagarissimo che tutti spacciano OpenCL come "open" ma poi ogni implementazione è binariamente incompatibile con la concorrenza...
fin quando non riuscirò a sviluppare coi tool di AMD su Nvidia e viceversa per me OpenCL può rimanere dov'è :stordita:
Lo standard riguarda le API non le ABI. Al piu' ti puoi lamentare che non puoi cross-compilare da una architettura all'altra, ma io francamente neanche me lo aspetto. Sarebbe come chiedere di poter cross-compilare binari ARM per linux da VS ...
volendo con un po' di fatica si riesce a scrivere qualcosa che funziona sia con amd che con nvidia. però se hai hw nvidia per farlo andare dovrai avere i driver della nvidia e su hw amd dovrai avere l'ati stream sdk. in pratica sono più che altro gli strumenti di sviluppo ad essere incompatibili. ad esempio stream kernel analyzer se hai hw nvidia non funziona.
se vuoi un esempio scaricati gpu caps viewer. contiene delle demo in opencl che vanno sia su ati che su nvidia.
il discorso cpu è un po' diverso. sono supportate solo dallo stream sdk (sia cpu intel che cpu amd), però sono riuscito a fare qualche prova su cpu anche avendo una gpu nvidia. in pratica avevo sia l'sdk di nvidia che quello di ati, poi però facevi casini con altre cose per cui ho disinstallato quello della ati, cmq come inizio non è male
La documentazione però cita esplicitamente una Command Queue per i Kernels, quindi c'è :D
Magari al momento è un'estensione di OCL1.0 di AMD?
no beh le command queue esistono anche in opencl 1.0. ma quindi cosa intendi quando dici che sono superiori a quelle di cuda? che in cuda non ci sono proprio? io in effetti non l'ho usato gli ho dato solo un'occhiata vaga mentre opencl lo sto usando per un progetto per l'università
In cuda pensavo ci fosse, ma ho avuto una brutta sorpresa...
in pratica l'esecuzione di "un Kernel" è parallela al main thread si...
Il problema è che se c'è una nuova chiamata ad un kernel prima che il primo finisca, a causa della mancanza di una command queue il main thread viene messo in attesa del primo, appena prova a lanciare il secondo.
quindi fuori dalle app di esempio che fanno lavorare solo la GPU, ci si trova spessissimo in situazioni dove prima la CPU lancia un sacco di kernels e aspetta la GPU, quindi la GPU aspetta che la cpu finalizzi il frame e faccia quello che deve fare.
Per cui il modello è sostanzialmente sincrono... mentre fai conto che nei videogiochi la GPU si trova a volte fino a 10 frame indietro rispetto alla CPU prima che venga imposta una sincronizzazione!
Inoltre questo fatto lo conoscono in pochi, che io sappia c'è una sola implementazione di command queue in giro.
In realtà ci sarebbero i Compute Streams nel CUDA SDK, che dovrebbero parallelizzare l'esecuzione di N kernels...
il problema è che su qualsiasi cosa che non sia Fermi non fanno assolutamente nulla e tutti i kernels vengono lanciati nel main thread.
E su Fermi se ne possono eseguire (al più, a discrezione dello scheduler) 4 , che comunque presentano lo stesso problema di quell'unico thread di prima, cioè 2 kernel consecutivi serializzano lo stream.
Per cui OpenCL mi è interessata di botto con questa cosa.
Lo standard riguarda le API non le ABI. Al piu' ti puoi lamentare che non puoi cross-compilare da una architettura all'altra, ma io francamente neanche me lo aspetto. Sarebbe come chiedere di poter cross-compilare binari ARM per linux da VS ...
E quindi abbiamo OpenCL di Nvidia, OpenCL di AMD, OpenCL di IT, OpenCL di Intel... allora dove sarebbe lo standard se non sono nemmeno compile-compatibili?
La situazione è quantomeno confusa :asd:
banryu79
24-06-2010, 13:16
E quindi abbiamo OpenCL di Nvidia, OpenCL di AMD, OpenCL di IT, OpenCL di Intel... allora dove sarebbe lo standard se non sono nemmeno compile-compatibili?
La situazione è quantomeno confusa :asd:
Beh, una cosa alla volta: almeno hanno lo stesso nome.
Dagli tempo.
I
E quindi abbiamo OpenCL di Nvidia, OpenCL di AMD, OpenCL di IT, OpenCL di Intel... allora dove sarebbe lo standard se non sono nemmeno compile-compatibili?
La situazione è quantomeno confusa :asd:
Se vuoi ti riscrivo quello che hai quotato :D.
Perche' dovrebbero essere compatibili a livello binario per essere uno standard ? OpenCL si occupa di altro, cosi' come lo standard C++ non si occupa della compatibilita' binaria degli eseguibili. Anzi col C++ e' forse peggio perche' esistono compilatori per la stessa architettura HW (x86) e la stessa piattaforma (win32) che generano codice oggetto con ABI diverse. Nonostante questo c++ e' uno standard.
Si beh però purtroppo mentre "Win e Linux" sono due cose piuttosto differenti dal punto di vista dell'utente, AMD e Nvidia producono schede video che fanno esattamente le stesse cose.
Detta in altra maniera, non è fattibile un eseguibile per Nvidia e uno per AMD in un'applicazione di massa... sia per la manutenzione che per l'utente finale che spesso non sa nemmeno che è una scheda video ( "è lo schermo?" (cit.) ) e va prepotentemente contro l'idea che ha fatto nascere OpenCL, cioè computing parallelo portabile e trasparente.
All'inizio dicevano che avrebbe funzionato pure sui processori, figurarsi.
A questo punto è ovvio che si fa prima a dire "nvidia only" e supportare il tool fatto meglio.
Bah, speriamo che la situazione cambierà, OpenCL non mi dispiace :D
Ho provato su Mac, com'è giusto che sia il kit offerto col sistema non fa alcuna distinzione tra Nvidia e AMD... magari le prestazioni non sono al top (58 gflops per lo nbody sample) ma trattandosi di una 8600GT su mac "non ufficiale" è notevole.
Come sarà che su Windows questa cosa è "tecnicamente impossibile"? :D
EDIT: ah ecco
Mac OS X’s OpenCL compiler uses the clang and LLVM technologies to compile the kernels written in OpenCL and translate those instructions into optimized machine code targeted for the hardware on the host machine. Mac OS X v10.5 and later uses LLVM technology in other environments as well, such as for compiling OpenGL code. When the compiler converts your OpenCL code it first translates your instructions from OpenCL to an intermediate representation (IR). After that, LLVM does its best to optimize the IR before passing it along to the code generators for the devices that the code must execute on. The importance of this pipeline is that it makes it possible to write a single OpenCL program that can execute natively on various machine architectures—such as those of the various CPUs and GPUs available on your system. Although LLVM is fast, compiling is always expensive and the resulting programs should be cached by your application to avoid unnecessary re-compilation.
Tanta roba.
Che è sto LLVM che sembra saper fare di tutto? :asd:
Che è sto LLVM che sembra saper fare di tutto? :asd:
http://llvm.org/
Se non mi ricordo male sta per Low Level Virtual Machine. E' una macchina virtuale con molte funzionalità avanzate, e vuole rappresentare un pò lo stato dell'arte.
Ci ho giocato un pò e mi sembra davvero un gioiellino.
Oltretutto, i messaggi d'errore di clang (il progetto principale a contorno, C su LLVM in pratica) sono spettacolari :D
banryu79
25-06-2010, 08:46
Oltretutto, i messaggi d'errore di clang (il progetto principale a contorno, C su LLVM in pratica) sono spettacolari :D
[OT:] in che senso? :confused:
[OT:] in che senso? :confused:
http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html
Notare che ti sottolinea l'errore in ascii-art style e ti dice "did you mean X?" con la correzione. Spettacolo.
C'è un confronto diretto tra clang e gcc... la differenza si nota! :D
banryu79
25-06-2010, 10:18
http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html
Notare che ti sottolinea l'errore in ascii-art style e ti dice "did you mean X?" con la correzione. Spettacolo.
C'è un confronto diretto tra clang e gcc... la differenza si nota! :D
Azz, visto, e sottoscrivo: molto bello (e utile) davvero :)
Pixel452
25-06-2010, 12:48
Ma visto che mi pare di capire che qui c'è gente che usa OpenCL... Usate Visual Studio 2010 per sviluppare? Perchè io non riesco a far andare l'intellisense nei file .cl, faccio tutto quello che dice la guida(stessa roba col'2008 che però mi funziona) ma va solo per i file .cl che sono GIA' presenti nei progetti dell'SDK, se anche ne aggiungo uno ad un esempio già esistente non mi funziona, ma solo per il file nuovo. Vi viene in mente niente?
Grazie.
p.s. La configurazione l'ho impostata come per i file già presenti.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.