上一篇 分析了 mace\public\mace.h
和 mace\core\mace.cc
两个文件,本篇说一下与runtime
相关的一些函数。首先是 mace\public\mace_runtime.h
,其对应的源文件为 mace\core\mace_runtime.cc
mace\public\mace_runtime.h
中定义了 GPU
、CPU
运行时的一些API。这里定义的只是较为顶层的接口,具体实现在mace\core\runtime
文件夹下。这个文件夹下有 cpu
、hexagon
、opencl
三个子文件夹,分别对应 CPU
、DSP
、GPU
三种不同平台运行时 API
的相关实现。
由于本人不涉及 DSP
开发,此处只以 CPU
和GPU
为例。
cpu_runtime.h 和 cpu_runtime.cc
mace\core\runtime\cpu
下有 cpu_runtime.h
和cpu_runtime.cc
两个文件, cpu_runtime.h
中定义了GetCPUBigLittleCoreIDs
、SetOpenMPThreadsAndAffinityCPUs
和SetOpenMPThreadsAndAffinityPolicy
三个函数。
GetCPUBigLittleCoreIDs
函数是根据cpu
大小核的频率来获取cpu
不同核的ID
(用到了操作系统的一些接口),mace\public\mace_runtime.h
中的GetBigLittleCoreIDs
即是通过调用这个函数实现。
SetOpenMPThreadsAndAffinityCPUs
函数使用OpenMP
多线程机制进行CPU affinity
的调度以提高程序的运行效率,如果没有开启OpenMP
支持的话,则同样通过CPU affinity
的调度实现线程的cpu
绑定,减小切换损耗(同样用到了操作系统的一些API
)。mace\public\mace_runtime.h
中的SetOpenMPThreadAffinity
即是通过调用这个函数实现。
SetOpenMPThreadsAndAffinityPolicy
函数根据Affinity Policy
(mace\public\mace_runtime.h
中有定义)设置OpenMP
并行化,需要开启OpenMP
。mace\public\mace_runtime.h
中的SetOpenMPThreadPolicy
即是通过调用这个函数实现。
总的来说,mace\core\runtime\cpu\cpu_runtime.cc
针对OpenMP进行了相应的线程加速,同时通过CPU Affinity
调度进行了相应的功耗优化。
OpenCL runtime
首先,从 mace\core\runtime\opencl\opencl_runtime.h
头文件中可以看出 MACE
支持的GPU
包括 ADRENO
、MALI
、PowerVR
,支持的 OpenCL
版本包括 1.0、1.1、1.2 和 2.0。
头文件中定义了OpenCLProfilingTimer
和 OpenCLRuntime
两个类。
OpenCLProfilingTimer
继承自系统的 Timer
类,实现了一些与计时相关的功能。
OpenCLRuntime
这个类用于实现 OpenCL
程序 kernel
端代码的完整流程,包括获取 platform
信息、获取device
信息(GPU type
)、创建context
、创建CommandQueue
、编译program、构建Kernel
等。其中编译program
时,可以有几种不同的方式,如从源码、从Cache
中、从预编译的二进制文件中。除此之外,代码中还涉及了GPU performance
管理的一些API
(与CPU
类型),同样是为了优化 GPU
的功耗(mace\public\mace_runtime.h
中的SetGPUHints
函数即是通过OpenCLRuntime
类的Configure
函数实现)。
OpenCL
中与Image
相关的存储管理在mace\core\runtime\opencl\opencl_allocator.h
和mace\core\runtime\opencl\opencl_allocator.cc
中实现(CPU
中的相关代码在mace\core\allocator.cc
中),通过OpenCLAllocator
类来管理。
OpenCL runtime
涉及的代码较多,此处不一一展开。
由于 OpenCL
还不太熟,论述中可能会有差错,敬请拍砖(轻拍o( ̄ ̄)d )。
版权所有,欢迎转载,转载请注明出处