Processori Multicore e FSX: come migliorare le prestazioni?

Informazioni generali e quesiti sul simulatore della Microsoft
Rispondi
Avatar utente
I-ENRI
PVI Member
Messaggi: 312
Iscritto il: lun dic 01, 2008 10:13 am

Processori Multicore e FSX: come migliorare le prestazioni?

Messaggio da I-ENRI » lun set 20, 2010 4:41 pm

Ciao a tutti,

approfittando di alcune domande che sono state fatte in mailing list, ho fatto un po' ricerche e di esperimenti circa il miglior utilizzo di FSX sui pc dotati di processore multicore, in particolare l'Intel i7 (ma anche il Core2 Quad).

Vorrei condividere con voi i risultati di queste ricerche e alcuni suggerimenti che potrebbero aiutare a migliorare le prestazioni del nostro simulatore.

In pratica i core multipli, semplificando molto, non sono altro che dei processori autonomi interni al processore stesso: se ne abbiamo di più, il processore riesce a fare meglio più cose contemporaneamente.
Come si può apprendere sui vari forum in rete, il parametro che dice a FSX come andare a suddividersi sui vari core si chiama "AffinityMask".
Il punto è: che valore dobbiamo dare a questo parametro, per esempio nel caso dell'i7?

Per capirlo ci tocca fare un po' di noiosa teoria.
AffinityMask è appunto una "maschera", cioè un numero che converito in binario ci presenta una cifra "1" nelle posizioni laddove vogliamo abilitare un core, e un valore "0" nelle posizioni laddove vogliamo disabilitare un core.
Se i core sono otto, la posizione pù a destra rappresenta il primo core (detto "core0", perché i teorici partono sempre da zero, non da uno...) mentre quella più a sinistra l'ottavo core (detto "core7").
Ad esempio: inseriamo "0000 1111" (che in decimale corrisponde a 15) e il nostro FSX userà i primi quatto core, numerati da 0 a 3, e solo quelli.

Detto questo vediamo come lavora Il processore i7.
L'i7 ha quattro core reali, cioè come dicevamo sopra quattro processori interni ognuno con un proprio circuito che può lavorare separatamente dagli altri.
Ciascuno di questi quattro core PUO' poi a sua volta essere suddiviso in due parti, ma questa volta solo "virtualmente", cioè tramite un meccanismo software (sempre interno al processore).
Oguna di queste due parti è detta "Thread": il thread principale, che corrisponde al core fisico, e il thread secondario, che corrisponde al core creato per così dire virtualmente. Questo meccanismo è chiamato "HyperThreading" (HT).

Perchè ho evidenziato la parola "può"? Perché l'Hyperthreading può essere abilitato oppure disabilitato, e questa opzione si può scegliere tra le configurazioni del BIOS (quella serie di menù che possono essere attivati al boot della macchina, prima che parta Windows).
Di default l'HT è abilitato, salvo impostazioni particolari del costruttore.
Vedremo dopo che sapere come è impostata questa opzione è importante per impostare correttamente il parametro AffinityMask.

Il tema che ci riguarda da vicino è che FSX sembra non girare altrettanto bene sui thread secondari (o core virtuali, come possono anche essere chiamati), rispetto a quanto fa sui thread principali (o core fisici).
Dico sembra perché sono osservazioni puramente sperimentali, mentre sto ancora cercando conferme e pareri sulla ragione di questo fatto dagli esperti in rete.

In ogni caso, se noi assegnamo a FSX i core fisici, gira molto meglio che non se gli assegnamo i core virtuali. Per molto meglio non intendo solo un frame rate più alto (di poco), ma soprattutto una fluidità maggiore, cioè meno micro-scatti.

C'è poi un secondo punto, che è valido per FSX ma anche in generale per tutti i software. Se noi andiamo a dire a un programma di suddividersi su più core del processore, dato che il programma è sempre uno, è ovvio che ci dovrà essere un lavoro di coordinamento e passaggio dei dati tra i vari compiti suddivisi sui diversi core. Cioè il processore dovrà spendere tempo e memoria per organizzare e far parlare tra loro i vari task suddivisi tra i vari core. Questo lavoro ovviamente costa in termini di prestazioni.
Si capisce allora che ha senso usare più core per uno stesso programma solo fino a un certo punto: fino cioè a che il sovraccarico di coordinamento non controbilancia negativamente il miglioramento di prestazioni conseguente alla suddivisione. Il discorso è diverso quando i software sono più di uno, pensiamo ai diversi programmi aperti sul PC: qui il sovraccarico è molto minore perché essenzialmente software separati non hanno bisogno di parlarsi tra loro o se lo fanno lo fanno tramite altri meccanismi.

Traiamo dunque due importanti conclusioni per FSX:
1. Sembra opportuno usare solo i core principali e non quelli secondari; anche se sarebbe utile avere più dati sperimentali su questo.
2. E' meglio usare solamente solamente tre o al massimo quattro core, piuttosto che un numero superiore, anche se fossero tutti core fisici.

A questo punto, prima di definire quale valore usare per AffinityMask, aggiungiamo un po' di teoria sui meccanismi interni di FSX.
FSX è programmato in modo che fa girare SEMPRE sul primo core (il core0) un certo task, e precisamente il disegno del reticolo del terreno (Fiber Frame in Inglese): in pratica la struttura "a filo di ferro" che disegna i profili altimetrici del terreno su cui voliamo. I profili ma, attenzione, non le texture.
Questo lo fa a prescindere dal valore che noi diamo ad AffinityMask. Il punto è che se noi diciamo ad AffinityMask di NON usare il core0, questo rimane libero solo per il Fiber Frame, è ciò è un bene, vedremo tra pochissimo perché.
Poi ci sono altri due task che FSX è in grado di assegnare ai core: il Main Scheduler, che si occupa praticamente di tutta la simulazione (modello di volo, strumenti, meteo, ecc.); e il Texture Manager, che si occupa delle campiture di tutta la grafica (terreno, oggetti, edifici, ecc.).
Il Main Scheduler è in assoluto il task più pesante di tutti, quello che impiega più risorse del processore, e può girare su UN SOLO core, FSX cioè non è in grado di suddividerlo, purtroppo.
Il Main Schduler gira NECESSARIAMENTE sul primo core a disposizione così come è definito da AffinityMask. Se noi diciamo ad AffinityMask che può usare il core0, ecco che il Main gira sullo stesso core del Fiber, e questo peggiora le prestazioni.
Il Texture Manager invece può essere suddiviso su tutti i core a disposizione.

In pratica le soluzioni migliori sono due:

A)
Core0: Solo Fiber Frame
Core1: Main Scheduler
Core2: Texture Manager
Core3: Texture Manager

B)
Core0: Solo Fiber Frame
Core1: LIBERO PER ALTRI TASK DEL COMPUTER
Core2: Main Scheduler
Core3: Texture Manager

Questo è vero sia per i quad che per gli i7.
Se abbiamo un i7 con HyperThreading abilitato e vogliamo, come dicevamo sopra, usare solo i core primari (che sono quelli con cifra pari, cioè 0, 2, 4 e 6) i valori di AffinityMask devono essere:

caso A): AffinityMask=84 (ovvero 0101 0100 binario); per i quad o per l'i7 con HyperThreading disabilitato, sarebbe il famosissimo AffinityMask=14;
caso B): AffinityMask=80 (ovvero 0101 0000 binario); per i quad o per l'i7 con HyperThreading disabilitato corrisponde ad AffinityMask=12.

Per sapere se avete l'HT abilitato oppure no basta guardare nel Task Manager di Windows alla voce performance, se ci sono otto grafici per il processore è abilitato, se ce ne sono quattro è disabilitato.

Nei miei esperimenti, ho trovato migliore la soluzione B) che non la A), anche se leggermente.
Evidentemente, la suddivisione del Texture Manager su due core è controbilanciata negativamente dal sovraccarico di coordinamento che ne deriva. Ma questo va verificato da sistema a sistema, potrebbe anche essere diverso su altri PC.
Come sempre, ciascuno deve fare prove e tentativi per trovare la soluzione migliore sul proprio sistema, ma almeno se c'è qualche linea guida si sa come muoversi... :-)

Bene... questo è quanto... ora che sono sicuro di avervi tediato, se qualcuno è arrivato fin qui da sveglio... lo ringrazio dell'attenzione e... BUONI FPS!!

Enrico
Pvi Bologna
I-ENRI

Avatar utente
I-CKSG
PVI Member
Messaggi: 69
Iscritto il: sab giu 10, 2006 4:42 pm

Re: Processori Multicore e FSX: come migliorare le prestazioni?

Messaggio da I-CKSG » sab set 25, 2010 8:49 am

Ottimo articolo, spiegazione interessante ed esauriente.
Sto cercando di ottimizzare FSX su una nuova installazione con Windows Seven che mi da qualche problemino.
Ho un processore i7 con HyperThreading abilitato e dopo aver usato AffinityMask=255 ho provato con 84 e 80.
E' normale che con questi valori il core0 venga "usato" così poco? (non raggiunge il 20% mentre prima tutti i core viaggiavano su 80/100%)

Saluti
XP64_FSX_TM_84.JPG
AffinityMask=84
XP64_FSX_TM_84.JPG (58.03 KiB) Visto 14220 volte
Claudio "Saguar" Chiossi

Immagine

Avatar utente
I-ENRI
PVI Member
Messaggi: 312
Iscritto il: lun dic 01, 2008 10:13 am

Re: Processori Multicore e FSX: come migliorare le prestazioni?

Messaggio da I-ENRI » lun ott 04, 2010 6:43 pm

Sì, direi che è normale! :-)

Sul core0 infatti gira sempre e necessariamente il Fiber Frame, che non è un task particolarmente gravoso per il processore, soprattutto per un i7; e con i settaggi di cui sopra gli altri task vengono spostati su altri core.

Il Fiber, lo ricordo, è quello che disegna la struttura a filo di ferro del terreno leggendo i dati dalle terrain mesh; il carico di lavoro che esso richiede al processore, come potete facilmente intuire, dipende strettamente dall'orografia del terreno che stiamo sorvolando: molti rilievi e molto variegati, carico alto; pianure o addirittura mare, carico molto basso.
Anche nel mio caso il carico del core0 molto raramente supera il 20-30%.

Il fatto che un core non raggiunga mai il 100%, in realtà, è assolutamente desiderato e desiderabile: è proprio quando il processore si satura che abbiamo i famigerati micro scatti...

Per chi sta provando queste ottimizzazioni, suggerisco di provare un'altra cosetta, sempre in abbinamento ai settaggi di AffinityMask fatti su fsx.cfg.
Dal Task Manager, andate nella Tab "processi", selezionate il processo FSX.EXE, poi fate clic con il tasto destro.
Dal menu che si apre, selezionate "Imposta affinità", togliete il segno di spunta da tutti i core e poi rimettetelo solamente sui core 0, 2, 4 e 6; poi date Ok.
Ora, guardando i grafici, dovreste vedere che il carico si distribuisce ancora più uniformemente sui quattro processori selezionati, e tutti i core non raggiungono mai il 100%.
Per ora la ragione esatta di questo comportamento non mi è chiara; ma di fatto (almeno sul mio sistema) questo dà un ulteriore contributo alla riduzione o eliminazione dei micro scatti. Se qualcuno ha risultati analoghi, me lo faccia sapere! :-)
Logicamente questo settaggio non rimane in memoria e va fatto ogni volta che si usa il simulatore.

Ciao!

Enrico
I-ENRI
Immagine Immagine Immagine Immagine

Avatar utente
I-ENRI
PVI Member
Messaggi: 312
Iscritto il: lun dic 01, 2008 10:13 am

Re: Processori Multicore e FSX: come migliorare le prestazioni?

Messaggio da I-ENRI » ven ago 26, 2011 2:22 pm

Ciao a tutti,
come promesso in mailing list, provo a dare la mia risposta al quesito di Roberto.

Roberto scrive:
NON HO invece DECISAMENTE CAPITO come giri la questione dell'andare poi a toccare di nuovo da TaskManager (in maniera "volatile") o con l'utility "ImageCFG" suggerita da Umberto (in maniera "stabile"). Intendo dire ... sono due fasi diverse dello stesso processo, o sono cose differenti? Non basta che FSX si prenda da FSX.cfg il valore di AffinityMask? Perche' andare a modificarlo ancora? E, piu' in particolare, come mai se AffinityMask ha passato ad FSX una mappatura 0101 0100 (84 decimale), io da TaskManager mi ritrovo su Imposta Affinita' una mappatura invece 1111 1111? Ma ancora di piu' NON CAPISCO il perche' a questo punto io debba intervenire, ad FSX gia' avviato, mettendo una spunta su CORE-0, -2, -4 e -6, che sarebbe una mappatura IN CONTRASTO con quella passata da AffinityMask. Infatti a questo punto io in finale sto "forzando" il programma ad una mappatura 0101 0101 (85 decimale), che non e' ne' la 84 del caso A), ne' la 80 del caso B)
Quando si imposta l'affinità per un processo sotto Windows (che, lo ricordo, equivale a dire al computer su quali core il processo, o task in inglese, deve essere fatto girare), questo si può fare in linea di principio due modi:

a) a livello di Sistema Operativo, tramite TaskManager oppure tramite l'utility ImageCFG suggerita da Umberto (http://www.robpol86.com/index.php/ImageCFG)
b) a livello di progamma applicativo (FSX è un progamma applicativo), se il progamma stesso lo consente, tramite una impostazione presente nel programma stesso: è il caso del parametro AffinityMask nel file fsx.cfg.

I due metodi non sono necessariamente esclusivi, nel senso che si possono anche usare insieme.

L'opzione a) di default, per tutti i processi che girano sotto Windows, è impostata a "fammi girare su tutti i core disponibili": e infatti se provate per un task qualsiasi nel task manager, vedrete che è presente il segno di spunta in tutte le caselline (4 se avete un Quad, 8 se avete un i7 con l'HyperThreading abilitato). Se noi andiamo a togliere il segno di spunta da alcune delle caselle, per esempio sulle quattro caselle dispari nel caso dell'i7, il processo in questione CREDERA' di avere a disposizione SOLAMENTE i quattro core principali del nostro i7. Per lui ogni altro core semplicemente non esiste.

Avrete già capito qual'è la conseguenza: che se da ora in poi andiamo a usare il metodo b), ovvero il parametro AffinityMask nel caso di FSX, esso non può fare altro che dire al programma su quali dei QUATTRO core esistenti esso può suddividersi. Ripeto, su QUALI DEI QUATTRO: perchè per lui ce ne sono quattro e stop. E quindi il parametro sensatamente non può che ammettere valori tra 0 e 15.

E' da capire come FSX si comporta se legge per esempio 84: lo ignora? oppure ne considera solo una parte che può ricondurre a un numero compreso tra 0 e 15 (i quattro bit più a destra, o i quattro o più a sinistra)? O altro ancora? Questo è da indagare... a me sembra che lo ignori ma non ho dati sufficienti per affermare il contrario, al momento.

Il metodo a) in sostanza è ad un livello più basso del metodo b), ed è per questo che se usiamo solo il metodo b) non vediamo nessuna modifica alle caselle di spunta nel Task Manager: in pratica il programma (FSX) SA CHE HA OTTO PROCESSORI a disposizione, e decide sulla base del metodo b) come utilizzarli.

Va da sè che l'implementazione del metodo b) è totalmente demandata all'applicativo (sempre FSX nel nostro caso), quindi può esserci o non esserci (in FSX è AffinityMask=xx), e si comporta in un modo che è totalmente definito dai progammatori dell'applicativo.

E qui vengo al secondo punto importante: FSX come scrivevo nel post originale qui sopra utilizza sempre e comunque il core 0: o meglio, a questo punto dovrebbe essere chiaro, quello definito come tale dal metodo a), e suddivide il carico sugli altri core che CREDE di avere a disposizione, secondo quanto specificato dal metodo b).

Non ho mai provato a fare esperimenti impostando solo i core pari da Task Manager e poi variando il parametro AffinityMask con valori compresi tra 0 e 15 (i valori che hanno senso sono 14 e 12, come si legge nel post sopra); in pratica infatti sul mio sistema i7 i risultati erano ottimi già con =80, e migliorava ulteriormente la fluidità usando anche il metodo a) come dicevo alla fine del post; bisognerebbe verificare cosa succede usando solo il metodo a) e togliendo AffinityMask=xx, oppure dandogli i valori 12 o 14.

Enrico
Immagine Immagine Immagine Immagine

Avatar utente
I-BOLU
PVI Member
Messaggi: 638
Iscritto il: dom apr 02, 2006 9:25 pm

Re: Processori Multicore e FSX: come migliorare le prestazioni?

Messaggio da I-BOLU » ven dic 30, 2016 5:58 pm

Immagine Immagine

Rispondi

Torna a “FSX [ALL]”

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite