Ini mungkin ada hubungannya dengan konflik di cache L2 Anda.
Cache missses pada matice1 bukan masalah karena diakses secara berurutan. Namun untuk matice2 jika kolom lengkap cocok dengan L2 (yaitu ketika Anda mengakses matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... dll, tidak ada yang diusir) daripada tidak ada masalah dengan cache merindukan dengan matice2 baik.
Sekarang untuk lebih dalam bagaimana cache bekerja, jika alamat byte variabel Anda adalah X, daripada baris cache untuk itu adalah (X >> 6) & (L - 1). Di mana L adalah jumlah total garis cache di cache Anda. L selalu berkekuatan 2. Enam berasal dari fakta bahwa 2 ^ 6 == 64 byte adalah ukuran standar garis cache.
Sekarang apa artinya ini? Yah itu berarti bahwa jika saya memiliki alamat X dan alamat Y dan (X >> 6) - (Y >> 6) dapat dibagi oleh L (yaitu beberapa kekuatan besar 2), mereka akan disimpan dalam cacheline yang sama.
Sekarang untuk kembali ke masalah Anda apa perbedaan antara 2048 dan 2049,
ketika 2048 adalah ukuran Anda:
jika Anda mengambil & matice2 [x, k] dan & matice2 [y, k] perbedaannya (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) akan habis dibagi 2048 * 4 (ukuran dari float). Jadi kekuatan besar 2.
Jadi tergantung pada ukuran L2 Anda, Anda akan memiliki banyak konflik garis cache, dan hanya menggunakan sebagian kecil dari L2 Anda untuk menyimpan kolom, sehingga Anda tidak akan benar-benar dapat menyimpan kolom penuh dalam cache Anda, sehingga Anda akan mendapatkan kinerja yang buruk .
Ketika ukuran 2049, maka perbedaannya adalah 2049 * 4 yang bukan kekuatan 2 sehingga Anda akan memiliki lebih sedikit konflik dan kolom Anda akan masuk ke cache dengan aman.
Sekarang untuk menguji teori ini ada beberapa hal yang dapat Anda lakukan:
Alokasikan array matice2 array Anda seperti ini matice2 [razmor, 4096], dan jalankan dengan razmor = 1024, 1025 atau ukuran apa pun, dan Anda akan melihat kinerja yang sangat buruk dibandingkan dengan yang Anda miliki sebelumnya. Ini karena Anda secara paksa menyelaraskan semua kolom untuk saling bertentangan.
Kemudian coba matice2 [razmor, 4097] dan jalankan dengan ukuran berapa pun dan Anda akan melihat kinerja yang jauh lebih baik.