OpenCL中的内存管理

VHr*_*tov 5 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);
Run Code Online (Sandbox Code Playgroud)

这显然要求我以块的形式对数据进行分区,确保每个块都适合设备内存.执行计算后,我用clEnqueueReadBuffer()读出数据.但是,在某些时候我意识到我可以使用以下行:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,数据的分区已过时.令我惊讶的是,我的表现得到了极大的提升.这是我不明白的事情.从我得到的,当使用主机指针时,设备内存作为缓存工作,但所有数据仍然需要复制到它进行处理,然后一旦完成就复制回主内存.为什么使用显式副本(clEnqueRead/WriteBuffer)慢一个数量级,在我看来它应该基本相同?我错过了什么吗?

谢谢.

Mat*_*gro 3

是的,您在 clEnqueueWriteBuffer 调用中缺少 CL_TRUE。这会导致写操作阻塞,从而在进行复制时使 CPU 停顿。使用主机指针,OpenCL 实现可以通过使其异步来“优化”副本,因此总体性能更好。

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