gpt4 book ai didi

c++ - 为什么矢量化在这个 for 循环中没有好处?

转载 作者:行者123 更新时间:2023-12-03 10:04:24 31 4
gpt4 key购买 nike

我正在尝试将此 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
我想了解这意味着什么。 “交错不是有益的”是否意味着数组索引不正确?

最佳答案

如果没有关于您的类型的更多详细信息,很难回答。但总的来说,启动一个循环会产生一些成本,而矢量化也意味着一些成本(例如将数据移入/移出 SIMD 寄存器,确保数据正确对齐)
我在这里猜测编译器告诉你这里的矢量化成本比没有它的简单运行 8 次迭代要大,所以它没有这样做。
例如尝试增加迭代次数,或者帮助编译器计算对齐。
通常,除非数组项的类型与 SIMD vector 完全对齐,否则从“未知”偏移量(您称之为 someOuterVariable)访问数组会阻止编译器编写有效的向量化代码。
编辑:关于“交错”问题,在不知道您的工具的情况下很难猜测。但总的来说,交错通常意味着混合 2 个计算流,以便 CPU 的计算单元都忙。例如,如果您的 CPU 中有 2 个 ALU,并且程序正在执行:

c = a + b;
d = e * f;
编译器可以交错计算,以便加法和乘法同时发生(前提是您有 2 个 ALU 可用)。通常,这意味着计算时间稍长的乘法(例如 6 个周期)将在加法(例如 3 个周期)之前开始。如果编译器序列化计算,您将在 6 个周期而不是 9 个周期后获得这两个操作的结果。这仅在计算之间没有依赖关系时才有可能(如果 d 需要 c ,则无法工作)。编译器对此非常谨慎,并且在您的示例中,如果无法证明 array,则不会应用此优化。和 anotherArray不要别名。

关于c++ - 为什么矢量化在这个 for 循环中没有好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65680489/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com