cudaDeviceSetSharedMemConfig()
-aliohjelmalla joko 32 tai 64 bittiinconst int local_id = get_local_id(0);
if(local_id % 2 == 0) // Jos local_id on parillinen
y1 = x/d; // Jakolasku on kallis operaatio
else
y2 = 1.0;
y1 = x/d;
y2 = 1.0;
m
):__kernel void sum(__global double *res, __global double *x, int n, int m) {
const int global_id = get_global_id(0);
// Lasketaan jokaiselle säikeelle osasumman rajat
const int begin = global_id * m;
const int end = min(n, (global_id+1) * m);
// Jokainen säie laskee m peräkkäistä lukua yhteen
double tmp = 0;
for(int i = begin; i < end; i++)
tmp += x[i];
// Säikeet tallentavat omat osasummansa res-taulukkoon
res[global_id] = tmp;
}
m
= 8):m
= 128:$ make gpu2 && ./gpu2
g++ -std=c++11 -o gpu2 gpu2.cpp -lOpenCL
Time: 0.025615 s
Flops: 1.6957 GFlops
Sum value: 2527.55
Real value: 2527.55
Diff: 1.56433e-10
__kernel void sum(__global double *res, __global double *x, int n) {
const int global_id = get_global_id(0);
// Globaalin indeksiavaruuden koko (säikeiden määrä)
const int global_size = get_global_size(0);
double tmp = 0;
// Säikeet aloittavat omaa indeksinumeroaan vastaavasta indeksistä ja
// hyppäävät joka iteraatiolla global_size alkiota eteenpäin
for(int i = global_id; i < n; i += global_size)
tmp += x[i];
// Säikeet tallentavat omat osasummansa res-taulukkoon
res[global_id] = tmp;
}
m
= 128:$ make gpu3 && ./gpu3
g++ -std=c++11 -o gpu3 gpu3.cpp -lOpenCL
Time: 0.00473809 s
Flops: 9.16726 GFlops
Sum value: 4544.81
Real value: 4544.81
Diff: 5.63887e-10
$ make gpu4 && ./gpu4
c++ -std=c++11 -o gpu4 gpu4.cpp -lOpenCL
Time: 0.00255108 s
Flops: 17.0263 GFlops
Sum value: 1440.41
Real value: 1440.41
Diff: 1.11868e-10
ydin1<<<WG_SIZE_2, WG_SIZE1>>(...);
...
ydin2<<<1, WG_SIZE_2>>>(...);
WG_SIZE_2
\(\times\) WG_SIZE_1
osasummaa, jotka lasketaan yhteen lokaalissa muistissa siten, että saadaan summa, jonka koko on WG_SIZE_2
$ make gpu5 && ./gpu5
c++ -std=c++11 -o gpu5 gpu5.cpp -lOpenCL
Time: 0.00261402 s
Flops: 16.6163 GFlops
Sum value: -8903.63
Real value: -8903.63
Diff: 1.81899e-12