NVIDIA OptiX è un’API per il ray-tracing, con funzioni sia lato CUDA che C/C++, che permette di utilizzare le enormi potenzialità dei ray-tracing core delle moderne schede grafiche in maniera molto semplice ed efficiente. OptiX supporta una rappresentazione leggera delle scene basata su triangoli, curve, sfere oppure primitive definite dall’utente.

Abbiamo voluto investigare l’applicabilità di NVIDIA OptiX, e dei ray-tracing core in generale, alla collision-detection (un’applicazione abbastanza insolita per questa tecnologia). A tal fine abbiamo utilizzato SOFA (framework per le simulazioni real-time) e per SOFA abbiamo sviluppato un plugin che implementa una pipeline di collision-detection che utilizza le schede grafiche equipaggiate di ray-tracing core mediante OptiX. Tale pipeline deve convertire le strutture dati SOFA in strutture molto più semplici (triangoli nel nostro caso) che possono essere trattate da OptiX.

Abbiamo confrontato i tempi necessari per la collision-detection del plugin sviluppato (optix) con 2 pipeline built-in di SOFA: cpu (BruteForce + BVHNarrowPhase) e cuda. Per effettuare un confronto in maniera controllata (il numero di collisioni da rilevare è noto ad ogni passo della simulazione) si è considerata una scena molto semplice: un certo numero di cubetti (fissato a piacere) che cadono su un altro parallelepipedo, quest’ultimo immobile. Così facendo si ha che, a pieno o imminente contatto, il numero di collisioni che devono essere rilevate dalle 3 pipeline è sempre 4n, dove n è il numero di cubi che cadono e 4 sono gli spigoli inferiori di ogni cubo. Nelle 2 figure seguenti sono riportate le scene relative rispettivamente a 1 e 10 cubi.

I risultati dei confronti sono molto positivi ed evidenziano come la collision-detection effettuata con i ray-tracing core possa essere molto vantaggiosa rispetto alle 2 soluzioni built-in di SOFA considerate, cpu e cuda, con speedup che arrivano a toccare 1e4. La tabella seguente presenta, per diversi valori del numero di cubi (numero di collisioni), i risultati dei confronti espressi in termini di tempo per eseguire la collision-detection (media sui 100 step di simulazione eseguiti) e in termini di speedup (tempo implementazione built-in diviso tempo implementazione optix).

Le figure seguenti presentano in forma grafica gli stessi risultati della tabella, rispettivamente in termini di tempo di esecuzione e in termini di speedup. Come si può vedere dalla prima figura, il tempo di calcolo della pipeline optix cresce molto più lentamente con l’aumentare del numero di collisioni rispetto alle altre 2 pipeline. Questo fa sì che lo speedup (riportato nella seconda figura) cresca molto velocemente all’aumentare del numero di collisioni. I risultati della pipeline cuda per più di 1e3 cubi non sono riportati in quanto tale pipeline falliva con “cudaMalloc error out of memory” sopra a tale valore.

Tuttavia dai risultati si nota anche come la pipeline optix risulti la più lenta per bassi valori del numero di collisioni. Questo è facilmente spiegabile pensando al fatto che la conversione delle strutture dati tra SOFA e OptiX, oltre al successiva comunicazione delle stesse alla GPU, possono risultare molto dispendiosi in termini di tempo, quindi non vantaggiosi quando il carico computazionale per la GPU è basso. Tale limite non risulta particolarmente preoccupante visto che si presenta in condizioni di scarso interesse pratico (modelli molto piccoli) e potrebbe essere mitigato implementando un collision-model per SOFA tale per cui le strutture dati necessarie alla collision-detection si trovino già sulla GPU (e in un formato appropriato) all’inizio della fase di collision-detection.