Prawdopodobnie ma to związek z konfliktami w pamięci podręcznej L2.
Chybienia w pamięci podręcznej matice1 nie stanowią problemu, ponieważ dostęp do nich odbywa się sekwencyjnie. Jednak dla matice2, jeśli pełna kolumna mieści się w L2 (tj. Kiedy uzyskujesz dostęp do matice2 [0, 0], matice2 [1, 0], matice2 [2, 0] ... itd., Nic nie zostanie eksmitowane), to nie ma problemu z Cache misses z matice2.
Teraz, aby zagłębić się w działanie pamięci podręcznych, jeśli adres bajtowy zmiennej to X, niż wiersz pamięci podręcznej dla niej będzie (X >> 6) & (L - 1). Gdzie L to całkowita liczba linii pamięci podręcznej w pamięci podręcznej. L jest zawsze potęgą 2. Szóstka pochodzi z faktu, że 2 ^ 6 == 64 bajty to standardowy rozmiar linii pamięci podręcznej.
Co to teraz oznacza? To znaczy, że jeśli mam adres X i adres Y, a (X >> 6) - (Y >> 6) jest podzielne przez L (czyli jakąś dużą potęgę 2), zostaną one zapisane w tej samej linii pamięci.
Wróćmy teraz do problemu, jaka jest różnica między rokiem 2048 a 2049,
kiedy twój rozmiar to 2048:
jeśli weźmiesz & matice2 [x, k] i & matice2 [y, k] różnica (& matice2 [x, k] >> 6) - (& matice2 [y, k] >> 6) będzie podzielna przez 2048 * 4 (rozmiar pływaka). Więc duża moc 2.
Zatem w zależności od rozmiaru twojego L2 będziesz miał wiele konfliktów linii pamięci podręcznej i wykorzystasz tylko niewielką część twojego L2 do przechowywania kolumny, więc nie będziesz w stanie przechowywać pełnej kolumny w pamięci podręcznej, więc uzyskasz złą wydajność .
Gdy rozmiar wynosi 2049, różnica wynosi 2049 * 4, co nie jest potęgą 2, dzięki czemu będziesz mieć mniej konfliktów, a twoja kolumna bezpiecznie zmieści się w twojej pamięci podręcznej.
Aby przetestować tę teorię, możesz zrobić kilka rzeczy:
Przydziel swoją tablicę macierz matice2 tak jak ta matice2 [razmor, 4096] i uruchom z razmor = 1024, 1025 lub dowolnym rozmiarem, a powinieneś zobaczyć bardzo słabą wydajność w porównaniu z tym, co miałeś wcześniej. Dzieje się tak, ponieważ wymuszasz wyrównanie wszystkich kolumn tak, aby były ze sobą w konflikcie.
Następnie spróbuj matice2 [razmor, 4097] i uruchom go z dowolnym rozmiarem, a powinieneś zobaczyć znacznie lepszą wydajność.