gpt4 book ai didi

c - c中绝对最快的for循环是什么?

转载 作者:行者123 更新时间:2023-12-04 09:54:53 24 4
gpt4 key购买 nike

我正在尝试编写用于访问图像像素的优化代码,并且需要在不降低到汇编级别的情况下使 for 循环超快。此外,索引是沿着行完成的,以最大限度地减少缓存未命中。

这是我的:

for (indr=0;indr<(height-1)*width;indr+=width) {
for (indc=0;indc<width;indc++){
I[indr+indc]= dostuff ;
}
}

我不能让它成为一个循环,因为“dostuff”包括访问不在同一行的元素。

有没有更快的方法来做到这一点?

编辑好的,因为我之前的帖子有点不清楚我在这里添加了完整的代码。它非常难以理解,但一般的想法是我使用一个完整的图像对一个简单的盒子进行卷积。图像首先在左侧和底部用 ws+1 个零填充,在右侧和顶部用 ws 个零填充。然后将其制成一个完整的图像Ii。以下函数采用积分图像并提取结果 Ic 与原始图像大小相同的卷积。

void convI(float *Ic,float *Ii,int ws, int width, int height)
{
int W=width+ws*2+1,indR;
int H=height+ws*2+1,indC;
int w=width, indr;
int h=height, indc;
int jmpA=W*(ws+1),jmpC=W*ws,jmpB=ws+1,jmpD=ws;

for (indR=W*(ws+1),indr=0;indr<width*(height-1);indR+=W,indr+=width) {
for (indC=ws+1,indc=0;indc<width;indC++,indc++){
//Performs I[indA]+I[indD]-I[indB]-I[indC];
Ic[indr+indc]=
Ii[indR-jmpA+indC-jmpB]+
Ii[indR+jmpC+indC+jmpD]-
Ii[indR+jmpC+indC-jmpB]-
Ii[indR-jmpA+indC+jmpD];
}
}
}

这就是“dostuff”部分。循环缓慢。

最佳答案

如果您启用了所有优化级别,则没有太多理由表明其他代码会比您提供的代码产生更好的性能。

为什么您怀疑循环本身是瓶颈?如果不知道您实际在做什么,就没有太多可说的了。对您的代码进行基准测试,如果您有疑问,请查看它生成的汇编程序。

编辑:在您显示循环的内部部分之后。

将索引计算的表达式尽可能多地放在循环之外有一点潜力。由于它与循环变量混合在一起,因此可能无法按应有的方式对其进行优化。 (或者只是重新排序索引的计算,以便编译器可以看到它并可以尽可能多地进行预计算。)

性能困难最有可能来自于对 vector 的访问。如果您设法更好地计算索引,这也可能会有所改善,因为编译器/系统实际上会看到您以常规模式访问 vector 。

如果这没有帮助,请重新组织您的循环,使您的 vector 加载是递增的,而不是存储。加载总是必须等到数据存在才能执行操作,存储对此不太敏感。

关于c - c中绝对最快的for循环是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759185/

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