我查看了glm(一个用于3d计算的矩阵向量库)操作的clang生成的反汇编代码。
我注意到clang做了一些“矢量化”'用于双精度操作,例如。在一条SIMD指令中强制进行两次乘法运算。
但是,对于单精度计算,代码似乎对我不利。使用的指令来自SSE指令集和寄存器MMX指令,但是每次多次复制都是针对一个浮点数进行的,甚至一组赋值(例如矩阵赋值)都是由一大堆movss语句执行的。 。那些糟糕的任务甚至适用于双精度代码。
为什么会这样,是否有任何命令行参数可以激励clang做得更好?我知道编译器没有什么神奇之处,但是我想在很多方面可以优化16个内存相邻分配的线性列表吗?
答案 0 :(得分:0)
在汇编中,读取xmm寄存器不是矢量化的证明,因为现在每个双精度操作都在SIMD寄存器中执行(即使是单个)。
对于编译器来说,矢量化并不简单,clang提供了像
这样的选项clang -fslp-vectorize-aggressive file.c
它可能有所帮助,否则你可能会寻找替代方案,它存在很多用于矩阵乘法,MKL,提升数值,等离子等的库......在我的纪念品中,GLM很旧,存在很好的替代方案。