To jest pytanie niskiego poziomu. W asemblerze x86 są dwie instrukcje SSE:
MOVDQA xmmi, m128
i
MOVNTDQA xmmi, m128
Podręcznik programisty IA-32 mówi, że NT w MOVNTDQA oznacza Non-Temporal , a poza tym to to samo, co MOVDQA.
Moje pytanie brzmi: co to znaczy Non-Temporal ?
MOVNTDQA xmmi, m128
jest ładowaniem NT, podczas gdy wszystkie inne instrukcje NT są przechowywane, z wyjątkiemprefetchnta
. Przyjęta tutaj odpowiedź wydaje się mówić tylko o sklepach. Oto, co udało mi się znaleźć w przypadku obciążeń NT . TL: DR: miejmy nadzieję, że procesor zrobi coś pożytecznego ze wskazówką NT, aby zminimalizować zanieczyszczenie pamięci podręcznej, ale nie zastępują one silnie uporządkowanej semantyki "normalnej" pamięci WB, więc muszą używać pamięci podręcznej.Odpowiedzi:
Non-Temporal SSE instrukcje (MOVNTI, MOVNTQ itp.), Nie są zgodne z normalnymi regułami spójności pamięci podręcznej. Dlatego po magazynach nieczasowych musi następować instrukcja SFENCE, aby ich wyniki były widoczne dla innych procesorów w odpowiednim czasie.
Gdy dane są generowane, a nie (natychmiast) ponownie wykorzystywane, fakt, że operacje składowania pamięci najpierw odczytują pełny wiersz pamięci podręcznej, a następnie modyfikują dane w pamięci podręcznej, negatywnie wpływa na wydajność. Ta operacja wypycha dane z pamięci podręcznych, które mogą być ponownie potrzebne, na rzecz danych, które nie będą wkrótce używane. Jest to szczególnie prawdziwe w przypadku dużych struktur danych, takich jak macierze, które są wypełniane, a następnie używane później. Zanim ostatni element matrycy zostanie wypełniony, sam rozmiar eliminuje pierwsze elementy, sprawiając, że buforowanie zapisów jest nieskuteczne.
W tej i podobnych sytuacjach procesory zapewniają obsługę nieczasowych operacji zapisu. W tym kontekście nieczasowe oznacza, że dane nie będą wkrótce ponownie wykorzystane, więc nie ma powodu, aby je buforować. Te nieczasowe operacje zapisu nie odczytują wiersza pamięci podręcznej, a następnie modyfikują go; zamiast tego nowa treść jest bezpośrednio zapisywana w pamięci.
Źródło: http://lwn.net/Articles/255364/
źródło
SFENCE
może to nie być potrzebne. Przynajmniej w tym samym wątku. Mógłbyś też spojrzeć?sfence
jest to wymagane dla sklepów NT, podczas gdy nigdy nie jest to wymagane tylko dla zwykłych sklepów. Magazyny NT nie są uporządkowane względem innych sklepów (NT lub nie), jak widzą inne wątki , bez rozszerzeniasfence
. Jednak w przypadku odczytów z tego samego wątku, co w przypadku sklepów, nigdy nie jest to potrzebnesfence
: dany wątek zawsze będzie widział własne magazyny w kolejności programu, niezależnie od tego, czy są to magazyny NT, czy nie.Espo jest strzałem w dziesiątkę. Chciałem tylko dodać moje dwa centy:
Wyrażenie „nieczasowe” oznacza brak czasowej lokalizacji. Pamięci podręczne wykorzystują dwa rodzaje lokalności - przestrzenną i czasową, a używając instrukcji nieczasowych, sygnalizujesz procesorowi, że nie spodziewasz się, że element danych zostanie użyty w najbliższej przyszłości.
Jestem trochę sceptyczny co do ręcznie kodowanego zestawu, który używa instrukcji kontroli pamięci podręcznej. Z mojego doświadczenia wynika, że te rzeczy prowadzą do większej liczby złych błędów niż jakikolwiek efektywny wzrost wydajności.
źródło
Zgodnie z podręcznikiem dewelopera oprogramowania architektury Intel® 64 i IA-32, tom 1: Architektura podstawowa, rozdział „Programming with Intel Streaming SIMD Extensions (Intel SSE)”:
Buforowanie danych czasowych i nieczasowych
Opis nieczasowego obciążenia i instrukcji przechowywania. Źródło: Podręcznik dewelopera oprogramowania architektury Intel 64 i IA-32, tom 2: Odniesienie do zestawu instrukcji
LOAD (MOVNTDQA - Załaduj podwójną wskazówkę bez wyrównania czasowego czwórki)
Zauważ, że, jak komentuje Peter Cordes, nie jest to użyteczne w normalnej pamięci WB (z zapisem zwrotnym) na obecnych procesorach, ponieważ podpowiedź NT jest ignorowana (prawdopodobnie dlatego, że nie ma modułów wstępnych HW rozpoznających NT) i obowiązuje pełna silnie uporządkowana semantyka obciążenia .
prefetchnta
może być używany jako obciążenie zmniejszające zanieczyszczenie z pamięci WBSKLEP (MOVNTDQ - przechowuj spakowane liczby całkowite za pomocą podpowiedzi niezwiązanej z czasem)
Korzystając z terminologii zdefiniowanej w zasadach i wydajności zapisu w pamięci podręcznej , można je uznać za zapisujące (bez przydzielania zapisu, bez pobierania przy braku zapisu).
Wreszcie, może być interesujące przejrzenie notatek Johna McAlpina dotyczących magazynów nieczasowych .
źródło
MOVNTDQA
robi coś specjalnego tylko w regionach pamięci WC (nieczytelne łączenie zapisu), np. Wideo RAM. Nie jest to w ogóle przydatne w normalnej pamięci WB (z zapisem zwrotnym) na bieżącym sprzęcie, podpowiedź NT jest ignorowana i stosowana jest semantyka pełnego, silnie uporządkowanego obciążenia.prefetchnta
może być jednak przydatne jako obciążenie zmniejszające zanieczyszczenie pamięci WB. Czy obecne architektury x86 obsługują obciążenia nieczasowe (z „normalnej” pamięci)? .