clFinish需要永远,独立于内核复杂性和global_size

时间:2013-02-04 19:50:38

标签: c opencl gpu

我目前正在开发一个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

0 个答案:

没有答案