2013-08-27 8 views
6

Sto testando un programma su un server, che esegue Windows Server 2008 R2 Enterprise a 64 bit, e ha 4 processori Intel E7-4870, totale 40 core e 80 thread disponibili (Riesco a vedere gli 80 grafici di utilizzo della CPU nel Task Manager di Windows).Impossibile utilizzare più della metà del thread disponibile totale nella CPU

Il codice del programma è come:

numlist è Elenco contiene centinaia di numeri, ognuno è un parametro da utilizzare in qualche calcolo

Parallel.ForEach(numlist, num => 
       { 
        // do some calculation using parameter = num    
       }); 

Il problema è che quando ho eseguito questo PROGRM su il server, solo la metà dei thread disponibili viene mostrata per essere utilizzata in Windows Task Manager (ovviamente l'utilizzo della CPU è mostrato al 50%) e il resto di 40 sono completamente inutilizzati e inattivi.

Ho anche testato lo stesso programma su un altro server che ha solo 2 processori e in totale 24 thread disponibili, e tutti i 24 thread saranno completamente utilizzati e l'utilizzo della CPU è mostrato al 100%.

Esiste un modo per rendere il server 40-core CPU l'esecuzione di questo programma e di utilizzare completamente tutti i suoi 80 thread disponibili (o circa 80 thread)? Le prestazioni non sono abbastanza buone quando viene utilizzato solo il 50% delle risorse della CPU.


Ecco il codice di programma completo sto testando:

namespace Test 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Console.WriteLine("Press any key to start"); 
      Console.ReadLine(); 
      List<int> numlist = new List<int>(); 
      for (int i = 0; i < 100; i++) 
      { 
       numlist.Add(i); 
      } 

      Parallel.ForEach(numlist, num => 
           { 
           while (true) 
           { 
            num++; 
           } 
          }); 

     } 
    } 
} 

quando viene eseguito su un server con 2 processori Intel X5690 (per un totale di 24 thread disponibili), tutti i 24 thread vengono utilizzati e l'utilizzo della CPU è mostrato al 100%;

Ma quando lo eseguo sul server 4 processori con 80 thread disponibili, vengono utilizzati solo 40 thread e l'utilizzo della CPU è solo del 50%. C'è qualche impostazione del compilatore relativa a questo?

+0

Sei sicuro di avere più di 40 numeri? Non ci sono molte informazioni qui, sarà difficile capire il problema. –

+0

Sì, per creare il numlist, inserisco questo codice prima del loop parallelo: Lista numlist = new List (); per (int i = 0; i <100; i ++) { numlist.Add (i); } – CMinusGuy

+2

Provare a usare 'MaxDegreeOfParallelism' in' ParalellOptions' –

risposta

7

A seconda del tipo di lavoro, hyper threading non è sempre d'aiuto. Con molti tipi di operazioni matematiche pure, ogni core può elaborare solo un elemento di lavoro in modo efficace, non 2 come suggerito dal "thread count" del processore.

I thread Hyper non sono in realtà core separati, quindi le istruzioni che vengono eseguite su di essi non sempre portano a guadagni. Questo è discussed here:

A seconda della configurazione del cluster e, soprattutto, la natura dell'applicazione in esecuzione sul cluster, miglioramento delle prestazioni può variare o addirittura essere negativo. Il passo successivo consiste nell'utilizzare strumenti di performance per capire quali aree contribuiscono al miglioramento delle prestazioni e quali aree contribuiscono al degrado delle prestazioni.

filettatura Hyper tende a portare a circa un aumento del 30% delle prestazioni complessive nel migliore dei casi. Affinché funzioni, in genere occorrono diverse istruzioni della CPU che passano attraverso ciascun thread sul core, in modo che il core possa svolgere il lavoro correttamente. Quando si esegue lo stesso calcolo in parallelo su molti "thread della CPU" iperfilo, spesso non si vedrà alcun vantaggio rispetto a un processo in esecuzione per core.

Ciò può anche essere dovuto al fatto che si sta utilizzando il codice gestito, che sarà limitato al gruppo di processori 0, poiché CLR non utilizza le nuove istruzioni NUMA in Windows 2008 R2.Pertanto, se il sistema è configurato in modo tale che il gruppo di processori 0 è composto da 40 processori e gli altri 40 sono suddivisi nel gruppo di processori 1, con questo processo è possibile saturare l'intero primo gruppo di processori. Per dettagli, vedere How to Get Started with Multi-Core: Parallel Processing You Can Use.

+0

Sì, comprendo le variazioni delle prestazioni in questa situazione, ma la mia preoccupazione principale è, perché sul server con 2 processori a 24 processori, tutti i thread sono completamente utilizzati; ma sul server thread 4 da 80 processori, solo la metà viene utilizzata? Il compilatore .Net "pensa" 80 thread è troppo per il mio programma? – CMinusGuy

+0

@CMinusGuy E 'molto difficile dirlo senza vedere il tuo lavoro, ma potrebbe essere che il "server 24 thread" sia 2, 12 processori core, dove il tuo "server 80 thread" è 4, 10 processori core che sono hyperthreaded. –

+0

@CMinusGuy Modificato per il collegamento a un altro articolo. Il sistema potrebbe avere l'impostazione del gruppo processore per utilizzare solo 40 proc, non il potenziale 64, quando si utilizza il codice gestito. –

Problemi correlati