2013-04-29 14 views
6

W porządku, mam naprawdę niepokojące pytanie CUDA 5.0 o tym, jak poprawnie łączyć rzeczy. Byłbym wdzięczny za wszelką pomoc!Jak połączyć kod hosta ze statyczną biblioteką CUDA po rozłączeniu kompilacji?

Korzystając z oddzielnych funkcji kompilacji CUDA 5.0, wygenerowałem bibliotekę statyczną (* .a). To ładnie łączy się z innymi plikami * .cu po uruchomieniu przez nvcc, zrobiłem to wiele razy.

Chciałbym teraz pobrać plik * .cpp i połączyć go z kodem hosta w tej bibliotece statycznej za pomocą g ++ lub cokolwiek innego, ale nie nvcc. Jeśli będę próbować tego, otrzymuję błędy kompilatora jak

nieokreślonej odniesieniu do __cudaRegisterLinkedBinary

używam zarówno -lcuda i -lcudart i, o ile mi wiadomo, ma bibliotek w odpowiedniej kolejności (czyli -lmylib -lcuda -lcudart). Nie sądzę, że to jest problem. Może się mylę, ale czuję, że brakuje mi kroku i że muszę zrobić coś innego w mojej statycznej bibliotece (łączenie urządzeń?), Zanim będę mógł go użyć z g ++.

Czy przeoczyłem coś istotnego? Czy to możliwe?

Dodatkowe pytanie: chcę, aby wynik końcowy był biblioteką dynamiczną. Jak mogę to osiągnąć?

+1

add '-lcudadevrt' –

+1

Ja już próbowałem tego, że nie zrobił Nic nie rób. Rzeczywiste polecenie, którego używam, to: g ++ -pthread -shared -Wl, -O1-Wl, -Bymboliczne funkcje -Wl, -Bsymboliczne-funkcje -Wl, -z, relro mycpplib.o mycudalib.a -L/usr/local/cuda-5.0/lib64 -L/usr/local/cuda-5.0/lib -lmystaticlib -lcuda -lcudart -lcudadevrt -o mylinkedlib.so - Próbuję stworzyć moduł Pythona dla mojej biblioteki CUDA. – user2333829

+0

Błąd związany z niezdefiniowanym __cudaRegisterLinkedBinary faktycznie występuje, gdy próbuję zaimportować moduł Python. g ++ faktycznie kompiluje wszystko bez narzekania. – user2333829

Odpowiedz

7

Po połączeniu z nvcc wykonuje niejawny link urządzenia wraz z łączem hosta. Jeśli używasz kompilatora hosta do połączenia (jak z g ++), musisz dodać wyraźny krok, aby utworzyć łącze urządzenia z opcją -dlink, np.

nvcc –arch=sm_35 –dc a.cu b.cu 
nvcc –arch=sm_35 –dlink a.o b.o –o dlink.o 
g++ a.o b.o dlink.o x.cpp –lcudart 

Istnieje przykład tego dokładnie w Using Separate Compilation chapter of the nvcc doc.

Obecnie obsługujemy tylko biblioteki statyczne do relokowalnego kodu urządzenia. Chcielibyśmy dowiedzieć się, w jaki sposób chcesz użyć takiego kodu w dynamicznej bibliotece. Prosimy o odpowiedź w komentarzach.

Edit: „Czy istnieje jakiś sposób na wykorzystanie nvcc włączyć mylib.a w coś, co można umieścić w g ++”

Aby odpowiedzieć na pytanie w komentarzu poniżej

Wystarczy skorzystać z biblioteki jak przedmiot, na przykład:

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o 
g++ mylib.a dlink.o x.cpp –lcudart 
+0

Dziękuję, myślę, że właśnie tego szukałem. Teraz jedyną rzeczą jest to, że zamiast pojedynczych plików * .o mam linuksową bibliotekę statyczną (mylib.a). Oczywiście mogę użyć ar, aby wyodrębnić oryginalne pliki * .o, a następnie zrobić dokładnie to, co opisujesz. Czy istnieje sposób na użycie programu nvcc do przekształcenia pliku mylib.a w coś, co można umieścić w g ++? Podobnie jak twój drugi krok, ale z "mylib.a" zastępując "a.o b.o". Czy muszę ponownie użyć ar, aby pobrać pliki obiektów, a następnie dokładnie wykonać drugi i trzeci krok? – user2333829

+0

Aby odpowiedzieć na twoje pytanie, tworzę bibliotekę C++, która ma być sterowana przez hosta z Pythona. Python potrzebuje bibliotek dynamicznych. Używam biblioteki statycznej, którą już wygenerowałem jako bibliotekę C++, która może być podłączona do urządzenia. – user2333829

+0

Dodałem odpowiedź na Twoje pytanie w pierwszym komentarzu. Proszę przyjąć/głosować, jeśli to odpowie na twoje pytanie. – harrism

0

można korzystać z bibliotek gdziekolwiek używasz obiektów. Więc po prostu zrobić nvcc -arch = sm_35 -dlink mylib.a -o dlink.o g ++ mylib.a dlink.o x.cpp -lcudart

+1

Dziękuję bardzo za sugestię, Mike, doceniam to. Ale mam dziwne zachowanie, gdy próbuję dokładnie polecenia nvcc, które zaproponowałeś. Tak, polecenie nvcc działa i nie narzeka. Jednak kiedy próbuję umieścić plik nowego obiektu przez g ++, wydaje się, że wszystkie moje funkcje są niezdefiniowane. Szybka inspekcja rozmiaru pliku pokazuje, że oryginalny plik mylib.a ma numer 988K, natomiast obiekt po łączeniu urządzeń to tylko 56K. To nie może być w porządku, nie masz pojęcia, co jest grane? (Dzięki jeszcze raz!) – user2333829

Powiązane problemy