ホームページ >バックエンド開発 >C++ >8192x8192 行列の効率的な処理にループ順序が重要なのはなぜですか?

8192x8192 行列の効率的な処理にループ順序が重要なのはなぜですか?

DDD
DDDオリジナル
2024-12-06 16:03:16222ブラウズ

Why is Loop Order Crucial for Efficient Processing of an 8192x8192 Matrix?

8192 要素にわたる低速ループ: パフォーマンスのペナルティを理解する

提供されたコードは、9 つ​​の要素の平均を計算することによって行列 img を処理します。各非境界要素の周囲のセルを抽出し、結果を行列 res に保存します。マトリックス サイズが 8192x8192 の場合、プログラムのパフォーマンスは大幅に低下します。

この速度低下は、スーパー アライメントに関連するメモリ管理の問題が原因であると考えられます。コンパイラはパフォーマンスを向上させるためにメモリ内のデータ構造を調整します。この場合、行列レイアウトにより非効率なメモリ アクセスが発生する可能性があります。

この問題を解決するには、平均化演算のループの順序を入れ替える必要があります。列方向に反復する代わりに、ループは行方向に反復する必要があります。

変更されたコードは次のとおりです:

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        res[j][i] += img[j  ][i-1];
        res[j][i] += img[j+1][i-1];
        res[j][i] += img[j-1][i  ];
        res[j][i] += img[j  ][i  ];
        res[j][i] += img[j+1][i  ];
        res[j][i] += img[j-1][i+1];
        res[j][i] += img[j  ][i+1];
        res[j][i] += img[j+1][i+1];
        res[j][i] /= 9;
    }
}

ループ順序を変更することで、シーケンシャル メモリが作成されます。アクセスは維持され、非順次アクセスに伴うパフォーマンスの低下が排除されます。

パフォーマンス比較:

交換されたループ構造によりパフォーマンスが大幅に向上:

元のコード:

  • 8191: 1.499 秒
  • 8192: 2.122秒
  • 8193: 1.582 秒

交換ループ:

  • 8191: 0.376 秒
  • 8192: 0.357秒
  • 8193: 0.351 秒

この変更により、効率的なメモリ管理が保証され、8192 要素をループする際のパフォーマンスの低下が解決されます。

以上が8192x8192 行列の効率的な処理にループ順序が重要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。