I ont besoin d'une itération d'une boucle parallèle pour utiliser 7 noyaux (ou rester à l'écart de 1 noyau), mais une autre itération à utiliser 8 (tous les noyaux) et essayé ci-dessous code:des affinités différentes de fil dans Parallel.For Itérations
Parallel.For(0,2,i=>{
if(i=0)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(255);
if(i==1)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(254);
Thread.Sleep(25);// to make sure both set their affinities
Console.WriteLine(Process.GetCurrentProcess().ProcessorAffinity);
});
cette sortie 255 pour les deux itérations. Ainsi, soit la boucle parallel.for utilise un thread unique pour eux, soit un paramètre définit également d'autres affinités d'itérations. Un autre problème est que ceci provient d'une application sensible à la latence et que tous ces paramètres d'affinité ajoutent une latence de 1 à 15 millisecondes.
Dois-je utiliser explicitement des discussions et ne devrais-je définir les affinités qu'une seule fois?
Modifier: J'ai essayé la version filetée, la même chose se produit. Même avec deux threads explicites, les deux écrit 255 à la console. Maintenant, il semble que cette commande est pour un processus pas un fil.
Le contexte OpenCL utilise des cœurs max pour l'exécution du noyau sur cpu en une seule itération. Autres itérations utilisant 1-2 cœurs pour copier les tampons et envoyer la commande aux périphériques. Lorsque cpu est utilisé par opencl, il utilise tous les cœurs et les périphériques n'ont pas assez de temps pour copier les buffers. La fission du dispositif semble être plus difficile que la résolution de ce problème.
Je ne sais pas assez pour aider ici, mais est-ce que Parallel.For utilise des threads ou le pool de tâches? Parce que je l'ai vu créer et détruire des degrés de parallélisme basés sur la demande du pool de tâches. Je suis à peu près certain que les threads ne font pas ça. J'ai maxDegree fixé à 26 comparaisons de 3.2Billion d'exploitation, et les discussions actives fluctueraient entre aussi peu que 5 et 26 sur les six jours qu'il a fallu pour terminer. Donc, même si je ne peux pas aider, je suis vraiment intéressé par votre question. –
Je ne pouvais pas trouver quelque chose comme minParallelismDegree pour cela, mais j'essaie des threads purs en utilisant le délégué de fonction anonyme et le gestionnaire d'événements maintenant. –
C'est une option que vous définissez dans Parallel.For - https://msdn.microsoft.com/fr-fr/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx comme je l'ai dit Je suis ignorant, mais cela pourrait vous aider à comprendre les choses sous le capot. –