Know-how, előadás, ciklusok párhuzamosítása
Számítógép az integrált és párhuzamos.For
Töltsünk még egy utolsó kísérletet az alkalmazás hatékonyságára párhuzamosan. Más párhuzamos módszerekhez képest. Ehhez vissza kell térnünk az előző fejezetekben megfogalmazott, határozott integrálszám kiszámításának már jól ismert problémájához. A "Párhuzamos algoritmusok" -ben elkezdtük a NewIntegral osztályt megtervezni. hozzátéve a későbbi fejezetekben különböző módszereket, amelyek lehetővé teszik számunkra az integrál kiszámítását. Adjunk még egy módszert, amelyben a párhuzamos. A hívás a ciklusok párhuzamosítására szolgál:
Ez a legegyszerűbb és legérthetőbb megoldás. A ciklus egy sorból áll. A hurokban az EvalIntegral módszert hívják. amely áthalad a hurok iterációs indexén. Az EvalIntegral módszerben kialakulnak az integrációs intervallum határai, és létrejön egy szekvenciális módszer, amely egy adott intervallumon belül integrálódik. Itt van a kód ennek a módszernek:
A NewIntegral osztály használatával. különböző osztályú módszereket hív meg, becslése szerint a számításokhoz szükséges idő ezzel vagy az eljárással a hagyományos Windows Forms projektet ábrázoló felületprojektben történik. Nem fogok részletesen leírni a leírást. Az alábbi ábra bemutatja a projekt formáját, amely tartalmazza az egyes vizsgált módszerek eredményeit, és azt az időpontot, amikor az egyes módszerek az integrálszámításhoz költöttek:

Ebben a kísérletben minden párhuzamos módszer 4-5-szer hatékonyabb, mint az egymást követő módszerek. Ezt a legjobb eredményt a szálak használatával mutatták ki. Megjegyezzük, hogy viszonylag nagy számú szál esetén ez a módszer jól működik a hosszú iterációkhoz, mint ebben az esetben. A ciklusok párhuzamosításához azonban a Parallel.For módszert kell használni a legegyszerűbb, intuitív módszerként, amely megfelel a szokásos üzemeltetőknek.
A hurok és a párhuzamos
Eddig, amikor párhuzamozó hurkokról beszéltünk, csak a hurokra tekintettünk. A hurok általánosabb formája egy hurok formájú forma:
Hogyan kell párhuzamosítani egy ilyen ciklust, ha a ciklusfej nem határozza meg a ciklus befejezéséhez szükséges iterációk számát. Egy példa erre a témára, amelyre már találkoztunk, amikor figyelembe vettük a jégesőszámot. Ugyanezen a helyen, lényegében, a felmerülő probléma megoldása. A megoldás azon a lehetőségen alapul, hogy a hurok párhuzamos iterációiban a szünetkifejezést használhatjuk. A kilépési feltétel (B) az iteráció alatt ellenőrizhető, és ha ez igaz, a végrehajtott iterációk végrehajtása megszakad. Ebben az esetben meg lehet határozni a legkisebb iterációs indexet, amelyhez a kilépési feltétel teljesül. A megszakítási folyamat részletes szemantikáját már leírták ebben a fejezetben. Nézzük meg a ciklus ciklusának párhuzamos párhuzamos.Egy hurok helyett. Ez így néz ki:
A hurok testét úgy tervezték, hogy két paramétert - az aktuális iteráció indexét és a ParallelLoopState osztály paramétereit -
Még mindig van egy olyan kérdés, amely megoldást igényel - hogyan határozzuk meg a N. paramétert. Gyakran, ismeri az iterációk maximális számát. Például a klasszikus probléma a keresési egy mintát, hogy használja a while hurok. az iterációk száma nem haladhatja meg a tömb elemeinek számát. Más problémákban ezt a számot néhány külső feltételezés választja ki, például a gradiensszámok problémáján, a választ a fix számok közötti intervallumban érdekelték. Például a rosszul konvergáló folyamatok esetében indokolt megadni egy bizonyos maximális számú iterációt, amely időpontban a folyamat leáll. Tehát az N szám ebben a sémában olyan szám, amely korlátozza az iterációk maximális számát. Rendszerünk mindig lehetővé teszi számunkra, hogy megtudjuk, hogyan ér véget a ciklus - akár a maximális iteráció elérése, akár a B állapot igazságának elérése az iteráció során. Az utóbbi esetben ismeretes az iteráció minimális indexe, amelyen ez a feltétel teljesült.
Összefoglalva, azt mondhatjuk, hogy míg a hurkok is meglehetősen egyszerűen párhuzamosak. Mint mindig, a fő probléma a hurok iterációk függetlenségének biztosítása. A probléma megoldásának felelősségét a programozó viseli.