Cunoștințe, prelegere, paralelizare a ciclurilor

Calculul integral și Parallel.For

Să mai petrecem încă un experiment final de eficiență a aplicației Parallel.For în comparație cu alte metode de paralelizare.





Pentru a face acest lucru, ne întoarcem la problema deja binecunoscută de calculare a unui integral definitiv considerat în capitolele anterioare. În "Algoritmi paraleli" am început să proiectăm clasa NewIntegral. adăugând la acestea în diferitele capitole diferite metode care ne permit să calculam integral. Să adăugăm încă o metodă, în care Parallel.For apel este folosit pentru a paraleliza cicluri:







Aceasta este soluția cea mai simplă și mai ușor de înțeles. Ciclul constă dintr-o singură linie. În buclă, se numește metoda EvalIntegral. care este trecut indicele de iterație a buclă. În metoda EvalIntegral, se formează limitele intervalului de integrare și se creează o metodă secvențială care se integrează într-un interval dat. Iată codul pentru această metodă:

Lucrul cu clasa NewIntegral. apelând diferite metode din această clasă, estimarea timpului necesar pentru calcule prin această sau acea metodă se realizează în proiectul de interfață reprezentând proiectul tradițional Windows Forms. Nu voi mai vorbi despre descrierea ei în detaliu. Următoarea figură prezintă forma acestui proiect, care conține rezultatele fiecăreia dintre metodele luate în considerare și timpul în care fiecare dintre metodele cheltuite pentru calcularea integralului:

Cunoștințe, prelegere, paralelizare a ciclurilor

În acest experiment, toate metodele paralele sunt de 4-5 ori mai eficiente decât metodele succesive. Cel mai bun rezultat de data aceasta a fost demonstrat de metoda folosind fire. Rețineți că, cu un număr relativ mare de fire, această metodă funcționează bine pentru iterații lungi, ca în acest caz. Cu toate acestea, pentru a paraleliza ciclurile, ar trebui să utilizați metoda Parallel.For ca fiind metoda cea mai simplă, intuitivă, care corespunde cu cea obișnuită pentru operator.

Buclele în timp și Parallel.For

Până acum, când am vorbit despre buclele de paralelizare, am considerat doar o buclă. O formă mai generală a bucla este o formă cu o bucla în timp:

Cum să paralelize un astfel de ciclu, când antetul buclă nu determină numărul de iterații necesare pentru a completa bucla. Un exemplu pe acest subiect pe care l-am întâlnit deja când am considerat numărul de gradienți. În același loc, în esență, este dată soluția problemei apărute. Soluția se bazează pe posibilitatea utilizării instrucțiunii de întrerupere în iterațiile concurente ale bucla. Condiția de ieșire (B) este verificată în timpul iterației și, dacă este adevărată, executarea iterațiilor executate este întreruptă. În acest caz, este posibil să se determine cel mai mic indice de iterație, pentru care condiția de ieșire este îndeplinită. Semantica detaliată a procesului de întrerupere este deja descrisă în acest capitol. Să ne uităm la schema de înlocuire a bucla în timp cu o bucla Parallel.For paralel. Se pare ca aceasta:

Corpul bucla este proiectat ca o metodă, care este trecut prin doi parametri - indicele iterației curente și parametrul clasei ParallelLoopState:

Există o întrebare care necesită o soluție - cum să specificați parametrul N. Mai des, știm numărul maxim de iterații. De exemplu, în problema clasică de căutare printr-un model care utilizează buclă în timp. numărul de iterații nu poate depăși numărul elementelor din matrice. În alte probleme acest număr este ales din unele ipoteze externe, cum ar fi în problema numerelor de gradient, am fost interesați de răspunsul pentru un anumit interval fix de numere. De exemplu, pentru procesele slab convergente, este rezonabil să specificați un anumit număr maxim de iterații, moment în care procesul se oprește. Deci, numărul N din această schemă este un număr care limitează numărul maxim de iterații. Schema noastră ne permite mereu să aflăm cum sa încheiat ciclul - fie prin atingerea maximului de iterații, fie prin atingerea adevărului condiției B la iterație. În cel de-al doilea caz, este cunoscut indicele minim de iterație, pe care această condiție a devenit adevărată.

În concluzie, putem spune că în timp ce buclele pot fi, de asemenea, destul de paralelizate. Ca întotdeauna, principala problemă este asigurarea independenței iterațiilor de buclă. Responsabilitatea pentru rezolvarea acestei probleme este suportată de programator.







Articole similare

Trimiteți-le prietenilor: