2011-07-05 12 views
10

Mam pytanie dotyczące predykcji gałęzi w procesorach GPU. O ile mi wiadomo, w procesorach graficznych wykonują predykcje z oddziałami.Generacja gałęzi na GPU

Przykładowo mam kodu:

if (C) 
A 
else 
B 

więc jeśli trwa 40 cykli i B trwa 50 cykli na zakończenie wykonania, jeśli założy się, na osnowie, zarówno A jak i B są wykonywane tak nie Całkowite ukończenie tej gałęzi zajmuje łącznie 90 cykli? Czy też nakładają się na A i B, tj. Gdy wykonywane są niektóre instrukcje A, to czekają na żądanie pamięci, następnie wykonywane są niektóre instrukcje B, następnie czekają na pamięć i tak dalej? Dzięki

+10

Dla tych, którzy mają ochotę dalej edytować to pytanie, proszę zauważyć, że predykcja gałęzi i przewidywanie rozgałęzień to ** nie ** to samo ...... – talonmies

+0

Znalazłem dobry opis tutaj: http: // www.yosefk.com/blog/simd-simt-smt-parallelism-in-nvidia-gpus.html –

Odpowiedz

11

Wszystkie dotychczas wydane architektury CUDA działają jak maszyna SIMD. Kiedy występuje rozbieżność gałęzi w osnowie, obie ścieżki kodu są wykonywane przez wszystkie wątki w osnowie, z wątkami, które nie podążają za aktywną ścieżką, wykonując funkcjonalny odpowiednik NOP (myślę, że pamiętam, że istnieje warunkowe wykonanie flaga dołączona do każdego wątku w osnowie, która pozwala na zamaskowanie niewykonanych wątków).

W powyższym przykładzie odpowiedź na 90 cykli jest prawdopodobnie lepszym przybliżeniem tego, co naprawdę się dzieje, niż alternatywa.

+0

Jak pamiętam, istnieje instrukcja rozgałęzień w CUDA asm, ale gałąź będzie brana przez wszystkie nitki osnowy. – osgx

+2

Jako ptx_isa.pdf: "Jeśli wątki osnowy odchylają się przez zależną od danych gałąź warunkową, osnowa kolejno wykonuje każdą ścieżkę odgałęzienia, wyłączając wątki, które nie znajdują się na tej ścieżce, a gdy wszystkie ścieżki zakończą się, wątki zbiegają się z powrotem do ta sama ścieżka wykonywania. ". Tak więc w PTX występuje gałąź warunkowa, ale wszystkie wątki Warp muszą brać lub nie brać tej gałęzi w tym samym czasie, aby być jednolite (aby uzyskać wydajność). – osgx

+0

Dzięki talonmies i osgx. Tak więc w powyższym przypadku wykonanie kodu będzie wynosić 90 cykli. Zastanawiam się jednak, dlaczego nie wdrożą alternatywnego? Mam na myśli nakładanie się A i B, więc przepustowość musi być większa. W takim przypadku nadal działają w trybie SIMD, ale tylko to, że opóźnienie można lepiej ukryć (wykonując drugą ścieżkę oddziału)? – Zk1001