2012-08-08 8 views
8

Załóżmy, że w kodzie o znaczeniu krytycznym mamy parę macierzy, które są często używane razem, gdzie dokładny rozmiar nie ma znaczenia, wystarczy ustawić coś rozsądnego, np.Unikanie uprawnień 2 dla łatwości obsługi pamięci podręcznej

int a[256], b[256]; 

Jest to potencjalnie pessimization ponieważ niskie bity adresowe są takie same mogą utrudnić cache obsłużyć obie tablice jednocześnie? Czy byłoby lepiej określić np. 300 zamiast 256?

+4

Masz rację, podejrzewając, że uprawnienia dwóch mogą być problematyczne. Ale zwykle ma to zastosowanie tylko wtedy, gdy masz więcej niż dwa kroki. (szczególnie gdy przekroczysz liczbę pamięci podręcznej L1) [Oto przykład tego, gdzie w rzeczywistości staje się problematyczny.] (http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than -twoja-pętle) W tym przykładzie są 4 tablice - wszystkie są wyrównane do tego samego przesunięcia od początku strony 4k. – Mysticial

Odpowiedz

6

Moving mój komentarz do odpowiedzi:

Jesteś słusznie podejrzewać, że uprawnienia dwójki może być problematyczne. Ale zwykle ma to zastosowanie tylko wtedy, gdy masz więcej niż dwa kroki. Nieźle się dzieje, dopóki nie przekroczysz L1 cache associativity. Ale nawet przed tym możesz napotkać problemy z fałszywymi aliasingami.

Oto dwa przykłady, gdzie moce-of-two rzeczywiście stają się problematyczne:

W pierwszym przykładzie, są 4 tablice - z których wszystkie są wyrównane do tego samego przesunięcia od początku strony 4k.

W drugim przykładzie przeskakiwanie matrycy matrycy całkowicie niszczy wydajność, gdy rozmiar jest potęgą dwójki.


W każdym przypadku należy pamiętać, że kluczową koncepcją jest w rzeczywistości wyrównanie tablic, a nie ich rozmiar. Jeśli zauważysz, że masz spowolnienie, po prostu dodaj trochę wypełnienia między tablice, aby przerwać wyrównanie.

+0

Kolejna przydatna sztuczka: jeśli zawsze uzyskujesz dostęp do wpisów pojedynczo (i nigdy nie uzyskujesz dostępu do "plasterka" za pomocą memcpy itp.), Możesz spróbować zastosować banalną funkcję skrótu do indeksów tablic. Zwykle XOR. To znaczy. zawsze uzyskuj dostęp do [i^0x67] i b [j^0x34]. // Właśnie znalazłem miejsce, w którym to pomaga. –

Powiązane problemy