Esileht > Alustus > Rööpe sektsioonimine

Rööpe sektsioonimine


Väikese ressursinõudlusega rööpsilmuste puhul võib tekkida probleem, kus rööbete käivitamisele kulub rohkem auru kui on kasu nende tööst. Selle probleemi vältimiseks võimaldab rööp-C# rööbete sektsioonimist (inglise keeles partitioning).

Sektsioonimiseks tuleb teha using System.Collections.Concurrent.

Vaata alltoodud näidet, kus on kõrvutatud 3 varianti ruutjuure võtmiseks:

static void Main(string[] args)
{
double[] values = new double[0xFFFFFF];
Parallel.For(0, values.Length, i => values[i] = i); 

DateTime start;

//variant 1: jada
start = DateTime.Now;
foreach (double value in values)
{
Math.Sqrt(value);
};
Console.WriteLine((DateTime.Now – start).TotalMilliseconds.ToString(“0”));

//variant 2: automaatne rööplemine
start = DateTime.Now;
Parallel.ForEach(values, value =>
{
Math.Sqrt(value);
});
Console.WriteLine((DateTime.Now – start).TotalMilliseconds.ToString(“0”));

//variant 3: sektsioonitud rööplemine
start = DateTime.Now;
Parallel.ForEach(Partitioner.Create(0, values.Length, values.Length / 4), p =>
{
for (int i = p.Item1; i < p.Item2; i++)
Math.Sqrt(values[i]);
});
Console.WriteLine((DateTime.Now – start).TotalMilliseconds.ToString(“0”));
}

Esimene, nagu ise näed, on jadakood. See andis mul ajaks 256 millisekki.

Teine on tavaline rööplemine (ma pole küll ForEach()-meetodit varem käsitlenud, aga see on iseennast selgitav jadaprogrammi foreach analoog). Teises variandis käivatatakse nii palju rööpeid kui torust tuleb, ja kuna silmuse sisu on suhteliselt lihtne, võib rööplemise organiseerimisele kuluda liigselt aega. Teise variandi puhul sain ma ajaks 64 millisekki.

Kolmandas variandis loome me esiteks sektsioonija (Partitioner), mille sektsioone saab ForEach()-abil kasutada. Iga sektsiooni sees käivitame jadaprogrammi, aga sektsioone endid käsitleme rööpes.

Partititioner.Create() võtab 3 argumenti: algväärtus, lõppväärtus ja ühe sektsiooni maksimupikkus. Antud juhtumil on kolmandaks argumendiks antud values.Length / 4 ehk siis tulemuseks on, et meil tekitatakse 4 sektsiooni ja mitte rohkem.

Muidugi teid huvitab nüüd, kas sellest oli ka mingit kasu: jah, väga vähe. Ma sain ajaks 53 millisekki, mis on 17% ajavõitu. Arvata on, et minu 8-tuumane prose pani variandis 2 käiku kõik tuumad, aga variandis 3 ainult 4 tuuma.

Pange tähele, et muutuja p (tüübiga Tuple<int, int>) meetodid Item1 ja Item2 ütlevad, mis on iga sektsiooni piirid, ja siin ei ole enam võimalik jadaprogrammis foreach-lähenemist kasutada.

Konkreetsete operatsioonide optimeerimisel on sektsioonimine ilmselt üks etapp, mis tuleb sul läbi katsetada, et kindlaks teha, milline lähenemine on parim. Muidugi sõltub tegelik mõju omakorda kliendi arvuti prosest ja võimekusest, aga lohutav on teada, et rööplemine on üsnagi täpselt konfitav.

Järgmises blogis vaatame veel paari muudetavat parameetrit.

  1. Kommentaare veel pole.
  1. No trackbacks yet.

Lisa kommentaar

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: