更好的折叠循环索引计算

时间:2012-03-26 07:42:09

标签: c++ c performance optimization

我有以下循环:

for (int ij =  begin; ij < ni*nj; ij += step) {
    int j = ij/ni;
    int i = ij - j*ni;
    ...
}

在没有div / mod的情况下计算i,j还有哪些其他选项?

展开循环是而不是一个选项。

3 个答案:

答案 0 :(得分:5)

我使用两个变量。你必须使用除法和模数 之前可以begin,也许step(取决于step的大小) 进入循环,但它们在循环中不是必需的。如果 step小于ni的除数,然后应该执行以下操作 诀窍:

int end = ni;
int i = begin % ni;
int firstJ = begin / ni;
int j = firstJ;
while ( i < ni ) {
    //  ...
    j += step;
    if ( j >= nj ) {
        ++ i;
        j = firstJ;
    }
}

如果step不是nj - firstJ的倍数,则必须这样做 关于在j >= nj时处理其余部分的事情。

我假设ij用于索引数据。取决于 如何构建数据,添加begin可能更简单 它预先(如果你有一个指针),或迭代忽略begin, 在每次访问时添加begin。 (如果你这样做,别忘了纠正 相应地ninj。)

答案 1 :(得分:0)

只是一个简单的变量可能有用

int end =  ni*nj;

并在for循环中使用它。

答案 2 :(得分:0)

您可以执行以下操作

int k=0, j;
int temp = 1;
int result = 1;
do{
    k++;
    result = ni*k;
}
while(ni*k < ij);
j = result;

在此之后你可以用你正在做的方式计算我,因为你没有使用div / mod。