2010-11-04 16 views
5

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?

Odpowiedz

4

Opóźnienie pamięci współużytkowanych/stałych/tekstur jest małe i zależy od tego, które urządzenie posiadasz. Ogólnie rzecz biorąc, GPU są zaprojektowane jako architektura przepustowości, co oznacza, że ​​poprzez tworzenie wystarczającej ilości wątków ukryte są opóźnienia pamięci, w tym pamięci globalnej.

Powód, dla którego przewodnicy mówią o opóźnieniu pamięci globalnej, polega na tym, że opóźnienie jest o rząd wielkości większe niż w przypadku innych wspomnień, co oznacza, że ​​jest to dominujący czas oczekiwania na optymalizację.

Wspomniałeś przede wszystkim o stałej pamięci podręcznej. Masz całkowitą rację, że jeśli wszystkie wątki wewnątrz osnowy (tj. Grupa 32 wątków) uzyskują dostęp do tego samego adresu, to nie ma żadnej kary, tj. Wartość jest odczytywana z pamięci podręcznej i transmitowana do wszystkich wątków jednocześnie. Jeśli jednak wątki mają dostęp do różnych adresów, dostęp do nich musi być serializowany, ponieważ pamięć podręczna może dostarczyć tylko jedną wartość naraz. Jeśli używasz CUDA Profiler, to pojawi się pod licznikiem serializacji.

Pamięć współdzielona, ​​w przeciwieństwie do stałej pamięci podręcznej, może zapewniać znacznie wyższą przepustowość. Sprawdź rozmowę o CUDA Optimization, aby uzyskać więcej informacji i wyjaśnienie konfliktów bankowych i ich skutków.

+0

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

+0

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

+0

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). –

6

Za (Kepler) Tesla K20 latencji są następujące:

Globalny pamięci: 440 zegary
stałej pamięci
        L1: 48 zegary
        L2: 120 zegary
Pamięć współdzielona: 48 zegarów
Pamięć tekstury
        L1: 108 zegary
        L2: 240 zegary

Skąd mam wiedzieć? Przeprowadziłem mikrobogrodzenia opisane przez autorów Demystifying GPU Microarchitecture through Microbenchmarking. Zapewniają podobne wyniki dla starszego GTX 280.

Zostało to zmierzone na klastrze Linux, węzeł komputerowy, w którym przeprowadziłem testy porównawcze, nie był używany przez innych użytkowników ani nie prowadził żadnych innych procesów. Jest to linux BULLX z parą 8 rdzeniowych Xeonów i 64 GB RAM, nvcc 6.5.12. Zmieniłem kompilację sm_20 na sm_35.

Istnieje również rozdział PTX ISA operands cost, choć nie jest to zbyt pomocne, po prostu przypomina to, czego się już spodziewasz, bez podawania dokładnych danych.

+0

Również używam Tesli K20, i próbowałem uruchomić ten sam microbenchmark, o którym wspomniałeś. Czy byłeś w stanie uruchomić 'global.cu' bez żadnych problemów? Pytam, ponieważ mam do czynienia z problemem z nielegalnym dostępem do pamięci - opublikowałem to pytanie [tutaj] (http://stackoverflow.com/questions/36416843/how-to-write-a-pointer-chasing-benchmark-using- 64-bit-pointers-in-cuda). Zastanawiam się, czy wprowadziłeś jakieś zmiany w kodzie jądra, aby działał on dla ciebie? – Kajal

+0

@ kv.333 Było to jakiś czas temu. Pamiętam, że były pewne problemy i nie wszystkie testy zostały przeprowadzone. Nie pamiętam jednak które. –

Powiązane problemy