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; } }
ループ順序を変更することで、シーケンシャル メモリが作成されます。アクセスは維持され、非順次アクセスに伴うパフォーマンスの低下が排除されます。
パフォーマンス比較:
交換されたループ構造によりパフォーマンスが大幅に向上:
元のコード:
交換ループ:
この変更により、効率的なメモリ管理が保証され、8192 要素をループする際のパフォーマンスの低下が解決されます。
以上が8192x8192 行列の効率的な処理にループ順序が重要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。