2015-08-24 8 views
6

Sto facendo pesanti calcoli matematici utilizzando Math.Net Numerics in parallelo all'interno del blocco Parallel.For.Parallelamente. Per non utilizzare tutti i core

Quando eseguo il codice nel mio sistema locale con 4 core (2 * 2), utilizza tutti i 4 core.

Ma quando eseguo lo stesso codice nel nostro server di sviluppo con 8 core (4 * 2), utilizza solo 4 core.

Ho provato a impostare MaxDegreeOfParallism, ma non ho potuto aiutare.

Qualche idea sul perché tutti i core non vengano utilizzati.

Di seguito è riportato un codice di esempio.

Parallel.For(0,10000,(i)=> 
{ 

// heavy math computations using matrices 
}); 
+1

Fa il server ha 8 core o 4 core che supportano hyper threading – vcsjones

+0

@vcsjones:?? 4 CPU e ciascuno ha 2 core in modo totale 4 * 2 = 8 core – malkam

+0

Stai utilizzando un provider nativo Si noti che in Algebra lineare Math.NET Numerics è esso stesso parallelizzato (almeno in alcune parti) - se si preferisce eseguire la propria parallelizzazione in cima, si consideri di disabilitare la parallelizzazione di Math.NET chiamando 'Control.UseSingleThread();' –

risposta

0

Da MSDN

Per default, e per PerOgni utilizzerà comunque molte discussioni scheduler sottostante fornisce, così cambiando MaxDegreeOfParallelism da predefinito unici limiti come verranno utilizzate molte attività simultanee.

Il modo in cui ho letto la documentazione: se lo scheduler sottostante offre solo un singolo thread, quindi l'impostazione MaxDegreeOfParallelism > 1 sarà ancora tradurrà in un singolo thread.

+0

Sono stati creati più thread/attività. Ma sono stati eseguiti solo su 4 core quando sono disponibili 8 core. – malkam

+0

Lo scheduler del pool e il runtime/TPL stanno effettivamente decidendo quali thread eseguire dove e quando. Se il runtime pianifica solo su 4 core logici, questo è il numero che verrà eseguito contemporaneamente, indipendentemente dal numero di thread che sono stati creati. – theB

1

La parallellizzazione viene eseguita in runtime, in base alle condizioni attuali e a molte altre circostanze. Non è possibile forzare .NET a utilizzare tutti i core (almeno nel codice gestito).

Da MSDN:

"Al contrario, per impostazione predefinita, i metodi e Parallel.ForEach Parallel.For possono utilizzare un numero variabile di compiti 'per questo che, per esempio, la classe ParallelOptions ha una proprietà MaxDegreeOfParallelism invece di una. Proprietà "MinDegreeOfParallelism": l'idea è che il sistema possa utilizzare meno thread di quanto richiesto per elaborare un ciclo Il pool di thread .NET si adatta in modo dinamico ai carichi di lavoro modificando il numero di thread di lavoro per le attività parallele nel tempo. tempo, il sistema osserva se aumentare il numero di thread migliora o diminuisce il throughput complessivo e regola di conseguenza il numero di thread worker.

Fare attenzione se si utilizzano loop paralleli con passi individuali che richiedono diversi secondi o più. Questo può verificarsi con carichi di lavoro legati all'I/O e lunghi calcoli. Se i cicli richiedono molto tempo, è possibile che si verifichi una crescita illimitata di thread di lavoro a causa di un'euristica per impedire la fame di thread utilizzata dalla logica dell'iniezione di thread della classe ThreadPool .NET. "