1

为了与 openCL 进行全速通信,必须使用主机端的固定内存。这样的内存永远不会被分页,并且可以通过使用带有 CL_MEM_ALLOC_HOST_PTR 标志的 clCreateBuffer() 然后使用 clEnqueueMapBuffer 来获得。

但是人们可能知道一个对象已经在固定内存中(因为它是使用这些函数创建的,但在另一个上下文中),因此想要全速使用 clEnqueueReadBuffer()/clEnqueueWriteBuffer()。不幸的是,如果内存没有在当前上下文中固定,则该对象不会被视为固定,并且数据速率不是最大的。

如何说一个对象已经在 OpenCL 的固定内存中?

4

1 回答 1

1

我对这个问题的结论是 OpenCL SDK 必须维护自己的一组标志,以了解它们是否分配了缓冲区,因此可以安全地假设它是否被固定。他们似乎保守地假设外部分配的缓冲区没有固定或对齐。

我尝试将基准的带宽与使用外部分配的内存分配的缓冲区和使用外部clCreateBuffer分配的内存的缓冲区相匹配,无论是在不同的上下文中使用还是手动固定和对齐内存,第一个似乎总是对 AMD 和 nvidia 表现更好。clCreateBuffer

于 2013-04-21T00:09:58.373 回答