C’era una volta, tanto tempo fa, una batteria di software house che sviluppavano applicazioni e, in particolare, videogiochi tentando di spremere letteralmente ogni singolo bit che l’hardware gli metteva a disposizione pur di offrire un’esperienza di gioco innovativa, sbalorditiva ed entusiasmante.
Non sempre gli sviluppatori riescono a concretizzare quello che hanno in mente, ma l’idea che mi sono personalmente fatto quando penso all’era pre-PC nel mondo dei videogames, è che all’epoca l’impegno speso nell’ottimizzazione era molto spesso più che evidente.
Oggi, invece, vi parlo di una notizia che ho appreso qualche giorno fa e che contrasta enormemente con quanto vi ho appena riportato. Secondo un articolo riportato su Real World Technologies, nel quale viene analizzato il comportamento della libreria PhysX di NVIDIA, è emerso che quest’ultima non fa uso delle istruzioni multimediali SSE dei processori per elaborare i complessi calcoli alla base delle simulazioni fisiche.
Per chi non la conoscesse, PhysX è una libreria che fornisce essenzialmente una serie di API con l’obiettivo di accelerare l’elaborazione dei calcoli legati alla fisica in maniera analoga a quanto OpenGL e Direct3D fanno con la grafica tridimensionale. PhysX è nato per opera di Ageia, un’azienda fondata nel 2002 che per prima ha proposto una soluzione hardware per l’accelerazione delle elaborazioni fisiche nei videogame.
Il processore fisico PhysX P1 (PPU – Physics Processing Unit) venne commercializzato da Asus e BFG senza di fatto riscontrare un enorme successo probabilmente perché la problematica a cui ha tentato di porre rimedio, cioè migliorare le prestazioni in questo specifico ambito dei videogame, non era particolarmente sentita. Inoltre anche il supporto da parte delle software house non fu particolarmente presente, il che faceva decadere l’utilità di un acquisto simile.
Ageia riuscì comunque ad attirare l’attenzione dei produttori di processori grafici e, in particolare, NVIDIA nel Febbraio 2008 ne acquisì tutte le proprietà. Il colosso californiano non si fece, infatti, sfuggire l’occasione di giocare un ruolo di primo piano nel settore dell’accelerazione in hardware delle elaborazioni fisiche. Forte della sua notevole vitalità commerciale, NVIDIA accantonò da subito il processore PhysX P1 ed implementò l’accelerazione in hardware della libreria PhysX nei suoi processori grafici GeForce.
Inutile affermare che l’enorme parco di PC in cui sono installate schede video GeForce in grado di accelerare PhysX ha spinto le software house a fornirgli un più che discreto supporto al punto che sono diversi i titoli oggi in commercio che utilizzano questa libreria per le elaborazioni della fisica.
A questo punto la domanda che si sono posti in molti è la seguente: come funziona PhysX nel momento in cui non è installata una scheda video GeForce? Secondo le indagini di Real World Technologies, malissimo.
Utilizzando l’Intel VTune Performance Analyzer, uno strumento di profiling certamente noto agli sviluppatori di applicazioni native, per analizzare l’esecuzione del gioco Cryostasis e di una demo di PhysX, è emerso che il codice eseguito all’interno del modulo PhysXCore.dll non integra nemmeno un’istruzione SSE, mentre si affida al 100% ad istruzioni x87.
Le istruzioni Streaming SIMD Extensions (SSE) sono state introdotte da Intel nel lontano 1999 con i Pentium III allo scopo di accelerare l’esecuzione di una serie di operazioni in virgola mobile. Nel corso degli anni diverse sono state le evoluzioni di queste istruzioni al punto che oggi siamo arrivati alla quarta revisione (SSE4).
Senza addentrarci troppo nel dettaglio, la caratteristica fondamentale di queste istruzioni è quella di essere SIMD, Single Instruction Multiple Data, cioè sono particolarmente indicate nel trattare più dati con la medesima istruzione, proprio il tipo di operazione cara ad ambiti come la grafica tridimensionale e le simulazioni fisiche. Utilizzando queste istruzioni è possibile incrementare notevolmente le prestazioni in questo tipo di elaborazioni rispetto all’uso delle classiche istruzioni x87.
Come mai, quindi, all’interno di una libreria per l’elaborazione della fisica non viene fatto uso delle istruzioni SSE? La componente “compatibilità con i vecchi processori” può essere tranquillamente esclusa in quanto qualsiasi CPU dal 2005 ad oggi supporta almeno le SSE2, più che sufficienti ad ottenere un notevole miglioramento delle performance e, anche se si volessero supportare a tutti i costi le CPU più anziane, nulla vieterebbe al setup di installazione di verificare le capacità della CPU e di installare conseguentemente la versione x87 o SSE.
Anche il fattore legato alla precisione di calcolo (fino a 80 bit nelle operazioni x87) è da escludere in quanto il processore PhysX P1 lavorava a 32 bit e anche le schede video GeForce sicuramente useranno 32 bit di precisione internamente per accelerare PhysX considerando anche il supporto di GPU come G80 che non vanno oltre questo valore.
L’articolo arriva all’unica possibile conclusione “PhysX uses x87 because Ageia and now Nvidia want it that way”, cioè essenzialmente la libreria non è ottimizzata per le CPU semplicemente perché così facendo molto probabilmente l’incremento delle prestazioni offerto dall’uso delle GPU GeForce per accelerare PhysX si assottiglierebbe al punto da non poter più utilizzare questa funzionalità nella campagna di marketing NVIDIA.
La notizia ha un certo peso anche perché le capacità di calcolo delle GPU NVIDIA, specie di ultima generazione, dovrebbero garantire comunque un surplus prestazionale tale da non dover arrivare a castrare il calcolo su CPU per fare bella figura. Detto questo, mi sorgono dubbi anche sull’effettiva ottimizzazione di PhysX sulle GPU stesse.