使用Intel 向量化编译器优化性能(3)
本文节选翻译自Intel编译器文档
1. 向量化循环中的数据类型
在整形的循环中,MMX和SSE技术都为多数使用8/16/32bits长度数据的算法和逻辑操作提供了相应的SIMD指令,如果一个使用整数的算法把结果保存在一个有足够精度的变量中,那么这个算法就可能被向量化,举例说,一个运算的结果是32位整数,但却被保存在一个16位的整数中,那么这么操作就不能被向量化,不是所有整形操作都能够被向量化的.
在32位或64位浮点数的循环中,SSE指令集不光为加减乘除等运算提供了相应的SIMD指令,而且也提供了诸如MAX/MIN/SORT这样的操作的SIMD指令,其它的一些数学运算,比如三角函数SIN/COS/TAN的SIMD版本也已经在和编译器一起提供的向量数学库中得到了支持.
2. 展开循环
编译器会自动对循环进行分析,并生成展开后的代码,这就是说你不需要自己去展开循环重新编写循环操作,在很多情况下,这能够使你获得更多的向量化操作.
看下面的循环
int i = 0;
while(i < k)
{
a[i] = b[i] + c[i];
++i;
}
向量化后就生成这样2个循环操作
while(i < (k - k % 4))
{
a[i] = b[i] + c[i];
a[i + 1] = b[i + 1] + c[i + 1];
a[i + 2] = b[i + 2] + c[i + 2];