Módosítások

Intel Xeon Phi

2 130 bájt hozzáadva, 2016. május 2., 15:29
Offload
===c) támogatott mód===
====Offload====
Az Offload modell esetén szükséges a forráskód módosítása, mégpedig úgy, hogy azon kódrészletet, amit a koprocesszoron szeretnénk futtatni, ki kell egészíteni egy fordítási direktívával. Példánkban Jól látható, hogy a második kiratás már a koprocesszoron fut.
<pre>
#include <stdio.h>
int main(int argc, char * argv[]) {
printf("Hello world from host!\n");
#pragma offload target(mic)
{
printf("Hello world from coprocessor!\n"); fflush(stdout);
}
printf("Bye\n");
}
</pre>
 
Ebben a példában az operációs rendszer választja ki, hogy melyik Phi kártyán fusson le a kódrészlet. Amennyiben mi szeretnénk explicite megmondani, hogy melyik kártyán fusson, akkor a fordítási direktívában a mic kulcsszó után kell tenni egy ":"-t és a kártya sorszámát [mi esetünkben 0 vagy 1]. Ekkor így nézne ki a direktíva: ''#pragma offload target(mic:1)''
 
Amennyiben az offload szekcióban függvény hívás is szerepel, akkor szükségeltetik az függvény futásához szükséges változók adatterületének átmásolása a Phi kártyára, majd a lefutás után visszamásolni a hoszt gépre. Ezen másolást az ''offload_attribute'' ''push'' és ''pop'' paraméterei segítségével határozhatjuk meg. <br />
A következő mátrix-vektor szorzás példánál az A mátrix globális változó, míg a b és c vektorok a függvény paraméterei.
<pre>
//A változók felmásolásra kerülnek a Xeon Phi-re
#pragma offload_attribute(push, target(mic))
double* A;
void MatrixVector(double *b, double *c, double m, double n) {
...
c[] = A[..]*b[]
}
// felmásolt objektumok visszamásolása
#pragma offload_attribute(pop)
 
int main() {
...
#pragma offload target(mic) in(A[0:n*m])
// így is meg lehetne adni: #pragma offload target(mic:0) in(A : length(n*m))
{
MatrixVector(b, c, m, n);
}
...
}
</pre>
 
Ekkor minden memória területet 2x kell másolni, egyszer fel a kártyára, majd másodszor vissza a hoszt gépre, pedig elegendő lenne csak az eredmény vektort visszamásolni. Ezen optimalizálással egy későbbi fejezetben foglalkozunk.
====Offload + OpenMP====
98
szerkesztés

Navigációs menü