我有一个很大的cl_mem缓冲区(100百万个浮点数)。 我试图减少从主机填充数据所需的时间(我必须多次从主机传递数据到设备,目前我每次都重新初始化缓冲区)。
与其一遍又一遍地使用clCreateBuffer / CL_MEM_COPY_HOST_PTR进行初始化,似乎更有效的方法是初始化缓冲区一次,然后每次更新其数据时采用多线程方法(因此多个CPU线程同时更新子集的数据)。
这种方法可行吗? 我已经研究了clEnqueueWriteBuffer,虽然它允许更新缓冲区的子集,但似乎仍然会由命令队列按顺序执行多个调用。 我需要多个命令队列吗? 这种方法可行吗?
与其一遍又一遍地使用clCreateBuffer / CL_MEM_COPY_HOST_PTR进行初始化,似乎更有效的方法是初始化缓冲区一次,然后每次更新其数据时采用多线程方法(因此多个CPU线程同时更新子集的数据)。
这种方法可行吗? 我已经研究了clEnqueueWriteBuffer,虽然它允许更新缓冲区的子集,但似乎仍然会由命令队列按顺序执行多个调用。 我需要多个命令队列吗? 这种方法可行吗?
clEqueueWriteBuffer()
的异步变体,尝试通过在此期间在CPU上执行其他任务来隐藏上传时间;(2)使用或不使用CL_MEM_ALLOC_HOST_PTR
分配内存,使用clEnqueueMapBuffer()
映射内存,并直接将其用作在CPU上生成/加载100百万个浮点数的目标数组。在使用内核之前不要忘记取消映射。版本(2)几乎肯定会在具有统一内存的集成GPU上击败任何其他东西(测试CL_DEVICE_HOST_UNIFIED_MEMORY
)。 - pmdj