Programmare su piattaforma Xbox 360
Il sistema operativo non utilizza il core ‘0’, ma usa circa il 3% della potenza del core ‘1’ e il 3% del core ‘2’, quindi il 98% della potenza dei tre core rimane libera e utilizzabile dalle applicazioni videoludiche. Programmare per 360 è abbastanza semplice e diretto grazie alla quantità di memoria principale condivisa, alla dimensione della cache L2 e al fatto che le informazioni passano molto facilmente e velocemente attraverso i differenti threads dell’applicazione con l’uso dei puntatori.
Tipicamente un’applicazione viene inizialmente sviluppata utilizzando un solo thread di un core, poi, una volta sviluppata l’appz, il tutto viene segmentato per utilizzare più core e possibilmente anche più threads hardware per ogni core. Il modo più semplice per operare questa segmentazione è quello di assegnare il codice di controllo del gioco e l’AI ad un core e il codce di rendering grafico ad un altro core. Non appena il codice dell’AI è stato eseguito vengono inviate al core di rendering grafico e informazioni per processare il frame successivo. Quindi il codice di rendering grafico eseguito sul secondo core va a creare il frame corrente mentre simultaneamente l’AI esegue il codice necessario al frame successivo.
Segmentare il codice ulteriormente comincia ad essere molto più difficile. Lo sviluppatore deve anzitutto determinare dove potrebbero formarsi dei colli di bottiglia. Se questi si verificano all’interno del codice AI, dovrà accertarsi che possa essere attuata una processazione parallela (per esempio in un gioco racing, potrebbe essere possibile che il programma principale processi l’AI di 5 auto e un altro core processi l’AI di altre 5 auto sula tracciato contemporaneamnte). Se il collo di bottiglia si verifica invece nel codice della grafica, allora è possibile assegnare parte del codice di rendering in parallelo ad un altro core.
Quando un programma è suddiviso su tre core, uno dei core è attivo per il 100% del tempo mentre gli altri due possono risultare attivi per poco tempo (10%, 20%, 50%, etc.). In tal caso è richiesta maggior segmentazione sul core occupato al 100%, quindi può essere aggiunto un nuovo thread hardware a uno dei core meno attivi per gestire 2 processi allo stesso tempo. Una volta saturati tutti i threads hardware disponibili, se è necessaria una ulteriore segmentazione, possono essere istanziati dei threads software (che sono comunque meno efficienti di quelli hardware) fino a che anche quel core non raggiunge il 100% dell’occupazione.
Una volta che tutti e 3 i core hanno un’utilizo prossimo al 100% saranno stati raggiunti il massimo frame rate, la massima sofisticatezza e dettaglio grafico. Se l’AI propone frames più velocemente di quanto la GPU non possa processarne (massimo 60 fps a 720p o 30 fps a 1080i), possono essere aggiunti ulteriori dettagli.
Programmare su piattaforma PS3
Programmare per PS3 è molto più difficile di quanto non lo sia su Xbox 360. In un certo senso PS3 è stata progettata in modo simile ai sistemi multi processore utilizzati in ambiti specifici, per esempio al NASA Ames Research Center. Il concetto si basa sul principio che vede un enorme quantità di dati matematici che si ripetono e che possono essere processati in parallelo o sequenzialmente ma spezzettati (per esempio un core moltiplica due array di 10000 numeri e poi passa l’array risultante a un altro core che opera divisioni sui singoli elementi dell’array e ne passa il risultato a un altro core che provvederà ad atre operazioni sui dati e così via; dopo che il primo core ha terminato l’operazione, acquisisce nuovi dati e prosegue su questi con la stessa operazione.
Così come avviene per Xbox 360, anche qui l’applicazione viene inizialmente sviluppata utilizzando il core PPE. A questo punto sarebbe lecito pensare che la PS3 (come la 360) sia in grado di segmentare il codice assegnando a un core il codice di controllo dell’AI e ad un altro il codice di rendering grafico. Questo non è possibile! Dal momento che il codice vero e proprio di un’applicazione si attesta sui 100 MB e che la memoria di ciascun SPE è di soli 256KB solo 1/400 del codice totale può essere depositato nella memoria di uno SPE. Inoltre poiché in uno SPE non c’è capacità di branch prediction (http://it.wikipedia.org/wiki/Predizi...le_diramazioni) , le diramazioni andrebbero fatte il più piccole possibili. Pertanto il programmatore deve trovare codice che sia inferiore ai 256KB (incluso lo spazio necessario per i dati) prchè questo possa essere eseguito in parallelo.
Se assumiamo che lo sviluppatore sia in grado di individuare sufficienti segmenti di codice tali per cui tutti e 6 i core SPE vengano utilizzati, adesso dovrà prodigarsi per bilanciare il carico di lavoro tra i cores. Come con Xbox 360, non è detto che i core siano sempre occupati ma è possibile che alcuni o tutti vengano utilizzati solo in minima parte. Aggiungere nuovi thread hardware non è possibile dal momento che ciascun core dispone di un solo thread hardware e agiungere threads software sarebbe probabilmente controproducente vista la memoria limitata. A questo punto l’unica opzione possibile è quella di uno schema che vede il core PPE trasferire nuovo codice agli SPE attraverso DMA, una volta terminate le operazioni sulla tranche di dati precedenti. Questa è ovviamente una procedura che richiede parecchio tempo.
Conclusioni
Ho seri dubbi sul fatto che molti sviluppatori programmeranno sui core SPEs della PS3: la complessità è enorme, i tempi di sviluppo sono molto lunghi e c’è un’elevata probabilità di sviluppare software buggato. Sospetto che Gears of War stia già sfruttando le potenzialità del sistema multiprocessore ma che stia solo usando il 50% della potenza realmente disponibile. Alla luce di ciò e di quanto detto sopra mi riesce difficile immaginare che un gioco PS3 possa risultare migliore di uno per Xbox 360.
nn flammate per cortesia!!!!
EDIT: dimenticavo.. nn sn cose scritte da me ma da uno ke ne capisce dato ke c lavora^^