Módosítások

Intel Xeon Phi

2 559 bájt hozzáadva, 2016. május 5., 11:42
Párhuzamosítás
===Párhuzamosítás===
Több féle mód létezik a párhuzamosításra. Korábban említettük a SIMD technikát, ami adatpárhuzamosításra való 1 processzoron belül, de létezik még processzorok közti párhuzamosítás, amit az OpenMP segítségével tudunk hatékonyan megvalósítani. Amennyiben gépek közti párhuzamosításra, üzenek küldésre van szükség, akkor az MPI-t kell segítségül hívni. Általános megoldás nem létezik minden feladatra, mert MPI is alkalmas lehet gépen belüli párhuzamosításra, nem csak az OpenMP. Amit mérlegelni kell, hogy mi az amire az alkalmazásnak szükséges van illetve mekkora kommunikációs overhead keletkezik, ha lecseréljük az OpenMP-t MPI-ra. Általában az egymástól független számításokat OpenMP-vel, míg a kommunikációt igénylő feladatokra MPI-t szoktak használni.
 
====Szálak párhuzamosítása===
<pre>
export OMP_NUM_THREADS=5 #pragma omp parallel for //for thread paralelizm for (int i = 0; i < n; i++) #pragma simd // Vectorization in inner loop for (int j = 0; j < m; j++) DoSomeWork(A[i][j]);
</pre>
=====Változók láthatósága, megosztása=====
<pre>
int A, B; // Variables declared at the beginning of a function #pragma omp parallel private(A) shared(B) {...} or int B; // Variable declared outside of parallel scope - shared by default #pragma omp parallel {...}
</pre>
 
====Párhuzamos szálak ütemezése====
<pre>
</pre>
 
====Szálak szinkronizációja====
<pre>
* with mutexes (it is very slow, waiting always) #pragma omp parallel for for (int i = 0; i < n; i++) { #pragma omp critical { // Only one thread at a time can execute this section total = total + i; } } * or with atomic operation (it also [very] slow, lot of limitations) #pragma omp parallel for for (int i = 0; i < n; i++) { // Lightweight synchronization #pragma omp atomic total += i; }
</pre>
 
=====Párhuzamos redukció=====
<pre>
(it is fast) BUT not for vector int total = 0; #pragma omp parallel for reduction(+: total) //usage: reduction(operation: scalar) for (int i = 0; i < n; i++) { total = total + i; }
</pre>
 
====Ciklusok párhuzamosítása====
<pre>
#pragma omp parallel { // Code placed here will be executed by all threads. ... #pragma omp for [schedule (<mode>,<chunk>) for (int i = 0; i < n; i++) { // ... iterations will be distributed across available threads... } // ... code placed here will be executed by all threads } modes: static, dynamic, guided chunk: integer value
</pre>
 
====Ciklus kifejtés====
A technika már egy példa erejéig a vektorizációnál is látható, de ott nem került részletezésre. A megoldás lényege, hogy a kellően nagy ciklust szétdaraboljuk kisebb darabokra, amit már külön feldolgozhatóak, ezzel párhuzamosítva a folyamatokat. Az egy darab kiindulási ciklusból két darab egymásba ágyazott ciklust hozunk létre, ami ugyanazon a feladattéren dolgozik.
98
szerkesztés

Navigációs menü