所以我有以下代码对我来说似乎很简单:
#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条指令。
答案 0 :(得分:2)
根据英特尔编译器中的矢量化:
有SIMD(单指令多数据)寄存器,长度为128字节。所以如果sizeof(int)是4
那么4
个整数就可以放在这些寄存器中,并且一条指令可以对这些4
int
执行。(这也取决于相同的情况)操作类型在这些int
上完成,这里是正确的.LHS上数组的每个元素都依赖于不同数组的不同元素。)
如果有8 int
s则需要两个指令。(而不是没有矢量化的8个指令)。
但是如果有5(或6或7)int
,那么那也需要两条指令。哪个might
并不比没有矢量化代码好。
进一步阅读LINK。
答案 1 :(得分:0)
要使矢量化有意义,最内层循环必须有足够大的行程计数。在您的情况下,它很小,编译器根据其成本模型计算出矢量化导致的加速很小或为负。
我在什么时候看到过循环交换的奇迹 - 交换了内循环和外循环,以便最内循环的行程计数很大。