英特尔编译器不能向量化这个简单的循环
Intel compiler cannot vectorize this simple loop?
所以我有下面的代码,这对我来说似乎很简单:
#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
并不比没有矢量化的代码更好。
要使向量化有意义,最内层的循环必须有足够大的行程计数。在你的例子中,它很小,编译器根据它的成本模型计算出矢量化导致的加速很小,或者是负的。
当循环交换时,我看到了奇迹-交换内部和外部循环,以便大多数内部循环具有较大的行程计数。
- 退出简单while循环时出现问题
- C++-字符串是否包含一个带有简单循环的单词
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 而循环:简单的除法程序输出零,不明白为什么
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 来自简单循环的 OpenAcc 错误:内核执行期间的非法地址
- 为什么 for 循环只接受这个简单代码中的最后一个字符串?
- 简单的 for() 循环基准测试在任何循环绑定下花费相同的时间
- 双倍简单的循环与一个复杂的循环
- 简单的C++循环无法从多线程中受益
- 如何在 C++ 中使用 MPI 对简单循环进行负载平衡
- 使用 c++17 算法并行化简单循环
- 简单循环中C 程序中的错误
- 如何达到简单循环的AVX计算吞吐量
- 简单循环不适用于随机数
- Qt - 简单循环的执行正在逐渐减慢
- 使用空格取消简单循环
- 视觉 为什么现代C++编译器不优化这样的简单循环?(叮叮当当)
- OpenMP -简单循环,但仍然是无限的
- c++优化简单循环