Videogiochi: arriva la generazione multicore

Con l'avvento delle CPU multicore gli sviluppatori hanno dovuto rivedere seriamente i propri processi di sviluppo, ma adesso sembrano intravvedersi i risultati di questa transizione.
di Rosario Grasso pubblicata il 12 Aprile 2007, alle 13:38 nel canale Videogames
42 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - infocredo che ti stia sbagliando, q3 ha sempre supportato un unico core
No.
a quanto ne so esiste un'opzione che abilita il multi-threading nel motore di q3 arena.
Sempre se non ricordo male ovviamente... ma di solito è MOLTO difficile ke mi sbagli
Ma anche no.
Vogliamo ricordare quanto tempo ci ha messo il mercato a passare dal codice procedurale al codice OO?
E, come ho già detto prima, fare debugging x i bug in multi-threading con gli strumenti attuali (o almeno con gli strumenti che conosco) è un vero e proprio bagno di sangue.
Dalla mia esperienza si parla di tempi dalle 3 alle 10 volte maggiori (quando il bug è particolarmente rognoso e subdolo).
mi spiego... le i386 sono un genere di istruzione pensato per l'esecuzione in sequenza con l'ausilio eventuale di una FPU per i calcoli in virgola mobile... anche in anni e secoli di sviluppo informatico, il nostro codice si basa su quelle istruzioni. con le pipeline multiple, le istruzioni dedicate (sse, mmx e quant'altro) e con tecniche hardware come la previsione di salto o simili, i produttori di cpu han tentato di metterci una pezza ma gli attuali compilatori devon combattere proprio con questo tipo di problema, cioè una serie di istruzioni pensate per essere eseguite in sequenza.
il PPC e altri processori RISC come gli Alpha e altri ormai morti e sepolti partivano da un concetto diverso, le istruzioni erano più semplici e potevano esser eseguite anche in un "quasi" parallelismo ma ovviamente essendo soluzioni di nicchia non hanno avuto un seguito...
se pensate che una vecchia Silicon degli anni 90 in elaborazione video ancora adesso darebbe il fumo a una bella serie di processori moderni, potete avere un'idea di come l'hardware attuale potrebbe rendere se venisse cambiata mentalità...
ma il mondo è di microsoft e a microsoft non interessa riscrivere un compilatore e poi un nuovo sistema operativo... potrebbe succedere che qualcuno ci riesca meglio di loro e loro perdano il monopolio
per l'ottimizzazione dei giochi invece il discorso di programmazione è ancora diverso anche se legato:
il processore ha dei limiti, ma il vero anello mancante è una generazione di compilatori e un linguaggio di programmazione che possano rappresentare facilmente il multiprocessing... provate in C o in C++ o in C# a convincere la cpu a eseguire contemporaneamente 2 o + tread... in molti casi è quasi impossibile (dipende sopratutto dalle estensioni supportate dal compilatore e da come sono implementate)
ma è anche un fattore mentale dei programmatori... noi umani siamo portati a pensare sequenzialmente non in parallelo e quindi non riusciamo a "vedere" la strada multitread
per il resto quoto a pieno chi parla di giocabilità, AI, fisica ecc... a che serve una physis se ho un quadcore che lavora al 20-30% delle sue possibilità?
Ma anche no.
ripeto.
i compilatori e gli altri strumenti automatici potranno aiutare nel multi-threading quando avremo potenze computazionali quasi paragonabili a quelle di un cervello umano.
Fino ad allora toccherà al nostro cervello trovare ed effettuare le eventuali ottimizzazioni.
E vi assicuro che non è un compito x nulla banale.
Fattibile è fattibilissimo.... ma a fronte di un esborso di ore/uomo notevole.
-Ma non si potrebbe davvero "unire" i vari core per farli lavorare come uno solo in sequenza inveece che in parallelo?
Assolutamente no.
A meno ovviamente di non avere un algoritmo di predizione e gestione delle dipendenze che riesca a gestire il tutto usando meno risorse computazionali di quelle necessarie per eseguire il problema senza ottimizzazioni multi-threaded.
Ovvero all'atto pratico ad oggi è impossibile.
Un domani spero proprio ke si trovi una soluzione decente
Nessun processore ad oggi esistente può farlo.
Può accadere che i processori di oggi facciano delle ottimizzazioni eseguendo dei calcoli fuori sequenza al posto di star fermi in attesa di caricamento di dati dalla memoria..
ma è BEN diverso rispetto all'ottimizzare un flusso di codice in algoritmi paralleli che devono girare in thread diversi con una ben precisa sincronizzazione
Grazie mille!
secondo te ci sarà qualche motivo se anche la apple ha abbandonato i G5 in favore dei processori intel.... o no?
[code]
#include <openmp.h>
int main(int argc, char ** argv)
{
#pragma omp parallel for
for (;
return 0;
}
[/code]
Che bello, un pezzo di codice C/OpenMP che non fa nulla in un numero di thread equivalente al numero di core disponibili.
E funziona sotto Windows / Linux alla stessa maniera, nativamente e con Microsoft C++ Compiler, Intel C++ Compiler e GCC 4.2
Pezzi di codice serilalizzato con banali direttive pragma. In C# è ancora piu' banale, visto che i thread fanno parte delle API standard del linguaggio e vengono gestiti per la maggior parte dal framework senza troppi complimenti.
funzionare funziona..
vallo però a sincronizzare e soprattutto a debuggare...
fin quando ti limiti a 10 righe di codice è una cavolata..
ma quando si parla di progetti di centinaia di migliaia di righe di codice...
bhè... tanti auguri e figli maschi
vallo però a sincronizzare e soprattutto a debuggare...
fin quando ti limiti a 10 righe di codice è una cavolata..
ma quando si parla di progetti di centinaia di migliaia di righe di codice...
bhè... tanti auguri e figli maschi
Ti pongo allora una domanda: le modalità di sincronizzazione sono direttamente proporzionali al numero di core disponibili o rimane sempre la stessa come nel caso di un programma multithread singolo core?
azzardo: la seconda che hai detto (?)
Per altro, una domanda forse stupida:
Programmando in java il parallelismo è demandato alla programmazione o alla macchina virtuale?
Per altro, una domanda forse stupida:
Programmando in java il parallelismo è demandato alla programmazione o alla macchina virtuale?
La difficoltà della sincronizzazione non dipendono dal numero di core ma dal numero di thread.
E soprattutto dipendono dal'architettura dell'applicazione, quindi non è possibile fare un discorso generale.
Ad esempio ci potrebbero essere dei programmi sccritti per girare con due soli thread con + problemi di dipendenze e di sincronizzazione di altri tipi di programmi scritti per essere sfruttati su N-thread.
Un esempio tipico sono i software di rendering 3d la cui struttura degli algoritmi si presta molto bene sia alla suddivisione per il multi-threading che addirittura per il grid computing.
Ma lo stesso certo non si può dire per tutti i software esistenti.
Alla domanda numero 2 la risposta è no.
Un programma per essere parallelizzato deve essere pensato in maniera da essere multi-threaded.
Da Java 5 in poi cmq sotto il package java.util.concurrent ci sono una marea di classi che aiutano molto il programmatore ad alto livello...molto ma MOLTO meglio rispetto ai costrutti a basso livello che era necessario utilizzare prima.
Ma lo stesso le fasi di gestione delle dipendenze, sincronizzazione, profiling, trasformazione delle parti critiche dell'algoritmo in multi-threading e soprattutto debugging, sono demandate al programmatore.
E soprattutto dipendono dal'architettura dell'applicazione, quindi non è possibile fare un discorso generale.
Ad esempio ci potrebbero essere dei programmi sccritti per girare con due soli thread con + problemi di dipendenze e di sincronizzazione di altri tipi di programmi scritti per essere sfruttati su N-thread.
Un esempio tipico sono i software di rendering 3d la cui struttura degli algoritmi si presta molto bene sia alla suddivisione per il multi-threading che addirittura per il grid computing.
Ma lo stesso certo non si può dire per tutti i software esistenti.
Alla domanda numero 2 la risposta è no.
Un programma per essere parallelizzato deve essere pensato in maniera da essere multi-threaded.
Da Java 5 in poi cmq sotto il package java.util.concurrent ci sono una marea di classi che aiutano molto il programmatore ad alto livello...molto ma MOLTO meglio rispetto ai costrutti a basso livello che era necessario utilizzare prima.
Ma lo stesso le fasi di gestione delle dipendenze, sincronizzazione, profiling, trasformazione delle parti critiche dell'algoritmo in multi-threading e soprattutto debugging, sono demandate al programmatore.
Ah, ecco
Pensavo di essere io a non aver trovato il tastone con scritto "Rendilo Parallelo" in eclipse ....
invece mi pare d'aver capito che in sostanza tocca continuare a spaccarsi la testa
Devi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".