演算の速度
こういうデータを用意して、
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 : enableuniform 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の乗算ってこんなに遅いっけ?
それはともかく、除算は遅い。
素数の計算が遅くても無理はない。