【发布时间】:2013-04-30 09:53:58
【问题描述】:
所以我有以下对我来说似乎很简单的代码:
#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 条指令。
【问题讨论】:
-
你的意思是说你认为编译器是错误的“似乎效率低下”?我倾向于同意,5 个项目的循环可能不会非常有效地矢量化。
-
编译器不会告诉你循环不能被向量化。就我个人而言,我认为选择(不)服从程序员(编译器)认为合适的编译器可能是一个非常好的主意。
-
很可能数据在内存中的组织方式不适合在其上直接使用向量指令,并且编译器已确定重新排列数据的成本超过通过操作节省的时间同时更多。
-
尝试
6和7次。 -
@Koushik 6 和 7 不矢量化。 4 和 8 可以。
标签: c++ vectorization