编译器与SIMD优化

1|0优化手法总结

  1. 函数尽量写在同一个文件内
  2. 避免在 for 循环内调用外部函数
  3. 非 const 指针加上 __restrict 修饰
  4. 试着用 SOA 取代AOS
  5. 对齐到 16 或64 字节
  6. 简单的代码,不要复杂化
  7. 试试看 #pragma omp simd
  8. 循环中不变的常量挪到外面来
  9. 对小循环体用#pragma unroll
  10. -ffast-math 和-march=native

2|0优化代码

查看预汇编代码

  • 指针别名
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);

__EOF__

本文作者InsiApple
本文链接https://www.cnblogs.com/InsiApple/p/17008358.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   InsiApple  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示