SIMD

同时并行处理来优化速率

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

SIMD
https://lhish.github.io/project/hide/SIMD/
作者
lhy
发布于
2025年8月16日
许可协议