【发布时间】:2015-09-12 22:35:00
【问题描述】:
我正在学习 OpenCL 并尝试在一些低延迟场景中使用它,所以我真的很担心内存传输延迟。
根据 NVidia 的 OpenCL 最佳实践指南以及许多其他地方,应避免对缓冲区对象进行直接读/写。相反,我们应该使用 map/unmap 实用程序。在该指南中,给出了这样的演示代码:
cl_mem cmPinnedBufIn = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, memSize, NULL, NULL);
cl_mem cmDevBufIn = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, memSize, NULL, NULL);
unsigned char* cDataIn = (unsigned char*) clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE, CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);
for(unsigned int i = 0; i < memSize; i++)
{
cDataIn[i] = (unsigned char)(i & 0xff);
}
clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0, szBuffBytes, cDataIn , 0, NULL, NULL);
在这段代码sn-p中,显式生成了两个缓冲区对象,并显式调用了一个写入设备操作。
如果我的理解是正确的,当你用CL_MEM_ALLOC_HOST_PTR 或CL_MEM_USE_HOST_PTR 调用clCreateBuffer 时,缓冲区对象的存储是在主机端创建的,可能在DMA 内存中,并且在设备端没有分配存储。所以上面的代码实际上创建了两个独立的存储。如果是这样:
如果我在没有主机端内存的
cmDevBufIn上调用映射缓冲区会发生什么?对于 CPU 集成 GPU,没有单独的图形内存。尤其是新版AMD APU,内存地址也是同源的。所以看起来创建两个缓冲区对象并不好。集成平台的最佳做法是什么?
有没有办法为不同平台编写单行内存传输代码?或者我必须编写几套不同的内存传输代码,才能为 Nvidia、AMD 独立 GPU、AMD 旧 APU、AMD 新 APU 和 Intel HD 显卡实现最佳性能......
【问题讨论】:
标签: opencl