我希望在arm、马里、midgard、gpus和arm clBuffer上的opencl buffers具有零拷贝行为,以便矢量的数据指针和cpus在其生命周期内指向相同的位置。
我尝试过的一些事情。我为一个向量编写了一个自定义分配器(64字节对齐),然后我尝试使用cl_arm_import_memory函数并将向量的指针传递给该函数。但问题是,当我查询设备扩展属性时,我只看到cl_arm_import_memory字符串,而没有看到cl_arm_import_memory_host字符串。
我还尝试先分配一个gpu端缓冲区,然后强制向量指向缓冲区的位置。但根据马里指南,gpu端缓冲区的位置可能会更改,以便在多个映射期间可能指向不同的地址。
所以,我的问题是,在std::vector和和OpenCL buffer之间实现零复制行为的最佳方式是什么。
发布于 2019-10-21 18:47:29
我认为你混淆了两个不相关的概念,零拷贝和共享虚拟内存。零拷贝并不能保证一块物理内存在CPU和GPU的同一地址上是可见的--它们可以在CPU和GPU的虚拟地址空间中以不同的方式映射。如果您希望物理内存在GPU和CPU中具有相同的虚拟地址,则需要共享虚拟内存(SVM)。这需要OpenCL 2.x并通过clSVMAlloc()分配缓冲区。如果你的供应商没有提供OpenCL 2.x,只提供1.x,那么你就不走运了--你可以有零拷贝缓冲区,但不能有。
发布于 2020-01-14 17:27:58
试试这个:
使用CL_MEM_ALLOC_HOST_PTR.
示例代码:
deviceBuffer = clCreateBuffer(cl->context,
CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
sizeof(T) * dataLength,
nullptr,
&error); checkError(error);
hostPtr = (T *) clEnqueueMapBuffer(cl->memCmdQueue,
zeroCopyMem.deviceBuffer,
CL_TRUE,
CL_MAP_WRITE,
0,
sizeof(T) * dataLength,
0, NULL, NULL, &error);https://stackoverflow.com/questions/58481560
复制相似问题