Вероятно, это связано с конфликтами в вашем кэше L2.
Промахи кеша на matice1 не являются проблемой, потому что к ним обращаются последовательно. Однако для matice2, если полный столбец помещается в L2 (т.е. когда вы обращаетесь к matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... и т. Д., Ничего не выселяется), то проблем с Кеш промахов с matice2 тоже.
Теперь, чтобы глубже понять, как работает кеш, если байтовый адрес вашей переменной - X, то строка кеша для него будет (X >> 6) & (L - 1). Где L - общее количество строк кеша в вашем кеше. L всегда степень 2. Шесть исходит из того факта, что 2 ^ 6 == 64 байта - это стандартный размер строки кэша.
Что это значит? Что ж, это означает, что если у меня есть адрес X и адрес Y и (X >> 6) - (Y >> 6) делится на L (т.е. некоторая большая степень 2), они будут храниться в той же строке кеша.
Теперь, чтобы вернуться к вашей проблеме, в чем разница между 2048 и 2049 годами,
когда 2048 ваш размер:
если взять & matice2 [x, k] и & matice2 [y, k], разница (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) будет делиться на 2048 * 4 (размер поплавка). Итак, большая степень двойки.
Таким образом, в зависимости от размера вашего L2 у вас будет много конфликтов строк кеша, и вы будете использовать только небольшую часть вашего L2 для хранения столбца, поэтому вы фактически не сможете хранить полный столбец в своем кеше, поэтому вы получите плохую производительность. ,
Когда размер равен 2049, тогда разница составляет 2049 * 4, что не является степенью 2, поэтому у вас будет меньше конфликтов, и ваш столбец безопасно поместится в ваш кеш.
Теперь, чтобы проверить эту теорию, вы можете сделать несколько вещей:
Выделите свой массив matice2 array, как этот matice2 [razmor, 4096], и запустите с razmor = 1024, 1025 или любым размером, и вы увидите очень низкую производительность по сравнению с тем, что было у вас раньше. Это потому, что вы принудительно выравниваете все столбцы, чтобы они конфликтовали друг с другом.
Затем попробуйте matice2 [razmor, 4097] и запустите его с любым размером, и вы увидите гораздо лучшую производительность.