c++ - 为什么向量化在这个 for 循环中没有好处?
问题描述
我正在尝试对这个 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 向量完全正确对齐,否则从“未知”偏移量(您所称someOuterVariable
的)访问数组会阻止编译器编写有效的向量化代码。
编辑:关于“交错”问题,如果不知道您的工具,很难猜测。但一般来说,交错通常意味着混合 2 个计算流,使 CPU 的计算单元都处于忙碌状态。例如,如果您的 CPU 中有 2 个 ALU,并且程序正在执行以下操作:
c = a + b;
d = e * f;
编译器可以交错计算,以便加法和乘法同时发生(假设您有 2 个可用的 ALU)。通常,这意味着计算时间较长的乘法(例如 6 个周期)将在加法之前开始(例如 3 个周期)。如果编译器对计算进行序列化,您将在 6 个周期而不是 9 个周期后获得这两个操作的结果。这只有在计算之间没有依赖关系时才有可能(如果d
需要c
,它不能工作)。编译器对此非常谨慎,并且在您的示例中,如果它不能证明这一点array
并且anotherArray
不别名,则不会应用此优化。
推荐阅读
- angular - 无法初始化 FormGroup
- javascript - 如何将从 1 个量角器测试脚本中检索到的变量传递给另一个
- c++ - 返回析构函数有副作用的对象
- python - 如何将 dask 数据帧写入谷歌云存储或 Bigquery
- javascript - javascript字符串日期格式之间的区别
- python - 在 matplotlib 的水平条形图上添加百分比值
- javascript - 如何在套接字 io 连接中长时间保持活动客户端会话
- c# - C#DownloadStringTaskAsync:为什么没有触发超时异常捕获?
- angular - 如何检测角度 6 中打字稿对象的变化
- c# - 内存流关闭?