2012-01-09 27 views

Odpowiedz

9

Kanoniczny sposób wybierania urządzenia w interfejsie API środowiska wykonawczego to: cudaSetDevice. To skonfiguruje środowisko wykonawcze do wykonywania leniwego ustanowienia kontekstu na wyznaczonym urządzeniu. Przed CUDA 4.0, to wywołanie faktycznie nie ustanowiło kontekstu, tylko poinformowało środowisko uruchomieniowe, którego GPU spróbuje użyć. Od czasu CUDA 4.0, to wywołanie ustanowi kontekst dla wyznaczonego GPU w czasie wywoływania. Istnieje również cudaChooseDevice, który wybierze spośród dostępnych urządzeń, aby znaleźć taki, który spełnia kryteria dostarczone przez dzwoniącego.

Można wyliczyć dostępne GPU w systemie z cudaGetDeviceCount i pobrać ich dane szczegółowe za pomocą cudaGetDeviceProperties. Przykład urządzenia SDK deviceQuery zawiera pełne informacje, jak to zrobić.

Być może trzeba jednak zachować ostrożność przy wybieraniu procesorów graficznych w systemie z wieloma procesorami graficznymi, w zależności od konfiguracji hosta i sterownika. Zarówno w systemie Linux, jak i w sterowniku Windows TCC istnieje możliwość zaznaczenia układów GPU "Compute Exculsive", co oznacza, że ​​sterownik ograniczy każdy procesor graficzny do jednego aktywnego kontekstu na raz lub nie będzie obliczał zabroniony, co oznacza, że ​​żaden program CUDA nie może ustalić kontekst tego urządzenia. Jeśli twój kod próbuje ustanowić kontekst na urządzeniu zabronionym na poziomie Compute lub na urządzeniu wyłącznym, które jest w użyciu, wynikiem będzie nieprawidłowy błąd urządzenia. W systemie z wieloma procesorami graficznymi, w którym polityka ma wykorzystywać wyłączność obliczeniową, prawidłowe podejście nie polega na próbie wybrania konkretnego GPU, ale po prostu na umożliwieniu leniwego ustanowienia kontekstu w sposób niejawny. Sterownik automatycznie wybierze bezpłatny procesor graficzny do uruchomienia swojego kodu. Status trybu obliczeniowego dowolnego urządzenia można sprawdzić, odczytując pole cudaDeviceProp.computeMode, korzystając z połączenia cudaGetDeviceProperties. Zauważ, że możesz sprawdzić niedozwolone lub niedozwolone GPU i zapytać o ich właściwości, ale każda operacja, która wymagałaby ustanowienia kontekstu, nie powiedzie się.

Zobacz dokumentację API środowiska wykonawczego na wszystkie te calls

+3

Innym rozwiązaniem jest użycie zmiennej środowiskowej 'CUDA_VISIBLE_DEVICES'. (https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/) – Soravux

1

Można ustawić zmienną środowiskową CUDA_VISIBLE_DEVICES do listy rozdzielonych przecinkami identyfikatorów urządzeń, aby tylko te urządzenia widoczny dla aplikacji. Użyj tego, aby zamaskować urządzenia lub zmienić kolejność widoczności urządzeń, tak aby środowisko wykonawcze CUDA wyliczało je w określonej kolejności.

Powiązane problemy