为什么在这个for循环中进行向量化不会有益处?

7

我正在尝试将这个for循环向量化。在使用Rpass标志后,它会输出以下提示:

int someOuterVariable = 0;

for (unsigned int i = 7; i != -1; i--)
{
  array[someOuterVariable + i] -= 0.3 * anotherArray[i];
}

Remark:
The cost-model indicates that vectorization is not beneficial
the cost-model indicates that interleaving is not beneficial

我希望了解这是什么意思。“交错不利”是否意味着数组索引不正确?


1
可能是因为您的循环迭代次数太少。 - Alan Birtles
自由迭代是什么意思? - The Doctor
12
这意味着我需要检查我在手机上输入的内容。 - Alan Birtles
1
你应该发布一个 [mre]。我也强烈建议编译时启用警告(你有一个带符号和无符号的比较)。 - chtz
1个回答

9
没有更多关于您的类型的详细信息,很难回答。但是一般来说,启动循环会产生一些成本,矢量化也意味着一些成本(例如将数据移动到/从SIMD寄存器,确保数据正确对齐)。
我猜编译器告诉你,这里的矢量化成本比不使用它简单运行8次循环要大,所以它没有使用它。
尝试增加迭代次数,或者例如帮助编译器计算对齐方式。
通常,除非数组项的类型恰好符合SIMD向量的正确对齐方式,否则从“未知”偏移量(您称之为someOuterVariable)访问数组将阻止编译器编写有效的矢量化代码。
编辑:关于“交错”问题,很难猜测不了解您的工具。但是一般来说,“交错”通常意味着混合2个计算流,以便CPU的计算单元全部忙碌。例如,如果您的CPU中有2个ALU,并且程序正在执行:
c = a + b;
d = e * f;

编译器可以交错计算,使加法和乘法同时进行(前提是有2个ALU可用)。通常,这意味着乘法(例如6个周期)比加法(例如3个周期)需要更长的计算时间。然后,您将在只有6个周期而不是9个周期的情况下获得两个操作的结果,如果编译器序列化了这些计算,则会更长时间。只有在计算之间没有依赖关系(如果“d”需要“c”,则无法使用)才能实现这一点。编译器对此非常谨慎,在您的示例中,如果不能证明“array”和“anotherArray”不会别名,则不会应用此优化。


这个备注的意思是什么:“成本模型表明交错不是有益的”? - The Doctor
你使用的程序手册可能有关于该信息含义的想法。 - U. W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接