G/Ç bağımlı görevim var. WithDegreeOfParallelism = 10 ve WithExecution = ForceParallelism modunu kullanıyorum, ancak yine de sorgu yalnızca iki iş parçacığı kullanıyor. Niye ya?PLINQ neden sadece iki iş parçacığı kullanıyor?
PLINQ'nin genellikle çekirdek sayımla eşdeğer bir paralellik derecesi seçeceğini anlıyorum, ancak neden daha yüksek bir paralellik için özel isteğimi görmezden geliyor? Eğer bir olsaydı
static void Main(string[] args)
{
TestParallel(0.UpTo(8));
}
private static void TestParallel(IEnumerable<int> input)
{
var timer = new Stopwatch();
timer.Start();
var size = input.Count();
if (input.AsParallel().
WithDegreeOfParallelism(10).
WithExecutionMode(ParallelExecutionMode.ForceParallelism).
Where(IsOdd).Count() != size/2)
throw new Exception("Failed to count the odds");
timer.Stop();
Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
}
private static bool IsOdd(int n)
{
Thread.Sleep(1000);
return n%2 == 1;
}
Kaç tane işlemci/çekirdek var? – LukeH
İki. Ama özellikle paralellik derecesini 10 olarak belirttim. – ripper234
G/Ç bağlı bir göreviniz varsa ve bunu paralel olarak birden fazla iş parçacığında çalıştırırsanız hızı artırırsa, muhtemelen ilk etapta G/Ç bağlı değil. sadece kötü yazılmıştır (örneğin, eşzamanlılık yerine uyumsuzluk okur). –