2010-10-04 13 views
5

Abbiamo ottenuto un MacPro a 12 core per eseguire alcuni calcoli Monte Carlo. I suoi processori Intel Xeon hanno Hyper-Threading (HT) abilitato, quindi in realtà dovrebbero esserci 24 processi in esecuzione in parallelo per renderli pienamente utilizzati. Tuttavia, i nostri calc sono più efficienti da eseguire su 12x100% rispetto a 24x50%, quindi abbiamo tentato di disattivare Hyper-Threading tramite il pannello Processor nelle preferenze di sistema per ottenere prestazioni più elevate. Si può anche trasformare HT via daDisattivazione di Hyper-Threading in Intel Xeon a 6 core

hwprefs -v cpu_ht=false 

Poi abbiamo eseguito alcuni test e qui è quello che abbiamo ottenuto:

  1. 12 task paralleli eseguiti contemporaneamente w/o w/o HT per la nostra delusione.
  2. 24 task paralleli allentato 20% se HT è spento (non -50% come abbiamo pensato)
  3. Quando HT inizia, passando da 24 a 12 attività diminuisce l'efficienza del 20% (anche sorprendente)
  4. Quando HT è spento, il passaggio da 24 a 12 non cambia nulla.

Sembra che Hyper-Threading riduca solo le prestazioni per i nostri calcoli e non c'è modo di evitarlo. Il programma che usiamo per i calc è scritto in Fortran e compilato con gfortran. C'è un modo per renderlo più efficiente con questo pezzo di hardware?


Aggiornamento: nostri calcoli Monte Carlo (MCC) sono in genere fatto in passi per evitare la perdita di dati e per altri motivi (che non è sempre possibile evitare tali misure). Nel nostro caso ogni passo consiste in molte simulazioni con durata variabile. Poiché ogni passaggio è suddiviso tra un numero di attività parallele, hanno anche una durata variabile. In sostanza, tutte le attività più veloci devono attendere fino a quando non viene eseguito il più lento. Questo fatto ci costringe a fare passi più grandi, che finiscono con meno deviazioni nel tempo a causa della media, quindi i processori non perdono tempo ad aspettare. Questa è la nostra motivazione per avere 12 * 2.66 GHz invece di 24 * 1.33 GHz. Se fosse possibile disattivare HT, otterremmo circa il 10% di prestazioni passando da 24 task w/HT a 12 task senza HT. Tuttavia, i test mostrano che perdiamo il 20%. Quindi la mia conclusione è che il calcolo è del 30% inefficiente.

Per i test ho utilizzato gradini piuttosto grandi, tuttavia di solito i passaggi sono più brevi, quindi l'efficienza diventa ancora più lunga.

C'è un motivo in più: alcuni dei nostri calcoli richiedono 3-5 GB di memoria, quindi probabilmente vedrete quanto sarebbe economico per noi avere 12 attività veloci. Stiamo lavorando per implementare la memoria condivisa, ma sarà un progetto a breve termine. Pertanto, dobbiamo scoprire come rendere l'hardware/software esistente il più velocemente possibile.

+0

http://forums.macrumors.com/archive/index.php/t-733238.html – rwong

+0

Normalmente questo può essere disattivato nell'impostazione del BIOS, ma non ho familiarità con i Mac, quindi potrebbe non essere applicabile. –

+2

C'è qualcosa di strano nella tua domanda ... Sembra che * guadagni * da HyperThreading, ma lo disabiliti? Dici che il tuo calcolo è più efficiente con 12 // rispetto a 24, ma i tuoi test sembrano dire il contrario. Allora, perché vuoi disabilitare HT? – jv42

risposta

7

Questo è più di un commento esteso che una risposta:

non trovo le tue osservazioni terribilmente sorprendente. L'hyper-threading è un approccio alla parallelizzazione di un uomo povero, che ti consente di avere 2 pipeline di istruzioni in sospeso su una CPU. Ma non fornisce unità aritmetiche in virgola mobile o intero o più registri; quando una pipeline non è in grado di alimentare l'ALU (o quello che viene chiamato in questi giorni) l'altra pipeline viene attivata entro un ciclo di clock o due. Ciò contrasta con la situazione su una CPU senza hyperthreading in cui, quando la pipeline di istruzioni si blocca, deve essere svuotata e ricaricata con le istruzioni di un altro processo prima che la CPU riprenda a funzionare.

Il Wikipedia article on hyperthreading spiega tutto questo piuttosto bene.

Se si eseguono carichi in cui i blocchi di pipeline sono perfettamente sincronizzati e rappresentano una parte importante del tempo di esecuzione totale del programma mix, è possibile raddoppiare la velocità di un programma passando da un processore unhyperthread a un processore hyperthreaded .

Se (è un grande se) è possibile scrivere un programma che non è mai stato bloccato nella pipeline di istruzioni, quindi l'hyperthreading non fornirebbe alcun beneficio (in termini di accelerazione di esecuzione). Quello che hai misurato non è un aumento di velocità dovuto a HT (beh, si tratta di un aumento di velocità dovuto a HT ma in realtà non lo si vuole) ma il fallimento dei thread per mantenere la pipeline in movimento.

Quello che devi fare è effettivamente ridurre l'aumento di velocità a causa di HT! O, piuttosto, devi aumentare il tasso di esecuzione dei 12 processi (uno per core) mantenendo la pipeline riempita. Personalmente, spegnerei hyperthreading mentre ottimizzavo l'esecuzione del programma su 12 core.

Buon divertimento.

1

Bene, questo significa che con HT attivo, passando da 12 attività a 24 attività aumenta l'efficienza del 20%! Buon benchmarking!

D'altra parte, se il programma è scritto in modo che ogni thread possa funzionare solo su un'attività separata (anziché essere in grado di suddividere una singola attività in blocchi più piccoli e procedere contemporaneamente), quindi allo scopo di ridurre la latenza per ogni attività (dall'inizio alla fine) è sufficiente limitare il numero di thread a 12 nel software. L'interruttore HT dell'hardware può rimanere in entrambe le posizioni.

2

Sto avendo un po 'di difficoltà a comprendere la tua descrizione dei parametri.

Definisce il 100% come la quantità di lavoro che si riesce a svolgere con 12 attività e ht off. E se dovessi essere in grado di ottenere il doppio di quanto fatto nello stesso periodo di tempo, lo chiameremmo al 200%. Quindi, quali sono i numeri che inseriresti nelle altre tre caselle?

Edit: aggiornato con i numeri.

   without HT  with HT 
12 tasks  100%   100% 
24 tasks  100%   125% 

Quindi, la mia comprensione è che con HT disabili, ci sono dei vuoti di tempo, mentre le discussioni che sono fondamentalmente in pausa (come ad esempio quando sono in attesa per i dati dalla memoria o dal disco), quindi in realtà non correre a 2,66 GHz, ma un po 'meno. Con l'hyperthreading abilitato, il CUP cambia le attività invece di fare una pausa per questi momentanei spazi vuoti, quindi aumenta la quantità totale di potenza di elaborazione utilizzata.

+0

la tua tabella è una grande idea. '12 + HT = 100%', '24 + HT = 125%', '24-HT = 100%'. Mi aspettavo di ottenere '12-HT = 125-140%' invece di 100. Ma questo sembra impossibile. –

0

Vedere questa registrazione per un'app negli strumenti Xcode per abilitare/disabilitare l'hyperthreading (e il numero di CPU attive). L'impostazione NON persiste durante l'interruzione o il riavvio: http://www.logicprohelp.com/forum/viewtopic.php?f=5&t=88835

(Si esegue l'app Strumenti, si annulla la schermata iniziale e quindi si modificano le Preferenze CPU).

Problemi correlati