-2

次のコードがあります

for(i=0;i<16;i++)
  for(j=0;j<16;j++)
  {
     in=(i+u*j+rl+rc)&15;
     jn=(v*i+(u*v+1)*j+rc)&15;
     x1[i*16+j]=x2[in*16+jn];
   }

いくつかのメモ:

  1. rlrcu、およびvは、0 ~ 15 の範囲のランダムな値です。
  2. x1およびx2は 256 個の値の配列で、各配列値の範囲は 0 ~ 255 です。
  3. ルックアップ テーブルを使用してこのコードを実装する場合は、16MB とこの大容量メモリが必要です。
4

2 に答える 2

4

ここに1つのアイデアがあります:

少なくとも内側のループの外側に変更されない計算の部分を抽出してみてください。たとえばi + rl + rcin計算はループ内にある必要はありません。それができたら、当然のことながら、16 を法として、反復ごとに の値がin増加することがわかります。uしたがって、乗算を行う代わりに、足し算を行うことができます。

jn計算では、抽出できるいくつかのことも引用しています。

もちろん、これは、これがパフォーマンスのボトルネックであることを実際に知っていることを前提としており (プロファイリングしてください!)、コンパイラはそのような最適化を行うほど賢くありません。疑わしい場合は、アセンブリを検査してください。

于 2013-06-13T11:20:46.760 に答える
2

あなたが試すことができるいくつかのアイデア:

uとのすべての組み合わせのルックアップ テーブルを作成できますがv、これには 64k のメモリしか必要ありません。rlおよびrc水平方向および垂直方向の一定のオフセットとして機能します (最後のステートメントに移動でき、inおよびの計算に参加する必要はありませんjn)。それはあなたがしなければならない数学の量を減らすでしょう。

他のパフォーマンスの最適化と同様に、最初にこれが本当にボトルネックであるかどうかを確認する必要があります。メモリがはるかに遅く、大きなルックアップ テーブルを導入すると処理が遅くなるだけである可能性があります。

于 2013-06-13T13:27:16.040 に答える