前回の奇遇転置ソートではトホホな結果となりました。
あまりに悔しいのでマンデルブロ集合に挑戦。
マンデルブロ集合は
int getCalcNum(const float x, const float y, const int max_calc) {
int count = 0;
float prevX = 0.0f;
float prevY = 0.0f;
for (int i = 0; i < max_calc + 1; i++) {
count = i + 1;
float newX = (prevX * prevX) - (prevY * prevY) + x;
float newY = (2.0f * prevX * prevY) + y;
if (((newX * newX) + (newY * newY)) > 4.0f) {
// 発散する
break;
} else {
prevX = newX;
prevY = newY;
}
}
return count;
}
こんな計算を各ピクセルに対して行います。
Kernelに計算範囲と結果格納領域を与えて起動すれば、
あとはホストとのやり取りなしに全領域を計算して返ってくるよに仕向けました。
↑の計算を512x512点、max_calc=512 でぶん回してみた。
結果:
single-thread@CPU : 180[ms] (AMD Athlon64 X2 4400+)
OpenCL : 15[ms] (ATi RADEON HD5670)
こぉでなくちゃだわ。
時間計測にはおちゃらかにGetTickCount()使こうたんで精度はめちゃテキトーですが、
こんくらいのパフォーマンスは叩き出せるですね。GPGPUはやればできる子。