MaxDegreeOfParallelism = Environnement.ProcessorCount ralentit le temps d'exécution sur mon CPU
J'ai le programme suivant (que j'ai reçu de http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx) qui divise la tâche à l'aide de Parallèle.Pour boucle
class Program
{
static void Main(string[] args)
{
var watch = Stopwatch.StartNew();
Parallel.For(2, 20, (i) =>
{
var result = SumRootN(i);
Console.WriteLine("root {0} : {1} ", i, result);
});
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadLine();
}
public static double SumRootN(int root)
{
double result = 0;
for (int i = 1; i < 10000000; i++)
{
result += Math.Exp(Math.Log(i) / root);
}
return result;
}
}
Lorsque j'exécute ce test plusieurs fois que je reçois des fois:
1992, 2140, 1783, 1863 ms etc etc.
Ma première question est, pourquoi les horaires sont toujours différents?? Je suis en train de faire exactement les mêmes calculs à chaque fois pourtant, les temps varient à chaque fois.
Maintenant, quand je ajouter le code suivant à faire usage de tous les processeurs disponibles sur mon CPU:
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount (On my CPU this is 8)
};
Parallel.For(2, 20, parallelOptions, (i) =>
{
var result = SumRootN(i);
Console.WriteLine("root {0} : {1} ", i, result);
});
Je remarque que le temps d'exécution augmente effectivement!! Les temps sont maintenant:
2192, 3192, 2603, 2245 ms etc etc.
Pourquoi cette cause à la fois d'augmenter? Suis-je à l'aide de ce mal?
Pour obtenir vraiment des résultats comparables, d'éviter les sorties de la console à partir de ces fils.
J'ai Outlook ouvert, ouvrir EverNote et google Chrome le navigateur web.
Son en mode Release et pas de débogueur ou quoi que ce soit est attaché.
Je pense que c'est le Casier principe au travail. Vous demandez à 8 threads pour faire 18 emplois, les 2 derniers emplois de prendre autant de temps que de 8 emplois. Lorsque vous retirez la limite, le TP planificateur permet plus de 8 threads pour commencer, car ils prennent trop de temps. Qui va ralentir à chaque travail, mais peut se débarrasser de la dernière 2.
OriginalL'auteur Harry Boy | 2013-12-27
Vous devez vous connecter pour publier un commentaire.
De http://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs. 110).aspx
Cela signifie que le réglage de
MaxDegreeOfParallelism
le nombre de processeurs en effet de limiter la capacité de laParallel.For
boucle d'utiliser le montant optimal de threads pour la charge de travail. Par exemple, j'ai une migration de travail qui utilise près de 60 fils sur environ 600 itérations de long-code en cours d'exécution beaucoup plus que la 1 thread par processeur limite que vous êtes en train de définir.MaxDegreeOfParallelism
ouThreadPool.SetMaxThreads
doit être utilisé uniquement si vous explicitement la nécessité de prévenir plus d'un certain nombre de threads de s'exécuter. Par exemple, si vous utilisez une base de données Access, je voudrais définir à 64 ans, parce que le nombre maximal de connexions simultanées qui peuvent être traitées par l'Accès à un seul processus.J'ai effectivement changé la valeur de MaxDegreeOfParallelism = Environnement.ProcessorCount à MaxDegreeOfParallelism = 16 et vu qu'il courait plus vite. Vous voyez que je suis en train de créer un outil de test qui est utilisé pour tester combien de temps différents Processeurs effectuer une tâche et je veux avoir le même test pour chaque CPu c'est pourquoi je veux mettre une limite sur le nombre de Threads.
Quelqu'un peut-il m'expliquer la suite. Si j'ai mis MaxDegreeOfParallelism = Environnement.ProcessorCount (8) est-ce à dire un thread est en cours d'exécution sur chaque processeur, donc cela signifie que la tâche est vraiment être exécutées en parallèle? Et si j'ai mis MaxDegreeOfParallelism à 16 alors cela voudrait dire qu'il y a 2 threads en cours d'exécution sur chaque processeur, mais que chacune de ces deux threads ont pour basculer entre les uns des autres de sorte qu'il n'est pas vrai traitement en parallèle??
Avec TPL, vous ne pouvez pas supposer, par défaut, un certain nombre de threads sera créée et exécutée simultanément. Il permettra de créer/exécuter autant de threads que le nécessaire pour la charge de travail. Vous pouvez essayer de le faire fonctionner avec pool de threads.SetMinThreads ainsi que pool de threads.SetMaxThreads de 8, mais je ne suis même pas sûr que serait une garantie de 8 threads. Aussi, il vous faut tenir compte de la manipulation du fil de surcharge.
Je pense que c'est important de faire la différence entre le CPU des tâches et IO-tâches limitées. Votre code en cours d'exécution est susceptible IO-lié, il est donc logique d'utiliser plus d'un thread par core. Mais le code de cette question est lié au PROCESSEUR, où il est généralement conseillé d'utiliser un thread par core.
OriginalL'auteur Benjamin Beaulieu