Istnieje kilka ofert dostawców GPU, takich jak CodeXL AMD lub debuger NVIDIA nSight / Linux GFX, które umożliwiają przechodzenie przez moduły cieniujące, ale są powiązane ze sprzętem danego dostawcy.
Pragnę zauważyć, że chociaż są one dostępne pod Linuksem, zawsze miałem bardzo mały sukces z ich użyciem. Nie mogę komentować sytuacji w systemie Windows.
Opcją, z której ostatnio korzystałem, jest modularyzacja mojego kodu modułu cieniującego #includes
i ograniczenie dołączonego kodu do wspólnego podzbioru GLSL i C ++ i glm .
Kiedy napotykam problem, próbuję go odtworzyć na innym urządzeniu, aby sprawdzić, czy problem jest taki sam, co wskazuje na błąd logiczny (zamiast problemu ze sterownikiem / nieokreślonego zachowania). Istnieje również szansa na przekazanie niewłaściwych danych do GPU (np. Przez niepoprawnie powiązane bufory itp.), Co zwykle wykluczam albo przez debugowanie danych wyjściowych jak w odpowiedzi CIFZ lub przez kontrolę danych za pomocą apitrace .
Gdy jest to błąd logiczny, próbuję odbudować sytuację z GPU na CPU, wywołując dołączony kod na CPU z tymi samymi danymi. Następnie mogę przejść przez procesor.
Opierając się na modułowości kodu, możesz także spróbować napisać dla niego najbardziej nieprzystosowany i porównać wyniki między uruchomieniem GPU a uruchomieniem procesora. Należy jednak pamiętać, że istnieją przypadki narożne, w których C ++ może zachowywać się inaczej niż GLSL, co daje fałszywe pozytywne wyniki w tych porównaniach.
Wreszcie, gdy nie możesz odtworzyć problemu na innym urządzeniu, możesz zacząć kopać, skąd bierze się różnica. Unittests może pomóc ci zawęzić miejsce, w którym to się dzieje, ale ostatecznie prawdopodobnie będziesz musiał napisać dodatkowe informacje debugowania z modułu cieniującego, jak w odpowiedzi CIFZ .
Aby dać ci przegląd tutaj, jest schemat blokowy mojego procesu debugowania:
Podsumowując, oto lista losowych zalet i wad:
zawodowiec
- przejdź do zwykłego debuggera
- dodatkowa (często lepsza) diagnostyka kompilatora
kon