Rumah >pembangunan bahagian belakang >C++ >Mengapa Gelung Saya Lambat Semasa Memproses Elemen 8192?

Mengapa Gelung Saya Lambat Semasa Memproses Elemen 8192?

DDD
DDDasal
2024-12-10 09:51:10678semak imbas

Why is My Loop Slow When Processing 8192 Elements?

Mengapa Prestasi Merosot Apabila Menggulung Lebih 8192 Elemen

Apabila menggelungkan lebih daripada 8192 elemen, program menghadapi kelembapan yang ketara. Ini dikaitkan dengan isu penjajaran memori, diburukkan lagi oleh struktur gelung yang tidak cekap.

Penjajaran Memori

Pemproses moden menggunakan hierarki cache untuk meningkatkan kelajuan akses data. Akses memori yang dijajarkan, di mana data disimpan pada alamat yang berbilang saiz baris cache, membolehkan pengambilan data yang lebih cepat. Walau bagaimanapun, dalam kes ini, parameter SIZE ditakrifkan sebagai 8192, yang bukan gandaan saiz baris cache (biasanya 64 bait). Penjajaran salah ini boleh melambatkan operasi capaian memori.

Penyusunan Gelung

Menggabungkan isu penjajaran memori ialah susunan gelung. Kod asal berulang mengikut lajur matriks, menghasilkan akses memori tidak berurutan. Ini memaksa pemproses untuk melakukan pengambilan semula data secara perlahan dan rawak daripada memori.

Penyelesaian

Terdapat dua penyelesaian yang mungkin:

  1. Sejajar memori: Takrifkan semula SIZE kepada gandaan saiz baris cache (cth., 8192 64).
  2. Penyusunan gelung pertukaran: Daripada lelaran mengikut lajur, lelaran mengikut baris matriks. Ini menjajarkan akses memori dengan organisasi baris cache, membolehkan pengambilan data yang lebih pantas dan cekap.

Dengan menukar susunan gelung dalam kod, kesesakan prestasi dihapuskan.

Contoh

Kod berikut menggambarkan betulkan:

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];
        ...
    }
}

Perbandingan Prestasi

Selepas menggunakan pembetulan, prestasi meningkat dengan ketara:

Kod Asal:

SIZE = 8191: 1.499 seconds
SIZE = 8192: 2.122 seconds
SIZE = 8193: 1.582 seconds

Kod Tetap:

SIZE = 8191: 0.376 seconds
SIZE = 8192: 0.357 seconds
SIZE = 8193: 0.351 seconds

Atas ialah kandungan terperinci Mengapa Gelung Saya Lambat Semasa Memproses Elemen 8192?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn