2013-03-03 13 views
12

Czy można skompilować OpenCL przy użyciu Mingw i Nvidia SDK?Kompilacja OpenCL na Mingw Nvidia SDK

Jestem świadomy, że nie jest on oficjalnie obsługiwany, ale to po prostu nie ma sensu. Czy biblioteki nie są dostarczane jako statycznie połączone biblioteki? Chodzi mi o to, że kiedyś skompilowany z jakimkolwiek kompilatorem, który może być i powiązany z powodzeniem, jaki powinien być problem?

Udało mi się skompilować i skutecznie połączyć mój kod z bibliotekami OpenCL dostarczonymi z pakietem SDK Nvidii, jednak plik wykonywalny generuje błąd segmentacji pod numerem clGetPlatformIDs, który jest pierwszym wywołaniem OpenCL w moim kodzie.

Oto moja komenda kompilacji

x86_64-w64-mingw32-g++ -std=c++11 File.cpp \ 
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \ 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \ 
-gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 \ 
-lshell32 -lole32 -loleaut32 \ 
-luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64 \ 
-DWIN32 -D_DEBUG -D_CONSOLE 

Zauważ, że biblioteki te zostały podjęte z pliku .sln kodu próbki OpenCL.

Próbowałem różnych kombinacji tych bibliotek i nic nie działa.

Istnieje również sposób kompilacji przy użyciu Mingw i łącza za pomocą czegoś innego? Nie jestem pewien, czym może być coś innego.

+0

Dlaczego nie używasz VC++ Express, aby zbudować kod hosta? Czy używasz 32-bitowych lub 64-bitowych bibliotek? Istnieje mylące połączenie CUDA \ v5.0 \ lib \ x64 i -luse32 -lcomdlg32 -ladvai32 ... -m64 czy wszystkie te biblioteki są potrzebne? Uprość linię poleceń. –

+1

64-bitowy, mój kod C++ używa funkcji C++ 11, więc VC++ nie ma wyjścia. Próbowałem usunąć i dodać biblioteki, ślepy zaułek. – omarzouk

Odpowiedz

12

Udało nam się to zrobić za pomocą narzędzi MinGW reimp i dlltool, aby utworzyć bibliotekę importu "libOpenCL.a" dla biblioteki DLL "OpenCL.dll". Oto kroki Szliśmy:

  • Krok 1: Upewnij się, że masz zainstalowane MinGW-utils (dla reimp i dlltool). Jeśli nie, w MinGW wierszu polecenia wpisz:

    MinGW-get install MinGW-utils

  • Krok 2: Następnie wpisz następujące polecenie:

    reimp OpenCL.lib

Powinno to dać plik OpenCL.def i libOpenCL.a. Jeśli wynikiem jest coś podobnego do "nieprawidłowej lub uszkodzonej biblioteki importu", alternatywny krok 2 powinien zadziałać.

  • alternatywny etap 2: Użyj dlltool wraz z .def pliku, który można znaleźć tutaj: http://pastebin.com/f2ac38b2f. Komenda staje:

    dlltool -l libOpenCL.a -d OpenCL.def -A -k

Teraz można połączyć przeciwko nowo utworzonego libOpenCL.a. Jeśli nadal widzisz brakujące symbole, dodaj je do pliku .def i powtórz komendę dlltool.

Udało nam się dostać to wszystko dzięki pracy do informacji zawartych w następujących stanowisk, dla odniesienia:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (mogę tylko wkleić 2 linki)
+0

Potwierdzono, że umożliwia to połączenie przynajmniej z GPU Computing SDK 5.5. – imallett

2

OpenCL biblioteki są tylko skrótami do pliku OpenCL.dll. Dlatego zalecam stosowanie techniki dynamicznego ładowania.Po prostu rozwiąże wszystkie twoje problemy. Czy naprawdę potrzebujesz kilku ulepszeń nVIDII OpenCL?

Jest nie tylko bezpieczniejsza w czasie wykonywania, ale także łatwiejsza do skompilowania, ponieważ nie potrzebujesz żadnego łącznika ani definicji, ani niczego. Tylko proste pliki cpp/hpp dodane do twojego proyect.

Bardzo dobrym wyborem jest CLEW. Jednak nie zgadzam się całkowicie z tą biblioteką, ponieważ opakowania C++ są zepsute. Więc może będziesz potrzebował jakiegoś ulepszenia. Ponadto zazwyczaj wyłączam kod "atexit", ponieważ może to być problematyczne.

+0

clew wydaje się martwy? – rogerdpack