私は現在、奇妙な動作に遭遇した OpenCL プロジェクトに取り組んでいます。
AMD アプリ SDK: OpenCL v1.2 HD 7770
カーネルは次のとおりです。おそらく、想像できる最も単純なものです。
__kernel void bm_and(
__global const unsigned int* const bitmap1,
__global const unsigned int* const bitmap2,
__global unsigned int* const result )
{
size_t gi = get_global_id(0);
if (gi >= get_global_size(0))
return;
result[gi] = bitmap1[gi] & bitmap2[gi];
}
私が抱えている問題は、カーネルを呼び出すグローバルサイズがどれほど大きくても、その後のclFinishへの呼び出しで約1.5秒の一定の遅延があるように見えることです。
これは bm_and への最初の呼び出しでのみ発生し、それ以降の呼び出しは通常のパフォーマンスで動作します。
抽象的な例
//time ~1.5s (doesn't matter if bitmaps are 1 or 100M)
clFinish(queue)
start = now
bm_and(x,y,z)
clFinish(queue)
end = now
time = end-start
//time ~1.5s, second kernel call and clFinish execute at a high performance+
clFinish(queue)
start = now
bm_and(x,y,z)
clFinish(queue)
bm_and(x,y,z)
clFinish(queue)
end = now
遅延は使用するビットマップのサイズとは無関係であり、データは既にデバイス上にあるため、転送コストはおそらく問題ではありません。
編集:
カーネルのパフォーマンス自体は問題ではないようです。送信してからカーネルを起動するまでに時間がかかるようです。
これらは出力例です
clGetEventProfilingInfo
QUEUE MS: 5497240.33
SUMBIT MS: 5497240.36
START MS: 5498938.58
END MS: 5498938.94