zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[C/C++]想把算法提速十几倍可以这样做

2023-04-18 14:16:21 时间

C/C++编程语言一个优势是程序的效率,这对于计算量大的人工智能算法尤为重要。如果你能够将程序效率提升10倍,那意味着程序可以用1/10的时间完成任务,也意味着算法可以部署到非常低价的嵌入式系统上。

要想程序跑得快,可以依次做如下事情。

1. 利用编译器的优化选项

编译的时候gcc/g++等编译器使用“-O3”选项,Visual Studio请在项目属性页面里:项目->属性->配置属性->C/C++->优化->优化:使速度最大化(/O2)。

另外,切勿在Debug模式下评估速度(gcc/g+的“-g” “-ggdb”选项,VS的Debug模式),因为Debug生成的程序有大量的Debug指令。

2. 利用SIMD指令

SIMD的全称是Single Instruction Multiple Data,是由CPU支持的加速指令。Intel CPU的有MMX、SSE、AVX2、AVX512等,ARM CPU是NEON指令,RISC-V CPU是RVV。各种平台的差异很大,我曾写过文章介绍过OpenCV提供的统一指令:使用OpenCV中的universal intrinsics为算法提速 (1)使用OpenCV中的universal intrinsics为算法提速 (2)使用OpenCV中的universal intrinsics为算法提速 (3)

3. OpenMP多核并行

前面介绍的SIMD指令只是应用到一个CPU内核上,要让多个CPU内核都忙起来,可以使用OpenMP。用法很简单,如下图,for循环就并行了。但要注意数据冲突的问题。

#include <omp.h>
#pragma omp parallel for
for (size_t i = 0; i < n; i+=8)
{
//...
}

关于上面提到的这些技巧,我在南方科技大学的本科生课程“C/C++程序设计”有详细的介绍。感兴趣的可以在B站观看课程视频(长按下方二维码)。

95872ec83f80a1c9a02241dd9b7b3cbf.png