【问题标题】:When does OpenCL data transfer occur?OpenCL 数据传输何时发生?
【发布时间】:2016-11-19 20:10:37
【问题描述】:

我在这里看到了一些关于 Stack Overflow 处理相同问题的问题,但没有明确的答案。我想我会再问一遍,带着一堆我自己的问题。都与手头的主题有关。

那么,我们知道数据从主机传输到 openCL 设备的时间吗?能否告诉我以下函数的确切内存传输操作(即调用这些函数时,传输或创建了哪些数据?):

clCreateBuffer()

clSetKernelArg()

clEnqueueNDRangeKernel()

前两个甚至不产生事件,所以我们无法对它们进行计时,但这里肯定发生了一些数据传输。

有没有一种方法可以在不先将其设置为内核参数的情况下将数据传输到设备?

似乎(根据我自己的初步测试)使用CL_MEM_USE_HOST_PTR 创建的mem 对象直接被设备操作。为什么不希望这样做,因为这样,我们可以避免进一步的数据传输命令(当然驱动程序以最有效的方式实现了这一点)?

在内核返回后,传输的数据(例如,作为内核参数的一部分)是否会留在设备上以供进一步操作?如果没有,有没有办法做到这一点?

【问题讨论】:

    标签: c opencl gpgpu


    【解决方案1】:

    缓冲区副本与命令队列有关。命令队列使用finish() 与主机同步,这是最简单的方法。

    clCreateBuffer()
    
        clEnqueueWriteBuffer() <-------- you can get event data from this
            (set blocking parameter to false to queue everything quickly)  
            (set blockinig to true if you sync write here)  
    
    clSetKernelArg()
    
        clEnqueueWriteBuffer() <----- it could be here too
    
    clEnqueueNDRangeKernel()
    
        clEnqueueWriteBuffer() <----- or here (too quickly re-set an array?)
    
    clFinish() <--------- this ensures all queued commands are executed before this
    
    now you can query data of that event to check when it started and when ended
    

    要让缓冲区保留在设备中,您应该先在设备中创建它,然后不要将其迁移到另一个设备。在createBuffer() 中仅使用CL_MEM_READ_WRITE 标志就足以使其成为设备端的真正缓冲区,直到您释放该缓冲区。

    CL_MEM_USE_HOST_PTR 或 CL_MEM_ALLOC_HOST_PTR 使用主机内存作为设备将其映射到其内核。由于不需要在主机端进行额外的数据移动,这对于流入和流出数据的速度更快。如果您需要始终使用诸如快速 gddr5 或 hbm 之类的设备内存,则不应使用这些标志。

    复制到设备一次,随心所欲地使用。如果设备当然有自己的内存。例如,Intel HD Graphics 400 没有自己的内存并共享 RAM,因此使用 CL_MEM_..._HOST_PTR 标志,尤其是 USE_HOST_PTR 会更快。

    要检查设备是否与 CPU 共享 RAM,请查询设备的 CL_DEVICE_HOST_UNIFIED_MEMORY 属性。

    似乎(根据我自己的初步测试)一个 mem 对象 使用 CL_MEM_USE_HOST_PTR 创建的直接由 设备

    即使没有映射/取消映射命令来执行内核,我的计算机的行为也是一样的,但我使用 map/unmap 只是为了安全,它不会占用太多周期。

    编辑:如果你想确保一个命令不会在你想要的时候启动,你可以在 bufferwrite 命令的事件列表输入参数中添加一个用户事件。然后你可以触发用户事件让写入开始,因为命令会等待列表中的所有事件被触发+完成,然后再继续(如果事件列表输入参数中指定了任何事件)

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多