作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对有一个大致的了解当我可以期望编译器对循环进行矢量化时 当 展开循环对我来说是值得的帮助它决定使用矢量化。
我明白细节很重要(什么编译器,什么编译选项,什么架构,我如何在循环中编写代码等),但我想知道现代编译器是否有一些通用指南。
我将更具体地给出一个简单循环的例子(代码不应该计算任何有用的东西):
double *A,*B; // two arrays
int delay = something
[...]
double numer = 0, denomB = 0, denomA = 0;
for (int idxA = 0; idxA < Asize; idxA++)
{
int idxB = idxA + (Bsize-Asize)/2 + delay;
numer += A[idxA] * B[idxB];
denomA += A[idxA] * A[idxA];
denomB += B[idxB] * B[idxB];
}
for ( int idxA = 0; idxA < Asize; idxA+=4 )
{
int idxB = idxA + (Bsize-Asize)/2 + delay;
numer += A[idxA] * B[idxB];
denomA += A[idxA] * A[idxA];
denomB += B[idxB] * B[idxB];
numer += A[idxA+1] * B[idxB+1];
denomA += A[idxA+1] * A[idxA+1];
denomB += B[idxB+1] * B[idxB+1];
numer += A[idxA+2] * B[idxB+2];
denomA += A[idxA+2] * A[idxA+2];
denomB += B[idxB+2] * B[idxB+2];
numer += A[idxA+3] * B[idxB+3];
denomA += A[idxA+3] * A[idxA+3];
denomB += B[idxB+3] * B[idxB+3];
}
最佳答案
简短的回答,正如其他人所说:如果您不指定编译器或目标体系结构,则没有通用指南。
需要注意的是,现在让编译器优化代码通常会更好,因为它“更了解”架构的可能性。在某些情况下,展开循环不会更快。
如果有人看到这个并需要它,有 -funroll-loops
GCC 中的标志。
关于c++ - 矢量化:何时值得手动展开循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61632168/
我是一名优秀的程序员,十分优秀!