Параллелизм. Parallel класы. Invoke() әдісінің көмегімен тапсырмаларды параллельдеу. For() әдісін пайдалану.
Мақсаты және міндеттері
Parallel класы
Invoke() әдісінің көмегімен тапсырмаларды параллельдеу (мысал 1, мысал 2)
For() әдісі (мысал 3)
ParallelLoopResult
ParallelLoopState (мысал 4)
Кірістірілген циклдер
ForEach() әдісі (мысал 5)
Foreach() құрамында лямбда-өрнекті пайдалану
Бұғаттауды тиімділеу (мысал 6)
Бұғаттауды тиімділеу (мысал 6)
63.24K
Категория: ПсихологияПсихология

Параллелизм. Parallel класы

1. Параллелизм. Parallel класы. Invoke() әдісінің көмегімен тапсырмаларды параллельдеу. For() әдісін пайдалану.

ПАРАЛЛЕЛИЗМ. PARALLEL КЛАСЫ. INVOKE() ӘДІСІНІҢ
КӨМЕГІМЕН ТАПСЫРМАЛАРДЫ ПАРАЛЛЕЛЬДЕУ. FOR()
ӘДІСІН ПАЙДАЛАНУ.
«ПРОГРАММАЛАУ ТЕХНОЛОГИЯЛАРЫ» ПӘНІ
ЛЕКТОР: АБДРАХМАНОВА М.Б.

2. Мақсаты және міндеттері

МАҚСАТЫ ЖӘНЕ МІНДЕТТЕРІ
Дәрістің мақсаты: Студенттерде параллель орындалатын программалар құруда
Parallel класының мүмкіндіктері туралы түсінік қалыптастыру.
Дәрісті меңгеру нәтижесінде студенттер келесі қабілеттерге ие болады:
For(), ForEach(), Invoke() әдістерінің мүмкіндіктерін түсіну;
For(), ForEach(), Invoke() әдістерін пайдалану синтаксисін түсіну.

3. Parallel класы

PARALLEL КЛАСЫ
Parallel класы кодты параллель орындауды жеңілдетеді және параллелизмнің екі түрін:
мәліметтер мен тапсырмалар параллелизмін тиімділейтін әдістерді ұсынады.
Parallel класы статикалық болып табылады және онда For(), ForEach() және Invoke()
әдістері анықталған. For() әдісі параллельденетін for циклін, ал ForEach() әдісі параллельденетін foreach циклін орындайды және екі әдіс те деректердің параллелизмін
қолдайды.
Ал Invoke() әдісі екі немесе одан көп әдістерді қатар орындауды қолдайды.
Осы әдістердің көмегімен тапсырмалар мен ағындарды айқын басқарусыз, параллель
программалау әдістемелерін жүзеге асыру артықшылықтарын береді.

4. Invoke() әдісінің көмегімен тапсырмаларды параллельдеу (мысал 1, мысал 2)

INVOKE() ӘДІСІНІҢ КӨМЕГІМЕН ТАПСЫРМАЛАРДЫ
ПАРАЛЛЕЛЬДЕУ (МЫСАЛ 1, МЫСАЛ 2)
Parallel класында анықталған Invoke() әдісі оның аргументтері түрінде көрсетілген бір
немесе бірнеше әдістерді орындауға мүмкіндік береді. Ол сондай-ақ қолжетімді
процессорларды пайдалана отырып, мүмкіндік болса, кодты орындауды масштабтайды.
Төменде оны жариялаудың ең қарапайым формасы келтірілген.
public static void Invoke(params Action[] actions)
Орындалатын әдістер Action делегатымен үйлесімді болуы тиіс:
public delegate void Action()
Invoke() әдісі алдымен өзіне берілген әдістердің орындалуын іске қосады, содан кейін
осы әдістердің аяқталуын күтеді. Аргументтер тізімінде берілген әдістердің
параллельді орындалуына кепілдік жоқ, бұл мәселе процессорлар санына байланысты.
Әдістердің орындалу реттілігіне де кепілдік жоқ.

5. For() әдісі (мысал 3)

FOR() ӘДІСІ (МЫСАЛ 3)
public static ParallelLoopResult For (int fromInclusive, int toExclusive, Action<int> body)
мұндағы fromInclusive циклді басқару айнымалысының бастапқы мәнін білдіреді; ол
итерациялық немесе индекстік мән деп те аталады; aл toExclusive - соңғы мәннен бір
бірлікке артық мән. Циклдің әрбір қадамында циклді басқару айнымалысы бірге
артады. Циклде орындалатын код body параметрі арқылы берілетін әдіспен көрсетіледі.
Бұл әдіс келесі түрде жарияланатын Action<int> делегатымен үйлесімді болуы тиіс.
public delegate void Action<in T>(T obj)
body параметрі арқылы берілетін әдіс атаулы немесе анонимді болуы мүмкін.
For() әдісінің басты ерекшелігі – ол, мүмкіндік болған кезде, циклдегі кодтың
орындалуын параллельдеуге мүмкіндік береді.

6. ParallelLoopResult

PARALLELLOOPRESULT
For() әдісі циклдің аяқталу күйін сипаттайтын ParallelLoopResult типіндегі объект
қайтарады. Бұл құрылымда келесі қасиеттер анықталған:
public bool IsCompleted { get; }
public Nullable<long> LowestBreakIteration { get; }
Егер циклдің барлық қадамдары орындалған болса, IsCompleted қасиеті ақиқат мәнін
қайтарады. Егер цикл ParallelLoopState.Break() әдісінің шақырылуымен уақытынан
бұрын тоқтап қалса, LowestBreakIteration қасиеті циклді басқару айнымалысының ең
кіші мәнін сақтайды.

7. ParallelLoopState (мысал 4)

PARALLELLOOPSTATE (МЫСАЛ 4)
ParallelLoopState типті объектіге қатынасу үшін For() әдісінің келесі формасы
қолданылады:
public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int,
ParallelLoopState> body)
Циклді аяқталуынан ерте тоқтату үшін Break() әдісін шақыру керек:
public void Break()
Әдісті шақыру параллель орындалып жатқан цикл жұмысын тоқтатуға сұраныс құрады,
циклдің нақты тоқтауы осыдан бірнеше айналымнан кейін орындалуы мүмкін. Цикл
жұмысын лезде тоқтату үшін Stop() әдісін пайдалану керек.

8. Кірістірілген циклдер

КІРІСТІРІЛГЕН ЦИКЛДЕР
Кірістірілген
циклдер жағдайында ішкі және сыртқы циклдерді қатарымен
параллельдеуде көп қажеттілік жоқ, себебі бұл әрекетті тым көп бөлшектеуге алып
келеді. For() және Foreach() әдістері ішкі циклдерге қарағанда, сыртқы циклдерде
тиімдірек жұмыс істейді.
Parallel.For (0, 100, i =>
{
});
Parallel.For (0, 50, j => Meth(i, j)); // Тізбекті түрде қалдырған тиімдірек

9. ForEach() әдісі (мысал 5)

FOREACH() ӘДІСІ (МЫСАЛ 5)
ForEach() көмегімен foreach циклінің параллельденетін нұсқасын құруға болады.
Әдісті жариялаудың ең қарапайым формасы:
public
static ParallelLoopResult ForEach<TSource>(IEnumerable<TSource> source,
Action<TSource> body)
мұндағы source циклде өңделетін мәліметтер коллекциясын білдіреді, aл body —
циклдің әрбір қадамында орындалатын әдіс.
Циклдің орындалуын тоқтату үшін әдістің келесі формасы қолданылады:
public static ParallelLoopResult ForEach<TSource>(IEnumerable<TSource> source,
Action<TSource, ParallelLoopState> body)

10. Foreach() құрамында лямбда-өрнекті пайдалану

FOREACH() ҚҰРАМЫНДА ЛЯМБДА-ӨРНЕКТІ ПАЙДАЛАНУ
ParallelLoopResult loopResult = Parallel.ForEach(data, (v, pls) => {
Console.WriteLine(" Мән: " + v);
if (v < 0) pls.Break();
});

11. Бұғаттауды тиімділеу (мысал 6)

БҰҒАТТАУДЫ ТИІМДІЛЕУ (МЫСАЛ 6)
Параллельдеу барысында операциялар ортақ ресурсты пайдаланып, ол ресурстың
қолданылуын синхронизациялау қажет болса, әдетте бұл әрекет келесідей түрде
орындалады:
object locker = new object();
double total = 0;
Parallel.For (1, 10000000, i => { lock (locker) total += Math.Sqrt (i); });
Бұл жағдайда бұғаттаулар жұмсалған ресурстар мөлшері тым көп болады.
Оның орнына локальді мәндерді пайдаланған жөн.

12. Бұғаттауды тиімділеу (мысал 6)

БҰҒАТТАУДЫ ТИІМДІЛЕУ (МЫСАЛ 6)
public static ParallelLoopResult For ( int fromInclusive, int toExclusive,
Func localInit, Func body,Action localFinally);
English     Русский Правила