C 失去对循环变量的依赖-循环优化
我有以下嵌套循环计算:C 失去对循环变量的依赖-循环优化,c,optimization,C,Optimization,我有以下嵌套循环计算: int aY=a*Y,aX=a*X; for(int i=0; i<aY; i+=a) { for(int j=0; j<aX; j+=a) { xInd=i-j+offX; yInd=i+j+offY; if ((xInd>=0) && (xInd<X) && (yInd>=0) && (yInd<Y
int aY=a*Y,aX=a*X;
for(int i=0; i<aY; i+=a)
{
for(int j=0; j<aX; j+=a)
{
xInd=i-j+offX;
yInd=i+j+offY;
if ((xInd>=0) && (xInd<X) &&
(yInd>=0) && (yInd<Y) )
{
z=yInd*X+xInd;
//use z
}
}
}
int-aY=a*Y,aX=a*X;
对于(int i=0;i如果我们假设offX和offY为0,并替换你的“如果我们将问题理解为如何最小化循环中的迭代次数,我们可以采用以下方法
制约因素:
(xInd>=0) && (xInd<X)
(yInd>=0) && (yInd<Y)
修复i
允许我们将第二个循环边界重写为:
for(int i=0; i<aY; i+=a) {
int lower = (max(i + offX - X, -i - offY) / a) * a; //factored out for clarity.
int upper = min(i + offX, Y - i -offY);
for(int j=lower; j<=upper; j+=a) {
你能说明a
,Y
,X
的性质吗?如果它们是常量或变量,答案会有所不同。为什么没有乘法很重要。你的目标是什么架构?迭代的顺序必须保持完全相同吗?这可以并行化吗?你是否缺少一对brackets?@cmh它们是常数。a是角度,X,Y分别是图像的宽度和高度。这是一个优化练习。我们已经了解到乘法是一个相对昂贵的操作。这可以在乘法速度较慢的系统上进行测试
0 <= i - j + offX <= X
0 <= i + j + offY <= Y
for(int i=0; i<aY; i+=a) {
int lower = (max(i + offX - X, -i - offY) / a) * a; //factored out for clarity.
int upper = min(i + offX, Y - i -offY);
for(int j=lower; j<=upper; j+=a) {
int indicies[Y * X];
int index = 0;
for(...){
for(...){
...
indicies[index++] = z;
}
}
// sort indicies
for(int idx = 0; idx < index; idx++){
z = indicies[idx];
//do stuff with z
}