GPGPUで整数計算(7)

演算の速度

こういうデータを用意して、


const int nWidth = 256;
const int nHeight = 256;
const int nData = nWidth * nHeight * 4;
float *data = new float[nData];
int nRep = 16384;

for(int i = 0; i < nData; i++) {
data[i] = (float)((i & 1) + 1);
}

こういう演算をする。


#extension GL_ARB_texture_rectangle : enable
#extension GL_EXT_gpu_shader4 : enable

uniform sampler2DRect texUnit0; // data

uniform int nRep;

void main(void) {
int nPrimes = 0;
vec4 color = texRECT(texUnit0, gl_FragCoord.xy);
ivec4 a = ivec4(color);

for(int i = 0; i < nRep; i++) {
a += i;
a &= 4095;
}

gl_FragColor = vec4(a);
}

同様の演算をCPUでも行って、速度の比較を行う。


sum = 0.0;
for(int k = 0; k < nData; k++) {
int a = (k & 1) + 1;
for(int i = 0; i < nRep; i++) {
a += i;
a &= 4095;
}
sum += (double)a;
}

これらと、


for(int i = 0; i < nRep; i++) {
a += i;
a &= 4095;
a += a;
}

との時間の比較を行って、差を加算の時間とする。
同様に、


for(int i = 0; i < nRep; i++) {
a += i;
a &= 4095;
a *= 7;
}


for(int i = 0; i < nRep; i++) {
a += i;
a &= 4095;
a /= 7;
}

で、乗除の時間を計る。
ここから、1nsあたり何回演算するかを算出した。

加算 乗算 除算
GPU 167.77 83.07 4.85
CPU 6.88 0.34 0.19
GPU/CPU 24.4 247.2 25.2

CPUの乗算ってこんなに遅いっけ?
それはともかく、除算は遅い。
素数の計算が遅くても無理はない。