在OpenCL中,主机和设备之间的内存传输?

3
考虑以下代码,它从大小为size的double数组创建一个缓冲器内存对象:
coef_mem = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, (sizeof(double) * size), arr, &err);

假设它作为内核的参数传递。根据内核运行的设备,有两种可能性:

  1. 设备与主机设备相同
  2. 设备不同于主机设备

以下是我对这两种情况的问题:

  • 在哪个步骤中将内存从主机传输到设备?
  • 如何测量将内存从主机传输到设备所需的时间?
  • 如何测量将内存从设备的全局内存传输到私有内存所需的时间?
  • 如果设备与主机设备相同,内存是否仍然被传输?
  • 从主机到设备的传输时间是否大于从设备的全局内存到私有内存的传输时间?
1个回答

6
从主机到设备的内存传输在哪个步骤完成?
唯一可以保证的是,数据将在内核开始执行时在设备上。OpenCL规范故意没有规定这些数据传输应该何时发生,以便允许不同的OpenCL实现对其硬件做出适当的决策。如果上下文中只有一个设备,则传输可能会在创建缓冲区时立即执行。根据我的经验,这些传输通常在排队内核时(或之后不久)发生,因为此时实现知道它确实需要在特定设备上使用缓冲区。但这完全取决于实现。
如何测量从主机传输内存到设备所需的时间?
使用分析器,通常可以显示这些传输发生的时间和持续时间。如果使用clEnqueueWriteBuffer传输数据,则可以使用OpenCL事件分析系统。
如何测量从设备的全局内存传输到私有内存所需的时间?
同样,使用分析器。大多数分析器将具有读取全局内存时实现的带宽或类似内容的指标。不过,这实际上不是从全局到私有内存的显式传输。
如果设备与主机设备相同,内存是否仍会传输?
使用CL_MEM_COPY_HOST_PTR,是的。如果不想进行传输,请改用CL_MEM_USE_HOST_PTR。对于统一内存架构(例如集成GPU),通常建议使用CL_MEM_ALLOC_HOST_PTR在主机可访问的内存中(通常是固定的)分配设备缓冲区,并使用clEnqueueMapBuffer访问它。
从主机到设备的传输所需时间是否大于从设备的全局内存到私有内存的传输所需时间?
可能会更长,但这取决于体系结构,是否具有统一内存系统以及如何实际访问内核中的数据(内存访问模式和缓存将产生很大影响)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接