gpt4 book ai didi

c++ - 矢量化:何时值得手动展开循环?

转载 作者:行者123 更新时间:2023-12-01 14:07:05 27 4
gpt4 key购买 nike

我想对有一个大致的了解当我可以期望编译器对循环进行矢量化时 展开循环对我来说是值得的帮助它决定使用矢量化。

我明白细节很重要(什么编译器,什么编译选项,什么架构,我如何在循环中编写代码等),但我想知道现代编译器是否有一些通用指南。

我将更具体地给出一个简单循环的例子(代码不应该计算任何有用的东西):

    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/

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