在尝试提高某些 OpenCL 计算的性能时,我在 clEnqueueWriteBuffer 调用和紧随其后的 clEnqueueNDRangeKernel(取决于之前的数据传输)上使用了 OpenCL 运行时的分析功能:
clEnqueueWriteBuffer(cmdq, cl_buf, CL_FALSE, 0, size, data, 0, NULL, &write_ev);
clEnqueueNDRangeKernel(cmdq, ker_with_cl_buf_as_input_param, 2, NULL,
work_sze, local_sze, 1, &write_ev, &ker_ev);
这是 clGetEventProfilingInfo 返回的内容(我减去了初始时间并转换为微秒):
QUEUED SUBMIT START END END-START
write_ev 0 113.952 120.448 211.136 90.688
ker_ev 130.016 132.608 217.280 515.200 297.920
我的问题是:
- 为什么 clEnqueueWriteBuffer 在内存传输开始或提交之前没有返回?
- 更重要的是,为什么实际提交转账需要这么长时间???
在我看来,只要内存传输可以立即开始,就可以获得 22% 的性能。clEnqueueWriteBuffer 在实际进行传输之前是否将数据复制到另一个主机内存区域?
附加信息:
我在 Tesla M2090 GPU 上使用 cuda 4.1 框架。
缓冲区是先前使用以下方法创建的:
cl_buf = clCreateBuffer(my_context, CL_MEM_READ_ONLY, size, NULL, NULL);
编辑: clEnqueueReadBuffer 没有表现出这种行为。