2008-04-11
■[プログラミング][GPGPU]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桁速くなった。
コメントを書く
トラックバック - http://d.hatena.ne.jp/inamori/20080411/p2