我试图将标志CL_MEM_USE_HOST_PTR
与OpenCL函数clCreateBuffer()
一起使用,以避免多个内存分配。经过一些研究(逆向工程),我发现无论我使用什么标志,框架都会调用操作系统分配函数。
也许我的观念错了?但是从文档来看,它应该使用DMA来访问主机内存,而不是分配新内存。
我在Intel设备(HD5500)上使用opencl 1.2
答案 0 :(得分:2)
在英特尔GPU上,确保分配的主机指针是页面对齐的,页面长度为*。实际上我认为缓冲区大小实际上可以是偶数个缓存行,但我总是向上舍入。
使用类似:
void *host_ptr = _aligned_malloc(align_to(size,4096),4096));
Here's a good article for this: 在“关键要点”中。
如果您已有数据并希望将数据加载到OpenCL中 缓冲区对象,然后使用
CL_MEM_USE_HOST_PTR
和分配的缓冲区 一个4096字节的边界(与页面和缓存行边界对齐)和a 总大小是64字节的倍数(缓存行大小)。
您也可以使用CL_MEM_ALLOC_HOST_PTR
并让驱动程序处理分配。但要获得指针,您必须映射并取消映射(但不需要复制)。