编译器与SIMD优化
优化手法总结
- 函数尽量写在同一个文件内
- 避免在 for 循环内调用外部函数
- 非 const 指针加上 __restrict 修饰
- 试着用 SOA 取代AOS
- 对齐到 16 或64 字节
- 简单的代码,不要复杂化
- 试试看 #pragma omp simd
- 循环中不变的常量挪到外面来
- 对小循环体用#pragma unroll
- -ffast-math 和-march=native
优化代码
- 指针别名
int func ( int * __restrict a, int * __restrict b);
- 不优化
for (volatile int i = 0; i < 1024 ; ++i);
- gcc ymm 支持检测flag
gcc -march=native -O3
- 忽略指针别名
# pragma omp simd
gcc - fopenmop -O3
# pragma GCC ivdep
//ignire vector devlop
- 尽量替换 面向对象编程(oop) 的 AOS 为 面向数据编程(DOP) 的 SOA
//AOS of OOP
struct obj{
int x, y;
}example[1024];
// SOA of DOP
struct{
int x[1024], y[1024];
}example;
- 数学
- 使用std::math替代 math 如std::cos 替代 cos
- 乘法替代除法 or gcc =ffast -math
- 适当"()"避免四则运算对矢量化计算的干扰
- 一些float, int, double的函数精确使用
float sqrtf(float x);
int abs(any);
double fabs(any);
float fabsf(any);
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/17008358.html