2011-07-14 22 views
13

Kod CUDA skompilowany z wyższą wydajnością obliczeniową, będzie działał doskonale przez długi czas na urządzeniu o niższych możliwościach obliczeniowych, zanim pewnego dnia w jakimś kernelu przestanie działać cicho. Spędziłem pół dnia ścigając nieuchwytny błąd tylko po to, aby zdać sobie sprawę, że Reguła Kompilacji miała sm_21, podczas gdy urządzenie (Tesla C2050) było 2.0.CUDA: Jak sprawdzić odpowiednią wydajność obliczeniową?

Czy istnieje kod API CUDA, który mogę dodać, który może sam sprawdzić, czy działa na urządzeniu z kompatybilnymi możliwościami obliczeniowymi? Muszę skompilować i pracować z urządzeniami o wielu możliwościach obliczeniowych. Czy są jakieś inne działania, które mogę podjąć, aby upewnić się, że takie błędy nie występują?

Odpowiedz

16

w API środowiska wykonawczego, cudaGetDeviceProperties powraca dwóch pól major i minor które zwracają zdolności obliczyć dowolną wyliczone urządzenie CUDA. Możesz użyć tego do przeanalizowania możliwości obliczeniowych dowolnego GPU przed ustaleniem kontekstu, aby upewnić się, że jest to odpowiednia architektura dla tego, co robi twój kod. nvcc może wygenerować plik zawierający wiele obiektów architektury z pojedynczym wywołaniu za pomocą opcji -gencode, na przykład:

nvcc -c -gencode arch=compute_20,code=sm_20 \ 
     -gencode arch=compute_13,code=sm_13 \ 
     source.cu 

przyniosłoby plik obiektowy wyjście z osadzonym fatbinary obiektu zawierającego cubin pliki do GT200 i GF100 kart. Środowisko wykonawcze API będzie automagicznie obsługiwać wykrywanie architektury i próbować ładować odpowiedni kod urządzenia z obiektu fatbinary bez dodatkowego kodu hosta.

+0

Każdy pomysł, dlaczego urządzenie binarne może wykryć urządzenie i załadować odpowiednią wersję, ale nie kończy się znaczącym błędem w przypadku pojedynczej wersji (która nie pasuje)? –

+1

W zasadzie za dużo abstrakcji. Jeśli wykonasz proces "ręcznie" przy użyciu interfejsu API sterownika, zwracany jest znaczący komunikat o błędzie, jeśli nie ma odpowiedniego kubika dla docelowego GPU. Jednak wiele czynności odbywa się niejawnie (wybór urządzenia, ustanawianie kontekstu, ładowanie modułów, pobieranie kodu i danych), a jeśli któryś z tych rozmyślnie generowanych procesów zawodzi, to środowisko wykonawcze zwraca ogólny błąd inicjalizacji. Jeśli potrzebujesz tego stopnia kontroli, jawnie zarządzaj kontekstem za pomocą interfejsu API sterownika, a następnie użyj kontekstu w interfejsie API środowiska wykonawczego. Interoperacyjność jest obsługiwana od czasu wydania CUDA 3.1 – talonmies

+1

@Ashwin: Przyjęto odpowiedź dwa i pół roku po jej opublikowaniu. To musi być jakaś płyta ..... – talonmies

0

uruchom zapytanie o urządzenie. znajdź możliwości obliczeniowe dla każdego urządzenia w systemie. Następnie wykonaj kod na żądanym urządzeniu za pomocą SetDevice();

+0

Urządzenie deviceQuery nie udostępnia tych informacji. –

Powiązane problemy