我目前正在开发一个 OpenCL 项目,在那里我遇到了一个奇怪的行为。
AMD APP 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