2013-03-03 11 views
12

Ist es möglich, OpenCL mit Mingw und Nvidia SDK zu kompilieren?Kompilieren OpenCL auf Mingw Nvidia SDK

Ich bin mir bewusst, dass es nicht offiziell unterstützt, aber das macht einfach keinen Sinn. Werden die Bibliotheken nicht als statisch verknüpfte Bibliotheken bereitgestellt? Ich meine, einmal kompiliert mit was auch immer Compiler, und möglicherweise erfolgreich verknüpft, was sollte das Problem sein?

Ich habe es geschafft, meinen Code mit OpenCL-Bibliotheken zu kompilieren und erfolgreich zu verlinken, die mit Nvidias SDK zur Verfügung gestellt werden, jedoch löst die ausführbare Datei Segmentation Fault unter clGetPlatformIDs aus, was der erste OpenCL-Aufruf in meinem Code ist.

Hier ist meine Sammlung Befehl

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 

Beachten Sie, dass diese Bibliotheken aus der SLN-Datei der Probe OpenCL-Code entnommen wurden.

Ich versuchte verschiedene Kombinationen dieser Bibliotheken und nichts scheint zu funktionieren.

Gibt es auch eine Möglichkeit, mit Mingw zu kompilieren und mit etwas anderem zu verknüpfen? Ich bin mir nicht sicher, was das andere sein könnte.

+0

Warum verwenden Sie nicht VC++ Express, um den Host-Code zu erstellen? Verwenden Sie auch 32-Bit- oder 64-Bit-Bibliotheken? Es gibt eine verwirrende Mischung aus CUDA \ v5.0 \ lib \ x64 und -luse32 -lcomdlg32 -ladvai32 ... -m64 Sind all diese Bibliotheken notwendig? Vereinfachen Sie Ihre Befehlszeile. –

+1

64-Bit, mein C++ - Code verwendet C++ 11-Funktionen, daher ist VC++ nicht verfügbar. Ich habe versucht, libs zu entfernen und hinzuzufügen, Sackgasse. – omarzouk

Antwort

12

Wir konnten dies tun, indem Sie die MinGW-Reim und Dlltool-Dienstprogramme verwenden, um eine Importbibliothek "libOpenCL.a" für die DLL "OpenCL.dll" zu erstellen. Hier sind die Schritte, die wir folgen:

  • Schritt 1: Stellen Sie sicher, dass Sie mingw-utils installiert (für reimp und dlltool). Wenn Sie dies nicht tun, an einem MinGW Aufforderung:

    mingw-get install mingw-utils

  • Schritt 2: Als nächstes geben Sie den folgenden Befehl ein:

    reimp OpenCL.lib

Dies sollte eine Datei OpenCL.def und libOpenCL.a ergeben. Wenn das Ergebnis in etwa der "ungültigen oder beschädigten Importbibliothek" entspricht, sollte der alternative Schritt 2 funktionieren.

  • alternativer Schritt 2: Verwenden Sie dlltool zusammen mit einer DEF-Datei, die Sie hier finden: http://pastebin.com/f2ac38b2f. Der Befehl wird:

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

Sie können nun verlinkt gegen die neu geschaffene libOpenCL.a. Wenn immer noch fehlende Symbole angezeigt werden, fügen Sie sie zur .def-Datei hinzu und wiederholen Sie den Befehl dlltool.

Wir konnten diese alle Arbeiten durch die Informationen in folgenden Beiträge, Referenz gefunden erhalten:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (ich nur 2 Links einfügen)
+0

Bestätigt, dass Sie damit mindestens mit GPU Computing SDK 5.5 verknüpfen können. – imallett

2

OpenCL Bibliotheken sind nur Stubs für die OpenCL.dll. Ich empfehle daher eine dynamische Ladetechnik.Es wird einfach alle deine Probleme lösen. Oder brauchst du wirklich einige der nVIDIA Tweaks von OpenCL?

Es ist nicht nur sicherer zur Laufzeit, sondern auch leichter zu kompilieren, da Sie keinen Linker noch definiert, noch irgendetwas benötigen. Nur eine einfache cpp/hpp Dateien zu Ihrem Projekt hinzugefügt.

Eine sehr gute zu verwenden ist CLEW. Allerdings stimme ich dieser Bibliothek nicht vollständig zu, da C++ - Wrapper kaputt sind. Vielleicht brauchen Sie also etwas Feinabstimmung. Außerdem deaktiviere ich normalerweise den "atexit" -Code, da dies problematisch sein kann.

+0

Clew scheint tot? – rogerdpack