OpenCL 如何在集成开发内核和 CPU 内核之间设置内存缓冲区?

问题描述 投票:0回答:1

外部设备通常有自己独立的内存,这需要设备和CPU之间的DMA内存区域将数据从系统DRAM复制到设备的内部DRAM。

因此,我认为 OpenCL 需要为这些区域设置 DMA。同样基于OpenCL内存传输函数如何工作?,似乎OpenCL为数据传输设置了DMA缓冲区。

我的问题是,SoC 中与 CPU 核心共享 DRAM 的集成设备(例如 MaliGPU)会发生什么情况。我最初认为它仍然需要 DMA 内存区域来在集成设备和 CPU 之间进行通信以实现一致性(即使集成 GPU 可以访问任何内存区域..)

因此,我在 Linux 内核中修补了 dma_alloc_attrs 函数(应由所有 DMA 相关 API 调用,例如 dma_alloc_coherent),以便在某些驱动程序设置 DMA 区域时打印出消息。但是,当我在 Mali GPU 上运行 openCL 应用程序时,它永远不会打印出内核消息(由 dmesg 检查)。不知道是不是因为...

  1. 仍然使用 DMA,但这些区域通常会被缓存,并且在运行时不会频繁分配,因为它使用预先分配的 DMA 区域

  2. opencl 使用不同的 dma 分配函数,可能是自定义函数或其他内核 API..

有人知道opencl实现的细节请回答我的问题!

gpu opencl dma
1个回答
0
投票

对于CPU+iGPU的情况,OpenCL可以仅在主机端使用

malloc
设置/
CL_MEM_USE_HOST_PTR
内存,并与iGPU共享此指针。由于CPU+iGPU使用相同的统一内存,因此主机和设备之间不需要复制任何数据,并且两者都可以直接访问。

© www.soinside.com 2019 - 2024. All rights reserved.