2012-04-25 19 views
13

w mojej aplikacji, w pewnym momencie muszę wykonywać obliczenia na dużych ciągły blok danych do pamięci (100s MBS). Zastanowiłem się nad tym, aby nadal pobierać część bloku, z której mój program będzie korzystał w przyszłości, więc gdy wykonuję obliczenia na tej części, dane są już w pamięci podręcznej.prefetching buforować dane dla x86-64

Czy ktoś może dać mi prosty przykład, jak to osiągnąć za pomocą gcc? Czytam gdzieś _mm_prefetch, ale nie wiem, jak właściwie go używać. Zauważ też, że mam system wielordzeniowy, ale każdy rdzeń będzie pracował równolegle nad innym regionem pamięci.

+6

Jeśli dostęp do pamięci jest sekwencyjny, sprzętowy program do sprawdzania dostępności już to zrobi. Prawdopodobnie nie uzyskasz znacznej poprawy dzięki ręcznemu wstępnemu pobieraniu. – Mysticial

+6

Zobacz to pytanie dla przykładu, gdzie prefetching faktycznie pomaga: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

Masz na myśli sprzęt Prefetcher jakoś rozpoznaje ja wykorzystując sąsiadujące obszary pamięci i przynieść te części w pamięci podręcznej ? – pythonic

Odpowiedz

16

gcc używa funkcji wbudowanych jako interfejs dla lowlevel instrukcji. W szczególności dla Twojego przypadku __builtin_prefetch. Jednak w przypadku, gdy wzór dostępu nie jest łatwy do przewidzenia automatycznie, można zauważyć tylko mierzalną różnicę.

13

Nowoczesne procesory mają całkiem dobrą automatycznego prefetch i może również okazać, że zrobić więcej szkody niż pożytku, jeśli starają się inicjować oprogramowania prefetching. Najprawdopodobniej istnieje znacznie więcej "niskich owoców wiszących", na których możesz się skupić, jeśli zauważysz, że masz problem z wydajnością. Prefetch jest jedną z ostatnich rzeczy, które możesz wypróbować, gdy rozpaczliwie potrzebujesz dodatkowej przepustowości.

+4

+1 Próbowałem wstępnego pobrania co najmniej 10 różnych okazji. Tylko raz udało mi się uzyskać zauważalne przyspieszenie. (ten, który podłączyłem w komentarzach.) – Mysticial

+4

Uzgodniono - nawet na starszych procesorach z mniej zaawansowanym automatycznym wstępnym pobieraniem zawsze było ciężko uzyskać jakiekolwiek korzyści z wstępnego pobierania oprogramowania - główne problemy polegają na tym, że zazwyczaj trzeba zainicjować wstępne kilkaset cykli zegarowych z wyprzedzeniem i oczywiście musisz mieć trochę wolnej przepustowości pamięci, którą możesz wykorzystać, co często nie ma miejsca w przypadku kodu o wysokiej wydajności. –

+1

Pobieranie wstępne nie jest konieczne - dopóki nie jest to konieczne. W mojej obecnej aplikacji - wzorce dostępu do pamięci nie zostały wykryte przez pre-moduł pobierania sprzętu. I niestety - zmiana tych wzorców dostępu, aby były bardziej przyjazne przed fetcherami, nie wchodziła w grę. Stąd - _mm_prefetch. Przepustowość spadła o ~ 10%, ale osiągnęliśmy oczekiwane opóźnienia. To był bardzo świadomy kompromis, który został zrobiony po wielu profilach przez perf i vtune. – quixver

Powiązane problemy