Wyrównanie linii pamięci podręcznej i znajomość rozmiaru linii pamięci podręcznej
Aby zapobiec fałszywemu udostępnianiu, chcę wyrównać każdy element tablicy z wierszem pamięci podręcznej. Więc najpierw muszę znać rozmiar linii pamięci podręcznej, więc przypisuję każdemu elementowi tę liczbę bajtów. Po drugie, chcę, aby początek tablicy był wyrównany do linii pamięci podręcznej.
Używam platformy Linux i 8-rdzeniowego procesora x86. Po pierwsze, jak znaleźć rozmiar linii pamięci podręcznej. Po drugie, jak ustawić linię pamięci podręcznej w C. Używam kompilatora gcc.
W ten sposób struktura byłaby następująca, na przykład przy założeniu rozmiaru linii pamięci podręcznej równego 64.
element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191
i tak dalej, zakładając oczywiście, że 0-63 jest wyrównane do linii pamięci podręcznej.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
7 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Przekaż wartość jako definicję makra do kompilatora.
W czasie wykonywania może być użyty do uzyskania rozmiaru pamięci podręcznej L1.
Anonimowy użytkownik
Potwierdzenie od:
To w C lub C ++ wymaga użycia funkcji standardowej lub jednego ze specjalnych specyfikatorów kompilatora, takich jak lub . Aby podzielić elementy struktury na różne linie pamięci podręcznej, element musi zostać wstawiony na tyle duży, aby wyrównać z następnymi 64-bajtowymi granicami
Anonimowy użytkownik
Potwierdzenie od:
cat/proc/cpuinfo | cache_alignment grep
Anonimowy użytkownik
Potwierdzenie od:
http://softpixel.com/~cwright/ ... d.php
http://softpixel.com/~cwright/ ... d.php
(Przewiń trochę w dół, strona jest o SIMD, ale ma sekcję pobierającą cacheline.)
Jeśli chodzi o wyrównywanie struktur danych, nie ma również całkowicie przenośnego sposobu, aby to zrobić. GCC i VS10 mają różne sposoby ustawiania wyrównania struktury.
Jednym ze sposobów „zhakowania” jest wypełnienie struktury nieużywanymi zmiennymi, dopóki nie będzie pasować do żądanego wyrównania.
Aby wyrównać mallocs (), wszystkie główne kompilatory również mają dostosowane funkcje malloc do tego celu.
Anonimowy użytkownik
Potwierdzenie od:
http://linux.die.net/man/3/posix_memalign
lub
valloc
można użyć do wyrównania przydzielonej pamięci z linią pamięci podręcznej.
Anonimowy użytkownik
Potwierdzenie od:
T <!-- code object--> zostało wywołane przez wywołanie funkcji[code].Ref ()
dla obiektu . Możesz również użyć , jeśli znasz rozmiar linii pamięci podręcznej z wyprzedzeniem lub po prostu chcesz trzymać się bardzo powszechnych 64 (bajtów). [/code] https://github.com/NickStrupat/Alignedhttps://github.com/NickStrupat/Aligned
Anonimowy użytkownik
Potwierdzenie od:
http://cache-line-sizes.surge.sh/
co zrobiłem, na którym jest większość procesorów Arm/Intel. Możesz go użyć jako odniesienia podczas definiowania stałych, więc nie musisz generalizować rozmiaru linii pamięci podręcznej we wszystkich architekturach.
Miejmy nadzieję, że niedługo zobaczymy w przypadku C ++
rozmiar interfejsu sprzętowego
https://en.cppreference.com/w/ ... _size
co powinno być dokładnym sposobem uzyskania tych informacji (zakładając, że powiesz kompilatorowi swoją docelową architekturę).