2012-08-14 11 views
7

To pytanie jest związane z użyciem strumieni CUDA uruchomić wiele jądraJak zmniejszyć CUDA przeprowadzenia synchronizacji opóźnienia/zwłoki

W CUDA istnieją komendy wielu synchronizacja cudaStreamSynchronize, CudaDeviceSynchronize, cudaThreadSynchronize, a także cudaStreamQuery aby sprawdzić, czy strumienie są puste.

Zauważyłem przy użyciu profilera, że ​​te polecenia synchronizacji wprowadzają duże opóźnienie do programu. Zastanawiałem się, czy ktokolwiek zna jakieś sposoby na zmniejszenie tego opóźnienia, oprócz oczywiście użycia jak najmniejszej liczby poleceń synchronizacji.

Czy są też jakieś dane pozwalające ocenić najbardziej skuteczną metodę synchronizacji. to jest rozważenie 3 strumieni używanych w aplikacji, a dwa z nich muszą ukończyć dla mnie wypuszczenie czterech strumieni, czy powinienem użyć 2 cudaStreamSyncs lub tylko jednego cudaDeviceSync, co spowoduje mniej strat?

+1

cudaThreadSynchronize jest przestarzałe. –

Odpowiedz

8

Główna różnica między metodami synchronizacji to "odpytywanie" i "blokowanie".

"Pobieranie" jest domyślnym mechanizmem oczekiwania sterownika na GPU - oczekuje 32-bitowej lokalizacji pamięci na osiągnięcie określonej wartości zapisanej przez GPU. Może on zwrocić czekanie szybciej po rozwiązaniu problemu, ale podczas oczekiwania spala rdzeń procesora patrząc na tę lokalizację pamięci.

"Zablokowanie" można uzyskać, dzwoniąc pod numer cudaSetDeviceFlags() pod numerem cudaDeviceScheduleBlockingSync lub pod numerem cudaEventCreate() pod numerem cudaEventBlockingSync. Zablokowanie czekania powoduje, że sterownik wprowadza polecenie do bufora poleceń DMA, który sygnalizuje przerwanie, gdy wszystkie poprzednie polecenia w buforze zostały wykonane. Sterownik może następnie odwzorować przerwanie na zdarzenie systemu Windows lub uchwyt pliku systemu Linux, umożliwiając komendom synchronizacji oczekiwanie bez ciągłego nagrywania procesora, podobnie jak domyślne metody odpytywania.

Zapytania są w zasadzie ręczną kontrolą tej 32-bitowej lokalizacji pamięci używanej do czekania; więc w większości sytuacji są bardzo tanie. Ale jeśli ECC jest włączone, zapytanie przełączy się w tryb jądra, aby sprawdzić, czy są jakieś błędy ECC; i w systemie Windows wszelkie oczekujące polecenia zostaną przepłukane do sterownika (co wymaga odgłosu jądra).

+0

Wygląda na to, że różnica między odpytywaniem a blokowaniem jest taka, że ​​odpytywanie powoduje oparzenie procesora, a blokowanie nie. Nie ma jednak różnicy czasu potrzebnego na synchronizację. W sytuacji, gdy procesor nie musi wykonywać żadnej pracy, zmniejszają się do tego samego. Czy to jest poprawne ? – shadow

+0

Mogą występować różnice w czasie, ponieważ obsługa przerwań powoduje opóźnienie. Tak więc w zamian za nie spalenie procesora podczas odpytywania, płacisz w postaci dłuższego czasu między rozwiązaniem oczekiwania i odblokowaniem wątku. – ArchaeaSoftware

+0

Ale jaka jest różnica między 'cudaDeviceScheduleBlockingSync' i' cudaDeviceScheduleYield'? 'cudaDeviceScheduleYield' as written:" Poucz CUDA, aby uzyskać jego wątek podczas oczekiwania na wyniki z urządzenia. Może to zwiększyć opóźnienie podczas oczekiwania na urządzenie, ale może zwiększyć wydajność wątków procesora wykonujących pracę równolegle z urządzeniem. " - tj. wynik oczekiwania ** bez procesora nagrywania w trybie spinu ** - tj. "Blokowanie". A także 'cudaDeviceScheduleBlockingSync' - oczekiwanie na wynik bez spawania procesora podczas wirowania. Ale jaka różnica? – Alex

Powiązane problemy