1

文字の 2D 配列で表される画像があります。この画像に対していくつかの操作を実行し、結果を別の 2D 配列に格納する必要があります。これらの操作は、隣接セルの平均値の計算から行の並べ替えまでさまざまです。パフォーマンスを向上させるために実行できる最適化にはどのようなものがありますか? 考えられるあらゆる手法を歓迎します (例: 参照の局所性、インライン アセンブリなど)。

cLinux x86_64 マシンで使用します

PS: 各ピクセルが RGB 値のグループで表される生のカラー画像があります。

4

2 に答える 2

2
  • まず、rgb トリプレットごとに 4 バイトを割り当てます。
  • 各行の先頭へのポインターを持っていると、ポインター交換でシャッフルを行うことができます
  • APIを次のように計画しますvoid process_row(int *out_row, int *in_row, int *row_above, int *row_below);

  • 一部の RGB 計算は、通常の整数演算と並行して計算できます。

    • たとえば、00rrrrrrrr 00bbbbbbbb 00gggggggg は、単一の 32 ビット整数に適合します。
      オーバーフローせずに 4 つ追加し、結果を 2 ビット右にシフトして、
      0011111111 0011111111 0011111111 b でマスクします
      (もちろん、これにはデータの前処理と後処理が必要です)。
    • 64ビットプロセッサのパッキング00 rr 00 gg 00 bb 00 aaも実現可能なアプローチです
  • おそらくさらに簡単なアプローチは、__sse 組み込み関数を使用することです。そこから...
  • インライン アセンブラ
  • ポータブル SIMDを実装するパッケージORCもあります。
于 2012-11-05T08:48:57.960 に答える
0

2D 配列の代わりに 1D 配列を使用すると、キャッシュ ヒット率が大幅に向上します。これにより、プログラムの実行時間が最適化されます。

于 2012-11-14T15:18:32.260 に答える