外部设备通常有自己独立的内存,这需要设备和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 检查)。不知道是不是因为...
仍然使用 DMA,但这些区域通常会被缓存,并且在运行时不会频繁分配,因为它使用预先分配的 DMA 区域
opencl 使用不同的 dma 分配函数,可能是自定义函数或其他内核 API..
有人知道opencl实现的细节请回答我的问题!
对于CPU+iGPU的情况,OpenCL可以仅在主机端使用
malloc
设置/CL_MEM_USE_HOST_PTR
内存,并与iGPU共享此指针。由于CPU+iGPU使用相同的统一内存,因此主机和设备之间不需要复制任何数据,并且两者都可以直接访问。