2012-11-18 17 views
5

(załóżmy mam 10 rdzeni)Równoległe i podział pracy w C#?

Kiedy piszę:

Parallel.For(0, 100, (i,state) => 
     { 
      Console.WriteLine(i); 
     }); 

pytania:

  1. Jaka jest formuła przydzielania ilości numerów dla każdego rdzenia? (czy to jest 100/10?)

  2. Czy w punkcie wykonawczym każdy rdzeń zna już, z jakimi numerami sobie poradzi? Czy też za każdym razem zużywa nową liczbę/y z repozytorium [0..100] (zignorujmy teraz porcję lub zakres)?

  3. Parametr i - czy odnosi się do indeksu 0..100, czy jest to indeks względny w każdym wątku i jego numery "będzie obsługiwać"?

+0

Pytasz, w jaki sposób dane wejściowe są podzielone na partycje, ale mówisz nam, abyśmy zignorowali dwa sposoby korzystania z partycji "Parallel" w celu partycjonowania (partycjonowanie fragmentów i zakresów)? To nie ma dla mnie żadnego sensu. – svick

+0

@svick zarówno zakres, jak i porcja zużywają [n] elementy, w których n <= 1. Nie obchodzi mnie wartość [n]. ale jeśli jest to tak ważne, przyjmijmy, że n = 1. –

Odpowiedz

3
  1. To nie jest udokumentowana. Prawdopodobnie zadania robotnika sprawdzają fragmenty pracy ze wspólnej puli zadań. Prawdopodobnie zabierają mniej niż 10 przedmiotów naraz, ponieważ zrobienie 10 elementów może spowodować, że mniej niż 10 wątków będzie w pracy pod koniec operacji Parallel.For. Pojedynczy wolny wątek może utworzyć kolejne wąskie gardło, ponieważ może być jedynym wątkiem nadal działającym. Lepiej dzielić dzieło na mniejsze części, aby wąskie gardło stało się mniejsze.

  2. Nie wiem. Jestem prawie pewny, że trzeba będzie wyłuskać te informacje za pomocą Reflektora.

  3. Odnosi się do indeksu globalnego, dzięki czemu można go użyć do uzyskania dostępu do udostępnionej listy lub czegoś. Każda osoba odwiedzana przez delegata pracowniczego będzie niepowtarzalna.