ホームページ > バックエンド開発 > C++ > 8192 要素の配列をループするとプログラムが突然遅くなるのはなぜですか?

8192 要素の配列をループするとプログラムが突然遅くなるのはなぜですか?

DDD
リリース: 2024-12-17 04:47:25
オリジナル
259 人が閲覧しました

Why Does Looping Over an 8192-Element Array Suddenly Slow Down My Program?

8192 要素をループするとプログラムが遅くなる理由

次のコード スニペットを考えてみましょう。

#define SIZE 8192
float img[SIZE][SIZE]; // input image
float res[SIZE][SIZE]; // result of mean filter

int main() {
    // Initialization
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            img[j][i] = (2 * j + i) % 8196;
        }
    }

    // Matrix processing - applying mean filter
    for (int i = 1; i < SIZE - 1; i++) {
        for (int j = 1; j < SIZE - 1; j++) {
            res[j][i] = 0;
            for (int k = -1; k < 2; k++) {
                for (int l = -1; l < 2; l++) {
                    res[j][i] += img[j + l][i + k];
                }
            }
            res[j][i] /= 9;
        }
    }
}
ログイン後にコピー

このコードは次のことを示しています。実行時の SIZE の値に応じたパフォーマンスの変動回:

  • SIZE = 8191: 3.44 秒
  • SIZE = 8192: 7.20 秒
  • SIZE = 8193: 3.18 秒

理解問題

実行時間の違いは、スーパーアライメントとして知られる既知の問題に起因する可能性があります:

  • SIZE が次の倍数である場合2048 (つまり、この場合は 8192)、特定のパターンで要素にアクセスすると、メモリ効率が低下しますレイアウト。

メモリ管理

Malloc/free はパフォーマンスの違いに直接関与しません。

アウター ループ順序

このコードのもう 1 つの重要な問題は、外側のコードの順序です。ループします。元のコードは行列を列方向に反復しますが、行方向の反復はメモリ アクセスの効率が高くなります。

解決策

パフォーマンスの問題を軽減するには、外側のループを使用します。置き換える必要があります:

    for (int j = 1; j < SIZE - 1; j++) {
        for (int i = 1; i < SIZE - 1; i++) {
            res[j][i] = 0;
            for (int k = -1; k < 2; k++) {
                for (int l = -1; l < 2; l++) {
                    res[j][i] += img[j + l][i + k];
                }
            }
            res[j][i] /= 9;
        }
    }
ログイン後にコピー

パフォーマンス改善

外側のループを交換した後、パフォーマンスが大幅に向上しました:

  • SIZE = 8191: 0.376 秒
  • SIZE = 8192: 0.357 秒
  • サイズ = 8193: 0.351秒

以上が8192 要素の配列をループするとプログラムが突然遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート