GPUで「世界のナベアツ」問題

なにも考えずに素直に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; // data

bool 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桁速くなった。