2013-02-15 10 views
10

Wiem, że procesor graficzny NVIDIA o możliwościach obliczania 2.x lub nowszych może jednocześnie wykonywać jądra u pto 16. Jednak moja aplikacja spawnuje 7 "procesów", a każdy z tych 7 procesów uruchamia jądra CUDA.Wiele procesów uruchamiających jądra CUDA równolegle

Moje pierwsze pytanie jest takie, jakie byłoby oczekiwane zachowanie tych ziaren. Będą one wykonywane równocześnie lub, ponieważ są uruchamiane przez różne procesy, będą wykonywane sekwencyjnie.

Jestem zdezorientowany, ponieważ podręcznik programowania CUDA C mówi: „Jądro z jednego kontekstu CUDA nie może wykonywać równolegle z jądrem z innym kontekście CUDA”

To prowadzi mnie do drugiego pytania, jakie są "konteksty" CUDA?

Dzięki!

Odpowiedz

14

Kontekst CUDA to wirtualna przestrzeń wykonawcza przechowująca kod i dane będące własnością wątku lub procesu hosta. Tylko jeden kontekst może być aktywny na GPU z całym sprzętem.

Tak więc, aby odpowiedzieć na twoje pierwsze pytanie, jeśli masz siedem osobnych wątków lub procesów, wszystkie próbujące ustanowić kontekst i jednocześnie uruchomić na tym samym GPU, zostaną one przekształcone do postaci szeregowej i każdy proces oczekujący na dostęp do GPU zostanie zablokowany do właściciel działającego kontekstu. Zgodnie z moją najlepszą wiedzą nie ma czasu na cięcie, a heurystyka harmonogramu nie jest udokumentowana i (jak podejrzewam) nie jest jednorodna z systemu operacyjnego do systemu operacyjnego.

Byłoby lepiej uruchomić pojedynczy wątek roboczy z kontekstem GPU i używać wiadomości z innych wątków, aby popchnąć pracę na GPU. Alternatywnie istnieje funkcja migracji kontekstowej dostępna w interfejsie API sterownika CUDA, ale będzie działać tylko z wątkami z tego samego procesu, a mechanizm migracji ma opóźnienie i obciążenie procesora hosta.

0

Czy naprawdę potrzebujesz osobnych wątków i kontekstów? Uważam, że najlepszą praktyką jest użycie jednego kontekstu na układ GPU, ponieważ wiele kontekstów na pojedynczym GPU zapewnia wystarczający narzut.

Aby wykonać wiele konkrencji jądra, powinieneś utworzyć kilka strumieni CUDA w jednym kontekście CUDA i umieścić w kolejce każde jądro do własnego strumienia - aby były wykonywane jednocześnie, jeśli jest na to wystarczająca ilość zasobów.

Jeśli chcesz, aby kontekst był dostępny z kilku wątków CPU - możesz użyć cuCtxPopCurrent(), cuCtxPushCurrent(), aby je przekazać, ale tylko jeden wątek będzie mógł pracować z kontekstem w dowolnym momencie.

+0

Czy możesz potwierdzić, że wiele kontekstów może być aktywnych jednocześnie na jednym GPU? – Tariq

+0

@Tariq, nie oznajmiłem tego) Mogę potwierdzić, że możesz uruchomić dwa programy z dwoma kontekstami na jednym gpu w tym samym czasie, ale nie jestem świadomy, czy oba będą aktywne, czy też sterownik w jakiś sposób zmieni przepływ pracy. – ShPavel

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz

Powiązane problemy