首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >arm mali gpus上的零拷贝缓冲区分配?

arm mali gpus上的零拷贝缓冲区分配?
EN

Stack Overflow用户
提问于 2019-10-21 15:23:49
回答 2查看 198关注 0票数 0

我希望在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之间实现零复制行为的最佳方式是什么。

EN

回答 2

Stack Overflow用户

发布于 2019-10-21 18:47:29

我认为你混淆了两个不相关的概念,零拷贝和共享虚拟内存。零拷贝并不能保证一块物理内存在CPU和GPU的同一地址上是可见的--它们可以在CPU和GPU的虚拟地址空间中以不同的方式映射。如果您希望物理内存在GPU和CPU中具有相同的虚拟地址,则需要共享虚拟内存(SVM)。这需要OpenCL 2.x并通过clSVMAlloc()分配缓冲区。如果你的供应商没有提供OpenCL 2.x,只提供1.x,那么你就不走运了--你可以有零拷贝缓冲区,但不能有。

票数 1
EN

Stack Overflow用户

发布于 2020-01-14 17:27:58

试试这个:

使用CL_MEM_ALLOC_HOST_PTR.

  • Call

  • 创建缓冲区以获取主机端指针。

示例代码:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58481560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档