なにも考えずに素直にGLSLでGPUに解かせてみた。
こういうデータを用意する。
const int nMax = 100000;
const int nWidth = 512;
const int nHeight = 256;
const int nData = nWidth * nHeight * 4;
float *data = new float[nData];
for(int i = 0; i < nMax; i++) {
data[i*4] = (float)i;
}
for(int i = nMax; i < nWidth * nHeight; i++) {
data[i*4] = -1.0f;
}
シェーダ側は、
uniform sampler2DRect texUnit0; // databool nabeatsu(int n);
void main(void) {
int n = int(texRECT(texUnit0, gl_FragCoord.xy).x) * 1000 + 1;
if(n < 0) {
gl_FragColor = vec4(0, 0, 0, 0);
return;
}
int counter = 0;
for(int i = n; i < n + 1000; i++) {
counter += int(nabeatsu(i));
}
gl_FragColor = vec4(counter, 0, 0, 0);
}
nabeatsu関数はC++と全く同じ。C++の残りはいつもと同じ。
これで、1.3sとC++よりおよそ1桁速くなった。