为了与openCL进行全速通信,必须使用主机端的固定内存。这样的内存永远不会被分页,可以通过使用clCreateBuffer()和CL_MEM_ALLOC_HOST_PTR标志然后clEnqueueMapBuffer来获取。
但是有人可能知道一个对象已经存在于固定内存中(因为它是用例如那些函数创建的,但是在另一个上下文中),因此想要全速使用clEnqueueReadBuffer()/ clEnqueueWriteBuffer()。不幸的是,如果内存未固定在当前上下文中,则不会将该对象视为固定,并且数据速率不是最大值。
如何说某个对象已经固定内存到OpenCL?
答案 0 :(得分:1)
我对这个问题的结论是OpenCL SDK必须保持它们自己的一组标志,以便知道它们是否分配了缓冲区,因此可以安全地假设它是否被固定。他们似乎保守地假设外部分配的缓冲区没有固定也没有对齐。
我尝试使用clCreateBuffer
匹配缓冲区分配的基准测试带宽,并使用外部分配的内存缓冲,使用不同的clCreateBuffer
上下文或手动固定和对齐的内存,第一个似乎总是对AMD和nvidia表现更好。