桃の天然水 このページをアンテナに追加

2008-04-11

[][]GPUで「世界のナベアツ」問題 GPUで「世界のナベアツ」問題 - 桃の天然水 を含むブックマーク はてなブックマーク - GPUで「世界のナベアツ」問題 - 桃の天然水 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