Videogiochi: arriva la generazione multicore

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 pubblicata il , alle 13:38 nel canale Videogames
 
42 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info
^TiGeRShArK^13 Aprile 2007, 00:24 #31
Originariamente inviato da: ZiP!
il comando per abilitare il supporto multicore in doom 3 e quake 4 mi pare sia r_usesmp 1, ma almeno su q4 spesso causa crash vari del gioco...


credo 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
^TiGeRShArK^13 Aprile 2007, 00:26 #32
Originariamente inviato da: Spectrum7glr
e nonostante Intel abbia introdotto l'Hyperthreading nell' ormai lontano 2002...certo, non erano dual core veri, ma le prestazioni aumentavano almeno di un 30% con applicazioni in grado di sfruttare l'HT: i P4 anche dopo l'uscita dei primi A64 (e praticamente fino all'uscita dei dual core) sono stati la CPU di riferimento con quelle applicazioni di encoding e rendering che si avvantaggiavano delle soluzioni multi-CPU...di tempo per adeguarsi i programmatori di VG ne hanno avuto anche troppo (e tra l'altro il ritardo è ancora più inspiegabile considerando che la base installata di CPU con HT già nel 2004 era praticamente sterminata: almeno 3 CPU su 4 vendute erano Intel P4 con HT)

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).
^TiGeRShArK^13 Aprile 2007, 00:29 #33
Originariamente inviato da: Willy_Pinguino
forse il problema dell'ottimizzazione dual-multi core è un problema di compilatori-linguaggio da una parte e istruzioni dall'altra...

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.
^TiGeRShArK^13 Aprile 2007, 00:33 #34
Originariamente inviato da: ErFiaschi
Scusa willy mi sembri molto preparato io sono un profano:

-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

-Ma i PowerPC possono "spalmare" automaticamente sui vari core anche un calcolo derivato da C nato per essere in sequenza? (vedi kernel SMP di unix e linux)

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
-SE si, oltre ai vecchi MAC e alle PS3 con linux, un plebeo come me dove può trovare powerPC a buon prezzo?

Grazie mille!

secondo te ci sarà qualche motivo se anche la apple ha abbandonato i G5 in favore dei processori intel.... o no?
^TiGeRShArK^13 Aprile 2007, 00:37 #35
Originariamente inviato da: mjordan
Presto fatto:
[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
Samuele8613 Aprile 2007, 00:48 #36
beh...speriamo di riuscire ad avere giochi ke si adattino ai nuovi processori...e sfruttino a pieno la loro potenza di calcolo...x giochi sempre migliori...
mjordan13 Aprile 2007, 01:18 #37
Originariamente inviato da: ^TiGeRShArK^
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


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?
Motosauro13 Aprile 2007, 09:10 #38
Originariamente inviato da: mjordan
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?
^TiGeRShArK^13 Aprile 2007, 09:34 #39
Originariamente inviato da: Motosauro
azzardo: la seconda che hai detto (?)

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.
Motosauro13 Aprile 2007, 09:58 #40
Originariamente inviato da: ^TiGeRShArK^
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.


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 (oddio, io sono ancora ben lontano dall'aver bisogno di implementare un vero parallelismo, ma la cosa m'ingrifa)

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".

La discussione è consultabile anche qui, sul forum.
 
^