1

私はCコードを書きます

for(i=1;i<10000;i++)
    x[i]=array1[h][x[i]^x[i-1]]

for(i=9999;i>0;i--)
    x[i]=x[i-1]^array2[h][x[i]]

ノート:

1- array1 と array2 にはバイト値が含まれています

2 - 2 番目のループは、最初のループの反対の機能を実行します

3- h はバイト値で、ループ 1 とループ 2 で同じです

私の質問は

2 番目のループは最初のループよりも高速です。これは理解できます。最初のループでは、x のすべての値が前のバイト IE の新しい値に依存するからです。x2 を計算するには、x1 を計算する必要がありますが、2 番目のループでは、各バイトは既に存在する前のバイトの古い値に依存します。x9999 を計算するには、新しい値ではなく x9998 の古い値が必要なので、x9999 の計算を待つ必要はありません。これが C コードでどのように行われるか、および呼び出されるのは並列プログラミングであり、C 言語がいくつかのループに対して並列プログラミングを行うことを意味します。ユーザーがそのような並列を制御および作成しなければ、シーケンシャルではありません

問題は、なぜ 2. ループは 1. ループより速いのですか?

どうもありがとう

私はCコードの初心者です

簡単すぎる質問ですみません

4

4 に答える 4

0

unsigned char * aa = &array1[h];どちらの場合も、 (またはarray2[h]2 番目のループの場合)と言う必要があります。コンパイラがそのインデックス操作を解除してくれることを期待しても意味がありません。

2 つのループは異なることを行っています。

ループ 1 はx[i] ^ x[i-1]にインデックスを付ける前に行いますがaa、ループ 2は前にインデックスaaを付けてx[i]から後に実行^ x[i-1]します。

x[i]いずれにせよ、とのポインターを使用しx[i-1]、ループをアンロールするので、ループ 1 は次のようになります。

unsigned char * aa = &array1[h];
unsigned char * px = &x[1];
unsigned char * px1 = &x[0];
for (i = 1; i < 10; i++){
   *px = aa[ *px ^ *px1 ]; px++; px1++;
}
for ( ; i < 10000; i += 10 ){
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
   *px = aa[ *px ^ *px1 ]; px++; px1++;
}

別の方法として、単一のpポインターを使用し、次のようにハード オフセットを使用することもできます。

unsigned char * aa = &array1[h];
unsigned char * px = &x[0];
for (i = 1; i < 10; i++){
   px[1] = aa[ px[1] ^ px[0] ]; px++;
}
for ( ; i < 10000; i += 10, px += 10 ){
   px[ 1] = aa[ px[ 1] ^ px[0] ];
   px[ 2] = aa[ px[ 2] ^ px[1] ];
   px[ 3] = aa[ px[ 3] ^ px[2] ];
   px[ 4] = aa[ px[ 4] ^ px[3] ];
   px[ 5] = aa[ px[ 5] ^ px[4] ];
   px[ 6] = aa[ px[ 6] ^ px[5] ];
   px[ 7] = aa[ px[ 7] ^ px[6] ];
   px[ 8] = aa[ px[ 8] ^ px[7] ];
   px[ 9] = aa[ px[ 9] ^ px[8] ];
   px[10] = aa[ px[10] ^ px[9] ];
}

どちらが速いかわかりません。

繰り返しになりますが、コンパイラのオプティマイザがこれを行うと言う人もいますが、それを支援しても害はありません。

于 2013-09-17T19:48:47.683 に答える