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?
Sei sicuro di avere più di 40 numeri? Non ci sono molte informazioni qui, sarà difficile capire il problema. –
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
Provare a usare 'MaxDegreeOfParallelism' in' ParalellOptions' –