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

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

#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];

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

编译器说:
消息:循环没有矢量化:矢量化可能但似乎效率低下.

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

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

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

编辑:据我所知,编译器认为它效率低下.我在问:

为什么效率低下?

我怎么能强迫它以便我可以自己做基准测试?

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

最佳答案
根据英特尔编译器中的矢量化:

有SIMD(单指令多数据)寄存器,长度为128字节.因此,如果sizeof(int)为4,那么4个整数可以位于这些寄存器中,并且单个指令可以对这4个整数执行.(这也取决于是否对这些整数执行相同类型的操作,这里是真的.更多关于每个元素LHS上的数组取决于不同数组的不同元素.)

如果有8个整数则需要两个指令.(而不是没有向量化的8个指令).

但如果有5(或6或7)个整数,那么这也需要两个指令.这可能不比没有矢量化代码更好.

进一步阅读LINK.

转载注明原文:c – 英特尔编译器无法矢量化这个简单的循环? - 代码日志