Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako možno použiť funkciu Parfor na optimalizáciu paralelného spracovania v programe?

Slučka „Parfor` v Matlabe je výkonným nástrojom na paralelizáciu výpočtovo náročných úloh. Tu je rozpis toho, ako ho efektívne využiť na optimalizáciu:

1. Porozumenie `parfor` a jeho obmedzenia:

* Čo to je: „Parfor` (paralelné pre slučku) vám umožňuje vykonávať iterácie slučky paralelne medzi viacerými pracovníkmi v skupine MATLAB (začali sa používať„ Parpool “). To môže dramaticky skrátiť čas vykonávania určitých typov algoritmov.

* Kľúčové obmedzenia: Pochopenie obmedzení „Parfor“ je rozhodujúce pre zabránenie chýb a zabezpečenie správnej paralelizácie. Tie hlavné sú:

* Nezávislosť: Iterácie slučky * musia byť navzájom nezávislé. Medzi iteráciami by nemali existovať žiadne závislosti na údajoch. Jedna iterácia nedokáže čítať údaje napísané inou iteráciou alebo zapisovať údaje, ktoré sa budú čítať inou iteráciou. Porušenie je bežným zdrojom chýb.

* redukcie: Ak potrebujete kombinovať výsledky z viacerých iterácií (napr. Hodnoty sčítania), použite premenné redukcie (pozri nižšie).

* Klasifikácia premennej: „Parfor` klasifikuje premenné do niekoľkých typov:

* Premenná slučky: Premenná indexu slučky (napr. `I` in` pre i =1:n`).

* Loop Premenné plátok: Jednoduchá premenná, ktorá nezávisí od samotnej premennej slučky.

* vysielaná premenná: Premenná definovaná * pred * slučkou `Parfor`, ktorá sa číta, ale nie je upravená v slučke. Rovnaká hodnota premennej používajú všetci pracovníci. Môže to byť veľká matica alebo objekt.

* redukčná premenná: Premenná používaná na akumuláciu výsledkov v rámci iterácií (napr. Sčítania hodnôt, nájdenie minimálnych, zreťazených polí). Vyžaduje špeciálne zaobchádzanie.

* dočasné/miestne premenné: Premenné vytvorené * vo vnútri * slučka `parfor`, ktorej hodnoty nie sú potrebné mimo slučky. Sú to pracovníci-súkromné.

* indexované premenné: Premenné ako `a (i)` alebo `b {i}`, ktorých závislosť od `i` závisí od toho, ako sa používajú` a` alebo `b`. Automatický klasifikátor MATLAB ich musí klasifikovať správne.

* Obmedzenia indexovania: Indexovanie do polí v rámci slučky „Parfor` má obmedzenia na zaručenie nezávislosti. Bežné chyby zahŕňajú pokus o písanie do toho istého indexu z viacerých iterácií. Index poľa musí priamo závisieť od premennej slučky. Vnorené indexovanie ako `a (b (i))` môže spôsobiť problémy.

* Funkčné volanie: Volanie externých funkcií (najmä tie, ktoré nie sú napísané v MATLAB) v rámci slučiek „Parfor`, môže zaviesť serializačné prekážky, ktoré vylučujú niektoré zisky z výkonu. Pokúste sa vyhnúť funkčným hovorom alebo ak je to možné, vložte funkčný kód.

* Workspace Awareness: Každý pracovník má svoj vlastný pracovný priestor. Premenné definované v slučke nie sú automaticky dostupné v hlavnom pracovnom priestore MATLAB po dokončení slučky (pokiaľ nie sú redukčnými premennými alebo prechádzajú späť cez rezy premennej slučky).

2. Kroky na optimalizáciu pomocou `Parfor`:

1.

* Vyhľadajte „pre„ slučky, ktoré vykonávajú nezávislé výpočty v každej iterácii. Sú to hlavní kandidáti na konverziu na „Parfor“.

* Analyzujte svoj kód, aby ste zistili, či sú závislosti na údajoch odstránené alebo minimalizované. Niekedy je potrebná mierna reorganizácia algoritmu, aby bola vhodná na paralelné vykonanie.

2. Prevod slučky na `Parfor`:

* Vymeňte „For 's` Parfor`:`Parfor i =1:n ... end`.

* MATLAB's Automatic Check: MATLAB automaticky analyzuje „parfor“ slučku pre potenciálne problémy. Vydáva varovania alebo chyby, ak zistí závislosti alebo iné porušenia pravidiel „Parfor“. Opatrne skontrolujte tieto správy.

3. Premenné redukcie rukoväte:

* Ak potrebujete kombinovať výsledky z iterácií, použite redukčnú premennú. MATLAB poskytuje zabudovanú podporu pre bežné redukčné operácie:

* súhrn: `x =x + expr;`

* Násobenie: `x =x * expr;`

* zreťazenie:

* `x =[x, expr];` (zreťazenie stĺpcov)

* `x =[x; expr]; `(zrekonštruácia v riadku)

* minimálne/maximum:

* `x =min (x, expr);`

* `x =max (x, expr);`

* logické operácie:

* `x =x &&expr;` (logické a)

* `x =x || expr; `(logické alebo)

* Zhreba bunkového poľa: `x ={x {:}, expr};`

* Príklad:

`` `MATLAB

n =1000;

Výsledok =0; % Inicializovať * pred * parfor slučkou

parfor i =1:n

Výsledok =výsledok + i^2; Zníženie sčítania %

ukončiť

disp (výsledok);

`` `

4. predbežné polia:

* Ak píšete výsledky do poľa vo vnútri slučky `Parfor`, vopred prepočte pole * pred * slučkou. To bráni Matlabovi opakovane zmenu veľkosti poľa, čo môže byť hlavným problémom s výkonom, najmä paralelne.

* Príklad:

`` `MATLAB

n =1000;

Výsledky =nuly (1, n); % Predbežné spojenie

parfor i =1:n

Výsledky (i) =i^2;

ukončiť

`` `

5. Minimalizujte prenos údajov:

* Prenos údajov medzi klientom MATLAB a pracovníkmi môže byť významnou réciou.

* Vysielacie premenné: Uistite sa, že veľké vstupné premenné, ktoré sa čítajú iba vo vnútri slučky, sú správne klasifikované ako premenné vysielania tým, že ich definujete * pred * Parfor` slučka.

* udržiavať údaje lokálne: Vyhnite sa zbytočnej komunikácii údajov medzi pracovníkmi a klientom.

6. Vyhnite sa funkčným hovorom (ak je to možné):

* Funkčné hovory v slučke „Parfor` môžu zaviesť režijné náklady v dôsledku serializácie a komunikácie. Ak je to možné, vložte kód funkcie priamo do slučky.

* Ak musíte použiť funkciu, uistite sa, že je navrhnutá na paralelné vykonanie a minimalizuje komunikáciu.

7. Naladte počet pracovníkov:

* Optimálny počet pracovníkov závisí od konkrétneho problému, hardvéru (počet jadier, pamäť) a režijných nákladov paralelizácie.

* Experimentujte s rôznymi počtami pracovníkov pomocou `Parpool` na nájdenie konfigurácie, ktorá poskytuje najlepší výkon. Začiatok viac pracovníkov, ako máte jadrá CPU, vo všeobecnosti * nezlepšuje výkon a môže ho dokonca degradovať v dôsledku režijných nákladov na prepínanie kontextu.

* Použite `GCP` na kontrolu aktuálnej oblasti a jeho veľkosti.

8. Profilovanie:

* Použite Matlab Profiler (`Profil ON`,` Profile off`, `Viewer profilu ') na identifikáciu prekážok výkonu v slučke„ Parfor`. To vám môže pomôcť určiť oblasti, v ktorých je potrebná ďalšia optimalizácia. Konkrétne sa pozrite na funkcie s názvom a čas strávený v komunikácii alebo prenose údajov.

Príklad:simulácia Monte Carlo

Povedzme, že chcete odhadnúť hodnotu PI pomocou simulácie Monte Carlo:

`` `MATLAB

n =1e7; % Počtu náhodných bodov

% Sériová verzia

tic

Inside_Circle =0;

pre i =1:n

x =rand ();

y =rand ();

Ak x^2 + y^2 <=1

Inside_Circle =Inside_Circle + 1;

ukončiť

ukončiť

pI_estimate_serial =4 * Inside_Circle / n;

Time_serial =TOC;

% Paralelná verzia s Parfor

tic

vo vnútri_circle_par =0;

parfor i =1:n

x =rand ();

y =rand ();

Ak x^2 + y^2 <=1

vo vnútri_circle_par =Inside_Circle_PAR + 1;

ukončiť

ukončiť

pI_estimate_par =4 * Inside_Circle_par / n;

Time_parfor =TOC;

% Paralelná verzia so znížením

tic

Parpool; % Spustite paralelný bazén

vo vnútri_circle_reduced =0;

parfor i =1:n

x =rand ();

y =rand ();

Ak x^2 + y^2 <=1

vo vnútri_circle_reduced =Inside_Circle_reduced + 1; % Redukčná premenná

ukončiť

ukončiť

delete (GCP ('nocreate')); % blízko parpoolu

pI_estimate_reduced =4 * Inside_Circle_reduced / n;

Time_reduced =TOC;

DISP (['Serial PI Odhad:' num2str (pi_estimate_serial) 'čas:' num2str (time_serial)]]);

DISP (['PARFOR PI odhad:' num2str (pi_estimate_par) 'čas:' num2str (time_parfor)]);

DISP (['Parfor znížené odhady PI:' num2str (pI_estimate_reduced) 'čas:' num2str (time_reduced)]]);

`` `

Vysvetlenie:

* Sériová verzia je štandardná „pre„ slučku “.

* Prvá paralelná verzia s Parforom bude bežať paralelne, ale neposkytne správny výsledok. Problém je v tom, že „Inside_Circle_PAR` je upravený viacerými pracovníkmi naraz, čo vedie k strateným aktualizáciám.

* Druhá paralelná verzia s `Parfor` a redukčnou premennou je správna a optimalizovaná verzia. Redukcia `Inside_Circle_reduced =Inside_Circle_reduced + 1;` povie MATLAB, aby správne akumulovala výsledky od každého pracovníka bez rasových podmienok.

* A `Parpool` je inicializovaný pred použitím` Parfor` a potom sa uzavrie s `delete (GCP ('nocreate'))`. `(„ Nocreate “)` zaisťuje, že ak neexistuje bazén, Matlab sa nebude pokúšať vytvoriť jeden (čo môže viesť k chybám).

Kľúčové úvahy a riešenie problémov:

* Dátové preteky: Najbežnejšou chybou sú dátové preteky, v ktorých sa viac iterácií pokúša zapisovať súčasne na rovnaké umiestnenie pamäte. Matlab sa ich snaží zistiť, ale niekedy môžu byť jemné.

* ladenie: Ladenie „Parfor` slučky môže byť náročné. Zvážte beh s malým počtom iterácií najskôr, aby ste izolovali problémy. Používajte body prerušenia strategicky. MATLAB má niekoľko paralelných ladiacich nástrojov, ale často sú menej efektívne ako starostlivá kontrola kódu.

* Riadenie: Paralelizácia predstavuje režijné náklady (vytvára pracovníkov, prenos údajov). Ak je výpočet v každej iterácii veľmi malý, režijné náklady môžu prevážiť výhody paralelizácie.

* Hardvérové ​​limity: Počet pracovníkov by mal byť zvyčajne menší alebo rovný počtu fyzických jadier na vašom stroji.

* verzie MATLAB: Správanie sa „Parfor` a paralelný počítačový nástroj sa môže medzi verziami MATLAB mierne líšiť. Konkrétna verzia, ktorú používate, obráťte sa na oficiálnu dokumentáciu MATLAB.

Starostlivo dodržiavaním týchto usmernení a pochopením obmedzení „Parfor“ ho môžete efektívne využiť na optimalizáciu svojich programov MATLAB a na dosiahnutie významného zlepšenia výkonu pre výpočtovo náročné úlohy. Nezabudnite vždy dôkladne otestovať svoj kód, aby ste zaistili správnosť.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené