Leonardo-Ding
Leonardo-Ding
当使用clang编译时,使用-Oz替换-Os编译选项以取得更好优化库体积的效果; 对于develop分支,armv8/c++_shared编译,采用-Os编译,库体积2.0M,采用-Oz编译,库体积1.9M,优化了0.1M的库体积。 armv8/c++_static编译,采用-Os编译,库体积2.4M,采用-Oz编译,库体积2.2M,优化了0.2M的库体积。
修改tiny_publish下使用REGISTER_LITE_KERNEL宏注册kernel调用ParamTypeRegistry的实现,封装一层dummy ParamTypeRegistry供tiny_publish下的调用;c++_shared/armv8测试库体积变化: 修改前:1900KB 修改后:1860KB 减小ParamTypeRegistry类生成的static对象包含的std::map数据域,同时去除calib op注册的NHWC layout的kernel(跟洪明确认过不需要),该PR优化库体积约40KB
去除kernel基类中依赖any的example PR: (1) 原有op_lite.h的OpLite基类中和Op子类中都有ParamBase,通过AttachParam()运行时绑定,这里存在重复,通过Op基类定义纯虚函数访问子类实现予以去除; (2) op和kernel中都需要访问OpParam, 每个Op子类通过AttachKernel()把OpParam传递给对应的Kernel子类,这里通过shared_ptr管理需要传递的OpParam,Kernel基类中定义的Any形式的param予以去除,把相应的SetParam()改成纯虚函数(在子类中实现),把基类中的Param()去除挪到子类中实现; // kernel.h [-] template [-] void SetParam(T param) { [-] param_.set(param); [-] } [-] template [-] P& Param() const { [-] return *param_.get_mutable();...
本PR仅对存量算子做修改,不会影响后续增量算子(带openmp源语修饰的)的合入(因为算子中带openmp源语修饰但编译时关闭openmp编译不会有任何问题),且cmake默认编译选项依然选择openmp, thread_pool默认关闭,只有在.sh脚本中打开thread_pool开关时,thread_pool才会打开,此时openmp关闭,thread_pool和openmp从编译选项上只会二选一; 库体积:本PR在c++_static/with_log=ON下进行测试,thread_pool=ON时,体积为1952K;openmp=ON时,体积为2264K,优化336K,低于之前预期400K~500K的原因是我们的conv算子和element算子里面有更多的并发块修饰; 精度:目前在reset等大部分public模型下已做了精度测试,目前thread_pool和openmp精度对齐; 性能:目前在reset等不带depthwise算子的模型中测试,thread_pool和openmp性能基本对齐,之前QA也已经做过摸底测试,在mobileNet等带depthwise算子的模型中测试,thread_pool多线程性能稍弱于openmp; 限制条件:当前thread_pool的设计模式不支持不同线程对同一内存地址进行写操作,否则结果会发生错误,根据之前讨论结果,目前对arm depthwise等不满足这个限制条件的算子暂不进行修改; 风险点:线程池的接入是优化库体积的重点工作之一,本PR预计合入后会让QA同学进行模型性能和精度的迭代测试,争取在2.10发版前迭代稳定后把thread_pool编译开关默认打开。