Tommo
24-05-2009, 18:51
Salve,
sono da un pò con le prese di questo problema, ma non mi viene un'idea decente a pagarla oro :D
Avevo anche pensato di farci un contest ma mi sembrava scorretto :asd:
Comunque, in pratica sto cercando di realizzare un rasterizer con CUDA... tuttavia mi son reso conto che la rasterizzazione è un problema inerentemente non-GPU-parallelo se si utilizza un algoritmo semplice, perchè ogni triangolo può contenere N pixels, da 0 fino anche a tutto quanto lo schermo.
Dato che il tallone d'achille del GPGPU è l'accesso alla memoria, un ipotetico stream che deve accedere a 1900*1200 pixels può bloccare la scheda per qualche secondo :asd:
Ora per renderizzare attorno a quella risoluzione il famoso coniglio da 35.000 poly (in wireframe) ci metto 0,006 microsecondi, non esattamente performante (molto ottimisticamente 170 fps, solo lui)
Quindi dovrei trovare un algoritmo che:
-possa essere spezzato in n < 1.000.000 threads
-abbia un branching predicibile e coerente, cioè che tutti i thread si eseguono più o meno uguale
-acceda ad elementi adiacenti in memoria, in numero costante, e magari il meno possibile.
-faccia uso della cache locale
Avevo in mente qualche organizzazione spaziale a tree + raycasting, ma in sostanza non ho idea di come farlo...
spero che qualche luminare mi illumini :D
sono da un pò con le prese di questo problema, ma non mi viene un'idea decente a pagarla oro :D
Avevo anche pensato di farci un contest ma mi sembrava scorretto :asd:
Comunque, in pratica sto cercando di realizzare un rasterizer con CUDA... tuttavia mi son reso conto che la rasterizzazione è un problema inerentemente non-GPU-parallelo se si utilizza un algoritmo semplice, perchè ogni triangolo può contenere N pixels, da 0 fino anche a tutto quanto lo schermo.
Dato che il tallone d'achille del GPGPU è l'accesso alla memoria, un ipotetico stream che deve accedere a 1900*1200 pixels può bloccare la scheda per qualche secondo :asd:
Ora per renderizzare attorno a quella risoluzione il famoso coniglio da 35.000 poly (in wireframe) ci metto 0,006 microsecondi, non esattamente performante (molto ottimisticamente 170 fps, solo lui)
Quindi dovrei trovare un algoritmo che:
-possa essere spezzato in n < 1.000.000 threads
-abbia un branching predicibile e coerente, cioè che tutti i thread si eseguono più o meno uguale
-acceda ad elementi adiacenti in memoria, in numero costante, e magari il meno possibile.
-faccia uso della cache locale
Avevo in mente qualche organizzazione spaziale a tree + raycasting, ma in sostanza non ho idea di come farlo...
spero che qualche luminare mi illumini :D