gpt4 book ai didi

opencl - OpenCL 中主机和设备之间的内存传输?

转载 作者:行者123 更新时间:2023-12-01 10:48:32 28 4
gpt4 key购买 nike

考虑以下代码,它从大小为 size 的 double 组创建缓冲区内存对象:

coef_mem = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, (sizeof(double) * size), arr, &err);

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

  1. 设备与主机设备相同
  2. 该设备不是主机设备

以下是我对这两种可能性的问题:

  • 内存在哪一步从主机传输到设备?
  • 如何测量将内存从主机传输到设备所需的时间?
  • 我如何测量从中传输内存所需的时间设备的全局内存到私有(private)内存?
  • 如果设备与主机设备相同,是否仍会传输内存?
  • 从主机传输到设备所需的时间会更长吗比从设备的全局内存传输所需的时间私有(private)内存?

最佳答案

At what step is the memory transferred to the device from the host?

您唯一的保证是当内核开始执行时数据将在设备上。 OpenCL 规范有意不强制要求何时进行这些数据传输,以允许不同的 OpenCL 实现做出适合其自身硬件的决策。如果上下文中只有一个设备,则传输可以在您创建缓冲区后立即执行。根据我的经验,这些传输通常发生在内核入队时(或不久之后),因为那时实现知道它真的需要特定设备上的缓冲区。但这真的完全取决于实现。


How do I measure the time required for transferring the memory from host to device?

使用分析器,它通常会显示这些传输发生的时间以及它们需要多长时间。如果您改为使用 clEnqueueWriteBuffer 传输数据,则可以使用 OpenCL 事件分析系统。


How do I measure the time required for transferring the memory from device's global memory to private memory?

同样,使用分析器。当从全局内存或类似的东西读取时,大多数分析器都会有一个衡量带宽的指标。不过,这并不是真正从全局内存到私有(private)内存的显式传输。


Is the memory still transferred if the device is same as host device?

使用CL_MEM_COPY_HOST_PTR,是的。如果您不希望发生传输,请改用 CL_MEM_USE_HOST_PTR。对于统一内存架构(例如集成 GPU),典型的建议是使用 CL_MEM_ALLOC_HOST_PTR 在主机可访问内存(通常是固定的)中分配设备缓冲区,并使用 clEnqueueMapBuffer.


Will the time required to transfer from host to device be greater than the time required for transferring from device's global memory to private memory?

可能吧,但这将取决于架构,是否有统一的内存系统,以及您在内核中实际访问数据的方式(内存访问模式和缓存会产生很大影响)。

关于opencl - OpenCL 中主机和设备之间的内存传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178947/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com