Archive

Posts Tagged ‘ParallelOptions’

Rööpsusastme piiramine

Eelmises blogis vaatlesime, kuidas rööpe sektsioonimisega võib ehitada jadakoodi sektsioone ja piirata rööbete arvu. Tegelikult on .NETis olemas ka spetsiaalsed parameetrid.

double[] values = new double[10000];

List<int> threadids = new List<int>();

values.AsParallel().WithDegreeOfParallelism(5).ForAll(value =>
{
int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(id);
threadids.Add(id);
});

Console.WriteLine(threadids.Distinct().Count() + ” lõime”);

Ülaltoodud koodis näed sätet WithDegreeOfParallelism, mis minu katsete põhjal piirab kasutatavate lõimede arvu. Me lihtsalt salvestame kõigi lõimede id-d ja vaatame pärast, mitu erinevat oli. Antud juhtumil oligi see täpselt 5. Sisendväärtuse suurenedes üle 10 ei kasvanud kasutatavate lõimede arv üle 10.

double[] values = new double[10000];

List<int> threadids = new List<int>();

Parallel.For(0, values.Length, new ParallelOptions{ MaxDegreeOfParallelism = 2 }, (i) =>
{
int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(id);
threadids.Add(id);
});

threadids.GroupBy(g => g).AsParallel().ForAll(s => Console.WriteLine(s.Key + ” “ + s.Count()));

Teises näites on tulemus huvitavam. Siin anname kaasa ParallelOptions objekti ja selle MaxDegreeOfParallelism peaks tähendama igal ajahetkel maksimaalset töös olevate ülesannete (task) arvu. Tulemus on, et erinevate kasutatud lõimede arv on sisendväärtusest umbes 2 korda suurem. Sisendi 1 korral on see 1 (see on siis jadaprogramm), aga 2 korral 4 ja 5 korral 10. Kui palju neid korraga jooksis, seda ei tea, aga erinevate lõimede rakendatus oli üsna erinev (viimasel real olnud grupeerimist kasutades oli näha, et lõimede hõivatuse vahe oli kuni 5-kordne).

Kokkuvõtteks, WithDegreeOfParallelism tundub rangem, samas kui MaxDegreeOfParallelism on lõdvem ja näitab mingit venivat rööpsusastet.