Dlaczego nie pokrywają się transfery danych i obliczenia za pomocą GTX 480 i CUDA 5?

Próbowałem nałożyć nakładki jądra na memcpyasync, ale to nie działa. Przestrzegam wszystkich zaleceń zawartych w przewodniku programistycznym, używając pamięci przypiętej, różnych strumieni itp. Widzę, że wykonanie jądra nakłada się, ale nie z transferami mem. Wiem, że moja karta ma tylko jeden silnik kopiowania i jeden silnik wykonawczy, ale wykonanie i transfery powinny się pokrywać, prawda?

Wygląda na to, że „mechanizm kopiowania” i „silnik wykonawczy” zawsze wymuszają kolejność wywoływania funkcji. Praca polega na wykonywaniu 4 strumieni [HtoD x2, Kernel, DtoH]. Jeśli wydam HtoDx2, jądro, serię DtoH w każdym strumieniu, w profilerze widzę, że pierwsza operacja stream2 HtoD nie rozpocznie się, dopóki nie zakończy się pierwsza operacja DtoH. Jeśli wydam najpierw HtoD w każdym strumieniu, potem drugi HtoD, następnie jądro, a następnie DtoH (szerokość), nie widzę nakładania się, a kolejność wydania jest również wymuszana przez GPU.

Próbowałem za pomocą przykładu simpleStreams podanego w pakiecie SDK CUDA, a także widzę to samo zachowanie.

Załączam niektóre zrzuty ekranu pokazujące problem w obu profilerach wizualnych i Nsight dla VS2008.

ps. Nie ustawiłem env CUDA_LAUNCH_BLOCKING

Proste strumienie Visual Profiler

Szerokość osi czasu MyApp

Najpierw głębokość osi czasu MyApp

edytować:

umieszczanie dodatkowych jąder x4 (łącznie 2HtoD, 5 jądra, 1DtoH na strumień) -> Jeśli uruchomię nvprof z i bez --concurrent-kernels-off, czas, który upłynął, jest taki sam. Jeśli ustawię env CUDA_LAUNCH_BLOCKING = 1, to widzę poprawę wydajności (z wiersza poleceń) o 7,5%!

Specyfikacja systemu:

System Windows 7NVIDIA 6800 VGA w pierwszym gnieździe PCI-EGTX480 w drugim gnieździe PCI-ESterownik NVIDIA: 306.94Studio wizualne 2008CUDA v5.0Visual Profiler 5.0Nsight 3.0

questionAnswers(3)

yourAnswerToTheQuestion