我研究了由clang从glm (一个用于3d计算的矩阵向量库)操作生成的反汇编代码。
我注意到clang正在做一些双精度操作的“向量化”,例如。在一条SIMD指令中强制执行两次乘法。
然而,对于单精度计算,代码对我来说似乎各不相同。所使用的指令来自SSE指令集和寄存器MMX指令集,但每次乘法都是针对单个浮点数完成的,甚至是赋值组(例如,矩阵赋值)是由一大堆movss语句执行的。这些糟糕的赋值甚至适用于双精度代码。
为什么会这样呢?有没有什么命令行参数可以激励clang做得更好?我知道编译器没有什么神奇之处,但我猜16个内存相邻的线性赋值列表应该在很多方面都是优化的?
发布于 2015-01-29 23:42:35
在您的程序集中读取xmm寄存器并不是矢量化的证明,因为现在每个双精度操作都在SIMD寄存器中执行(即使是单精度)。
向量化对于编译器来说并不是微不足道的,clang提供了如下选项
clang -fslp-vectorize-aggressive file.c它可能会有帮助,否则你可能会寻找替代方案,它有许多用于矩阵乘法,MKL,boost-numeric,等离子等的库。在我的纪念品中,GLM是古老的,有很好的选择。
https://stackoverflow.com/questions/28046446
复制相似问题