1

次の C++ ループがあります。

for (i = LEN_MAX - 1; i >= 0; i--) {
            int j = i - LEN_MAX + len;      
            if (j < 0)
                break;
            int ind = a.getElem(j);
            short t = ind;
            ind = --c[ind];
            b.setElem(ind, t);
}

私がやりたいのは、反復間のすべての依存関係をそこから削除することです。たとえば、上記のループでは、行ind = --c[ind]に反復間の依存関係があります。これは、減少させるには、前の反復からの値を取得する必要があるためです。私が探している変換の例を次に示します。

から:

        for (i = 1; i < RADIX_MAX; i++) {
            if (i == radix)
                break;
            c[i] += c[i - 1];
            c[i] += temp;       
        }

に:

        short temp = c[0];
        for (i = 1; i < RADIX_MAX; i++) {
            if (i == radix)
                break;
            c[i] += temp;     //this loop no longer depends on last iteration 
            temp = c[i];
        }

これと同じ手法を最初に投稿したループに適用したいのですが、方法がわかりません。これを行う理由は、使用しているツールのパフォーマンスを最適化するために必要だからです。誰にもアイデアはありますか?

4

1 に答える 1

0

反復間の依存関係を削除するために提供したループの単純な変換はありません (また、指定した 2 番目の例では、反復間の依存関係が実際には削除されません)。c各反復は、前の反復で何が起こったかに依存し、現在の実装ではそれを回避する方法はありません。cアルゴリズムおよび/または 内に格納された値および/または内の値について何か知っている場合はa、コードを作り直して順序の依存関係を削除できる場合があります。提供されたコードの短いセグメントを考えると、それを行うことはできません.

于 2013-04-05T22:50:59.193 に答える