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ą?
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)? –
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
@Ashwin: Przyjęto odpowiedź dwa i pół roku po jej opublikowaniu. To musi być jakaś płyta ..... – talonmies