Вероятно, это связано с конфликтами в кеше 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 (размер поплавка). Так что большая сила 2.
Таким образом, в зависимости от размера вашего L2 у вас будет много конфликтов строк кэша, и вы будете использовать только небольшую часть вашего L2 для хранения столбца, таким образом, вы фактически не сможете хранить полный столбец в своем кэше, таким образом, вы будете получить плохую производительность.
Если размер равен 2049, то разница составляет 2049 * 4, что не является степенью 2, поэтому у вас будет меньше конфликтов, и ваш столбец будет безопасно помещаться в вашем кэше.
Теперь, чтобы проверить эту теорию, есть пара вещей, которые вы можете сделать:
Выделите ваш массив matice2, как этот matice2 [razmor, 4096], и запустите с razmor = 1024, 1025 или любым другим размером, и вы должны увидеть очень плохую производительность по сравнению с тем, что было раньше. Это потому, что вы принудительно выравниваете все столбцы, чтобы конфликтовать друг с другом.
Затем попробуйте matice2 [razmor, 4097] и запустите его с любым размером, и вы увидите гораздо лучшую производительность.