OpenCL ARM Mali GPU OpenCL映射

为了满足不同应用市场的需求,ARM通过增加/减少渲染核的数量,同时控制渲染核内的向量计算单元数量对Mali进行裁剪。目前来看,这两者基本上不会对编程和优化产生影响。

OpenCL中每个工作组都会映射到每组(T764是4个)渲染核上执行,渲染核心中的向量计算单元循环迭代每个工作项。由于T764没有设计局部存储器,因此OpenCL程序中显式使用的局部存储器都会被映射到全局存储器上处理。由于没有局部存储器,工作组内存储器栅栏也基本上没有必要了。由于没有独立的局部存储器,因此在大多数情况下工作组的尺寸也没有必要,故尽量在EnqueNDRangeKernel是将工作组大小设置为NULL,以便让编译器选择最优值。

每个work item映射到一个渲染核上处理,由于渲染核中的向量计算单元有独立的指令指针和分支寄存器,因此分支对性能的影响比在AMD和NVIDIA GPU上小。由于每个向量计算单元长度是128位,故要尽量使用向量数据类型,以充分利用长度为128位的VLIW单元的计算能力。

由于没有常量存储器,因此即便使用constant关键字,Mali的OpenCL实现也会用全局存储器来代替常量存储器。不过考虑到其不会对程序性能产生负面影响并且在一些GPU架构上能够产生性能优势,因此依旧建议使用。

由于只有使用图像对象才能利用到纹理缓存,故建议对不变数据尽量使用图像对象访问。

访问全局存储器时,要尽量使得相邻的工作项访问相邻的地址,尽量避免存储器地址出现分支。大多数情况下,Mali GPU都是和ARM CPU同时集成在一片SoC上,因此共用同一块内存,故可在创建buffer或image时使用CL_MEM_ALLOC_HOST_PTR选项,然后获得其映射到CPU端的指针。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程