Memory management OpenCL中的内存管理

Memory management OpenCL中的内存管理,memory-management,opencl,Memory Management,Opencl,当我开始使用OpenCL编程时,我使用以下方法为内核提供数据: cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL); clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL); 这显然需要我将数据划分成块,确保每个块都能放入设备内存中。完成计算后,我用

当我开始使用OpenCL编程时,我使用以下方法为内核提供数据:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL);
clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL);
这显然需要我将数据划分成块,确保每个块都能放入设备内存中。完成计算后,我用clenqueureadbuffer()读取数据。然而,在某个时刻,我意识到我可以用下面这句话:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);
这样做时,数据的分区就过时了。令我惊讶的是,我的表现得到了极大的提升。这是我不明白的。据我所知,当使用主机指针时,设备内存作为缓存工作,但所有数据仍需要复制到其中进行处理,完成后再复制回主存。为什么使用显式拷贝(clEnqueRead/WriteBuffer)要慢一个数量级,而在我看来应该是基本相同的呢?我错过什么了吗


谢谢。

是的,你错过了CL_TRUE在clEnqueueWriteBuffer通话中的内容。这会导致写操作阻塞,从而在复制时暂停CPU。使用主机指针,OpenCL实现可以通过使副本异步来“优化”副本,因此总体性能更好


请注意,这取决于CL实现,不能保证更快/相等/更慢。

在某些情况下,CPU和GPU可以共享相同的物理DRAM内存。例如,如果内存块满足CPU和GPU对齐规则,则Intel将CL_MEM_USE_HOST_PTR解释为CPU和GPU之间共享物理DRAM的权限,因此不存在数据的实际复制。很明显,这很快

这里有一个链接解释了这一点:


PS我知道我的回复对于OP来说太老了,但是其他读者可能会感兴趣。

我知道clEnqueueRead/WriteBuffer上有阻塞标志。然而,当我进行测量时,我使用了clFinish(至少我非常确定我使用了),它应该与阻塞标志具有相同的效果,还是没有?当然,也就是说,只有在处理相同数量的数据时。嗯,也许CL实现足够聪明,可以省去对象中未被访问的部分(大约70%)。。。无论如何谢谢你!