Przeanalizowałem przewodnik programowania i przewodnik po najlepszych praktykach i wspomniałem, że dostęp do pamięci globalnej zajmuje 400-600 cykli. Nie widziałem zbyt wiele innych typów pamięci, takich jak pamięć podręczna tekstur, stała pamięć podręczna, pamięć współdzielona. Rejestry mają 0 opóźnienia pamięci.Ile cykli opóźnień pamięci dla typu dostępu do pamięci w OpenCL/CUDA?
Myślę, że stała pamięć podręczna jest taka sama jak rejestrów, jeśli wszystkie wątki używają tego samego adresu w stałej pamięci podręcznej. W najgorszym przypadku nie jestem tego taki pewien.
Pamięć współdzielona jest taka sama jak rejestry, o ile nie ma konfliktów bankowych? Jeśli tak, to jak rozwija się opóźnienie?
Co z pamięcią podręczną tekstur?
Czy nadal warto używać stałej pamięci podręcznej, jeśli na przykład wszystkie wątki mają dostęp do 1000 elementów pływających? Czy to by było jak 1000 odczytów z rejestru? Przewodnik powiedział, że użycie stałej pamięci podręcznej w ten sposób skaluje się liniowo w prawo? – smuggledPancakes
Jeśli wszystkie wątki mają dostęp do * tej samej wartości w danej iteracji pętli, można użyć stałej pamięci podręcznej. Stała pamięć podręczna zapewni pewne korzyści ze względu na położenie przestrzenne (na pamięci podręcznej Fermi L1 można osiągnąć to samo, ale pozostawia to L1 wolne dla innych danych). Powiedziawszy to, celuję głównie w Fermiego i nigdy nie używam '__constant__', używam tylko const dużo i pozwalam kompilatorowi to rozgryźć! Na przykład w twoim przypadku przekazywałbym arg jądra jako 'const float * const myfloatarray'. Polecam zawsze uruchamianie Visual Profiler, aby sprawdzić serializację, na wypadek gdyby coś przegapiłeś. – Tom
Można dodać, że linie pamięci podręcznej mają 128 bajtów (32 bajty) dla L1 (L2), więc mówimy o adresach należących do tych samych linii (niekoniecznie te same adresy). Niektóre liczby innych opóźnień można znaleźć [tutaj] (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –