6

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

#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 条指令。

4

2 回答 2

2

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

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

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

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

进一步阅读链接

于 2013-04-30T11:05:57.687 回答
0

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

我已经看到了循环交换何时进行的奇迹 - 交换了内部和外部循环,以便最内部的循环具有大量的行程计数。

于 2020-12-31T10:50:14.390 回答