英特尔编译器无法矢量化这个简单的循环?

时间:2013-04-30 09:53:59

标签: c++ vectorization

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

#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.

为什么不能对这个循环进行矢量化?对我来说似乎很简单。我怎样才能强制进行矢量化并检查性能?

我有英特尔C ++编译器2013更新3。

如果有人有兴趣,请填写完整代码:http://pastebin.com/Z6H5ZejW

编辑:我知道编译器认为它效率低下。我在问:

为什么效率低下?

我如何强迫它以便我可以自己进行基准测试?

Edit2:如果我将其更改为4而不是5,那么它会被矢量化。是什么让5效率低下?我认为它可以在2条指令中完成,第一条指令4,第二条指令“正常”指令1,而不是5条指令。

2 个答案:

答案 0 :(得分:2)

根据英特尔编译器中的矢量化:

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

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

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

进一步阅读LINK

答案 1 :(得分:0)

要使矢量化有意义,最内层循环必须有足够大的行程计数。在您的情况下,它很小,编译器根据其成本模型计算出矢量化导致的加速很小或为负。

我在什么时候看到过循环交换的奇迹 - 交换了内循环和外循环,以便最内循环的行程计数很大。