J'ai besoin de paralléliser une méthode qui effectue une comparaison par paire exhaustive sur les éléments d'une liste. L'implémentation en série est directe:Boucles Parallel.ForEach imbriquées dans la même liste?
foreach (var element1 in list)
foreach (var element2 in list)
foo(element1, element2);
Dans ce cas, foo ne modifiera pas l'état de element1 ou element2. Je sais que ce n'est pas sûr simplement faire des déclarations de Parallel.ForEach imbriquées:
Parallel.ForEach(list, delegate(A element1)
{
Parallel.ForEach(list, delegate(A element2)
{
foo(element1, element2);
});
});
Quelle serait la meilleure façon de mettre en œuvre cette aide de la bibliothèque de tâches en parallèle?
Ne présumez pas que PFX va créer autant de fils car il y a des tâches parallèles - c'est plus intelligent que ça. –
Bien sûr que non. Par défaut, il crée autant de threads que de cœurs. Mais le problème est qu'après chaque itération, il passera du temps à essayer de trouver quel thread doit exécuter l'itération suivante. –
Je ne pense pas qu'il dise qu'il y aura autant de threads, juste que la mise en file d'attente d'une tâche pour chaque appel de fonction aura beaucoup plus de frais que l'invocation du moteur PFX pour chaque boucle externe. – Gabe