SIMD
同时并行处理来优化速率
- 将代码简单化
- 栈上更易于优化
- 代码过于复杂,涉及的语句数量过多时,编译器会放弃优化!
- __restrict 是一个提示性的关键字,是程序员向编译器保证:这些指针之间不会发生重叠
- 尽量连续访问
- -march=native 让编译器自动判断当前硬件支持的指令。
- 不必为了高效,手动改写成对 memcpy/memset 的调用,影响可读性。编译器会自动分析你是在做拷贝或是清零,并优化成对标准库这俩的调用。
- 有ps后缀的汇编就是simd优化了
- 使用4的倍数
- 循环中的 if 语句:挪到外面来
- 循环中的不变量:挪到外面来
- 放在同一个文件里,让编译器知道调用的函数的内容,方便优化
- #pragma GCC unroll 4表示把循环体展开为4个
- 结构体大小若不是 2 的整数幂,往往会导致 SIMD 优化失败,用alignas
- SOA:分离存储多个属性,常常有利于性能。又称之为面向数据编程 (DOP)
1 | |
- __restrict不能用于 std::vector,因此用pragma omp simd 或 pragma GCC ivdep让编译器放心大胆优化。
- -ffast-math,让 GCC 更大胆地尝试浮点运算的优化,有时能带来 2 倍左右的提升。如果你能保证,程序中永远不会出现 NaN 和无穷大,那么可以放心打开 -ffast-math。
- 先读到局部变量,累加完毕后,再写入
SIMD
https://lhish.github.io/project/hide/SIMD/