英特尔编译器不能向量化这个简单的循环

Intel compiler cannot vectorize this simple loop?

本文关键字:简单 循环 编译器 不能 向量化 英特尔      更新时间:2023-10-16

所以我有下面的代码,这对我来说似乎很简单:

#define MODS_COUNT 5
int start1 = <calc at runtime>;
int start2 = <calc at runtime>;
for (int j=0; j<MODS_COUNT; j++) // loop 5 times doing simple addition.
    logModifiers[start1 +  j] += logModsThis[start2 + j];

这个循环是外部循环的一部分(不确定这是否有区别)

编译器说:message : loop was not vectorized: vectorization possible but seems inefficient.

为什么这个循环不能被矢量化?这对我来说似乎很简单。我如何自行强制向量化和检查性能?

我有Intel c++ Compiler 2013 update 3.

完整的代码在这里如果有人感兴趣:http://pastebin.com/Z6H5ZejW

编辑:我理解编译器认为它是低效的。我问:

为什么它是低效的?

我怎样才能强迫它,以便我可以对自己进行基准测试?

Edit2:如果我把它改为4而不是5,那么它就会矢量化。是什么让5变得低效?我认为它可以在2个指令中完成,第一个做4个,第二个是"正常"做1个,而不是5个指令。

根据intel编译器的向量化:

有SIMD(单指令多数据)寄存器128字节长。因此,如果sizeof(int)是4,那么4整数可以放在这些寄存器中,并且单个指令可以在这些4 int上执行(这也取决于是否在这些int上完成相同类型的操作,这里是真的。LHS上数组的每个元素都依赖于另一个数组的不同元素。

如果有8个int,则需要两个指令。(而不是没有矢量化的8)。

,但如果有5(或6或7)个int,那么也需要两个指令。其中might并不比没有矢量化的代码更好。

要使向量化有意义,最内层的循环必须有足够大的行程计数。在你的例子中,它很小,编译器根据它的成本模型计算出矢量化导致的加速很小,或者是负的。

当循环交换时,我看到了奇迹-交换内部和外部循环,以便大多数内部循环具有较大的行程计数。