当我开始使用OpenCL编程时,我使用以下方法向我的内核提供数据:
当执行此操作时,数据的分区变得过时了。令我惊讶的是,性能得到了极大的提升。这是我不理解的事情。据我所知,使用主机指针时,设备内存作为缓存工作,但所有数据仍然需要被复制到其中进行处理,一旦完成后再复制回主内存。当使用显式复制(clEnqueRead/WriteBuffer)时,为什么会慢一个数量级,而在我看来,它应该基本相同?我有什么遗漏吗?
谢谢。
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);
显然,这要求我将我的数据分成块,确保每个块都能适应设备内存。在执行计算后,我会使用clEnqueueReadBuffer()读出数据。然而,有一段时间我意识到我可以只使用以下行:
cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);
当执行此操作时,数据的分区变得过时了。令我惊讶的是,性能得到了极大的提升。这是我不理解的事情。据我所知,使用主机指针时,设备内存作为缓存工作,但所有数据仍然需要被复制到其中进行处理,一旦完成后再复制回主内存。当使用显式复制(clEnqueRead/WriteBuffer)时,为什么会慢一个数量级,而在我看来,它应该基本相同?我有什么遗漏吗?
谢谢。