gpt4 book ai didi

memory-management - OpenCL中的内存管理

转载 作者:行者123 更新时间:2023-12-04 07:45:31 25 4
gpt4 key购买 nike

当我开始在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);

显然,这需要我将数据划分为多个块,以确保每个块都适合设备内存。完成计算后,我将使用clEnqueueReadBuffer()读取数据。但是,在某个时候,我意识到我可以使用以下行:
cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);

这样做时,数据的分区变得过时了。令我惊讶的是,我的性能得到了极大的提升。我不明白这一点。从我得到的结果来看,使用主机指针时,设备内存正在充当高速缓存,但是仍然需要将所有数据复制到该内存中进行处理,然后在完成后再复制回主内存。在我看来,使用显式副本(clEnqueRead/WriteBuffer)的速度要慢一个数量级,在我看来应该基本相同吗?我想念什么吗?

谢谢。

最佳答案

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

请注意,这取决于CL的实现,并且无法保证会更快/相等/更慢。

关于memory-management - OpenCL中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com