2016-10-17 26 views
5

W szczególności, moim problemem jest to, że mam kod CUDA, który potrzebuje <curand_kernel.h> do uruchomienia. Ta opcja nie jest domyślnie włączona w NVRTC. Przypuszczalnie wtedy, tworząc kontekst programu (to jest wywołanie nvrtcCreateProgram), muszę wysłać nazwę pliku (curand_kernel.h), a także kod źródłowy curand_kernel.h? Czuję, że nie powinienem tego robić.W jaki sposób dołączyć standardowe biblioteki CUDA do połączenia z kodem NVRTC?

Trudno powiedzieć; Nie udało mi się znaleźć przykładu z NVIDIA kogoś, kto potrzebuje standardowych plików CUDA, jak ten, jako źródła, więc naprawdę nie rozumiem, czym jest ta składnia. Niektóre problemy: curand_kernel.h zawiera również ... Czy muszę zrobić to samo dla każdego z nich? Nie jestem nawet pewien, czy kompilator NVRTC będzie działał poprawnie pod numerem curand_kernel.h, ponieważ istnieją pewne funkcje językowe, których nie obsługuje, prawda?

Następnie: jeśli wysłałeś kod źródłowy pliku nagłówkowego do nvrtcCreateProgram, czy nadal muszę to zrobić z #include w kodzie do wykonania/czy spowoduje to błąd, jeśli to zrobię?

Link do przykładowego kodu, który to robi lub coś podobnego, byłby doceniony znacznie bardziej niż prosta odpowiedź; Naprawdę nie udało mi się znaleźć żadnego.

Odpowiedz

6

Musisz wysłać "plik" i źródło każdego nagłówka osobno.

Kiedy preprocesor robi swoje, będzie używał dowolnych nazw plików #include jako klucza do znalezienia źródła nagłówka, w oparciu o dostarczoną kolekcję.

Podejrzewam, że w tym przypadku kompilator (sterownik) nie ma dostępu do systemu plików, więc należy podać jego źródło w taki sam sposób, jak w przypadku modułu cieniującego w OpenGL.

Więc:

  • zawierać nazwę nagłówka, gdy dzwoni nvrtcCreateProgram. Kompilator wewnętrznie wygeneruje odpowiednik std::map<string,string> zawierający źródło każdego nagłówka indeksowanego podaną nazwą.

  • W swoim źródle kernela, jak zwykle używaj #include "foo.cuh".

  • Kompilator użyje foo.cuh jako indeks lub klucz do swojego wewnętrznego mapie (utworzonego podczas nazywa nvrtcCreateProgram) i będzie pobierać źródła nagłówka z tej kolekcji

  • wpływy kompilacji jak normalne.

Jednym z powodów, że nvrtc przewiduje jedynie „podzbiór” cech jest to, że kompilator odgrywa w nieco piaskownicy środowisku, bez konieczności wszystkich narzędzi wspomagających i narzędzia leżące wokół, że masz z off kompilacji . Tak więc musisz ręcznie obsługiwać wiele rzeczy, które zapewnia standardowa kombinacja nvcc + (gcc | MSVC| clang).

Możliwym, ale nieidealnym rozwiązaniem byłoby wstępne przetworzenie pliku potrzebnego w IDE, zapisanie wyniku, a następnie #include. Założę się jednak, że jest lepszy sposób na zrobienie tego. jeśli chcesz po prostu curand, rozważ nurkowanie w bibliotece i wyodrębnienie potrzebnej części (blech) lub skorzystanie z innej przyjaznej dla GPU implementacji rand.W starszych wersjach CUDA właśnie wygenerowałem dużą liczbę losowych elementów pływających na hoście, przesłałem go do procesora graficznego i próbowałem go w jądrze.

This related link may be helpful.

+0

Hmmm. Więc muszę się trochę zastanowić, jak to osiągnąć. Wstępne skompilowanie kodu, który używa curandu do PTX, nie jest możliwe ... Wstępne generowanie spławów na CPU nie jest możliwe, ponieważ musiałoby być o wiele za dużo ... Tak więc jestem pozostawiony z działaniem przez bibliotekę curand uzyskać części, które muszę skompilować przy użyciu NVRTC, i znaleźć inną implementację rand. Jak wszystko, czego naprawdę potrzebuję od curanda, to standardowe jednolite PRNG od 0 do 1, myślę, że rozwiązaniem jest znalezienie kolejnego PRNG, który jest łatwiejszy do kompilacji za pomocą NVRTC, dziękuję! –

+0

Hmm. Implementacje GPU PRNG są trudne do zdobycia. Może będę musiał jakoś przystosować CURAND ... –

+0

@BillySmith Najbardziej bezpośrednim rozwiązaniem jest zbudowanie dużego bufora i wypełnienie go rand() lub podobną stroną CPU, a następnie przesłanie go do hosta. Zachowaj zmienną indeksową wskazującą, która wartość jest "następna" w buforze. Po naciśnięciu końca bufora spłucz i powtórz. –

Powiązane problemy