opencl - clEnqueueWriteBuffer 到底做了什么?

标签 opencl

在尝试提高某些 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

我的问题是:

  1. 为什么 clEnqueueWriteBuffer 在内存传输开始或提交之前不返回?
  2. 更重要的是,为什么要花这么长时间才能真正提交转账???

在我看来,只要内存传输能够立即开始,就可以获得 22% 的性能。 clEnqueueWriteBuffer 是否在实际进行传输之前将数据复制到另一个主机内存区域?

附加信息:

我在 Tesla M2090 GPU 上使用 cuda 4.1 框架。

缓冲区是之前使用创建的:

cl_buf = clCreateBuffer(my_context, CL_MEM_READ_ONLY, size, NULL, NULL);

编辑:clEnqueueReadBuffer 没有表现出这种行为。

最佳答案

您可以尝试使用固定内存,如 NVidia OpenCL Best Practices Guide 的第 3.1.1 节中所述.

他们没有提到在使用可分页内存的情况下是否执行复制,但它可能会发生。

关于opencl - clEnqueueWriteBuffer 到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678066/

相关文章:

c++ - ArrayFire 并行 block 和

cuda - GPGPU:处理 'irregular' 转换的有效方法?

virtualization - 在虚拟机、VMWare 或 Parallels 上使用 CPU 的 guest 系统中使用 OpenCL?

Nvidia GPU 上的 OpenCL ATI Stream SDK

c++ - CL_MEM_ALLOC_HOST_PTR 比 CL_MEM_USE_HOST_PTR 慢

c - 为什么 OpenCL 找不到任何设备?

random - 非递归随机数生成器

时间:2019-03-17 标签:c++openclreturnCL_OUT_OF_RESOURCES

linux - 调用 clCreateContext 时报错 CL_DEVICE_NOT_AVAILABLE (Intel Core2Duo, Intel OCL SDK 3.0 beta)

opencl - 使用 Intel Core 2 Duo E8500 CPU 的 CL_DEVICE_NOT_AVAILABLE