Компиляция OpenCL на Mingw Nvidia SDK
Можно ли скомпилировать OpenCL с помощью Mingw и Nvidia SDK?
Я знаю, что его официально не поддерживали, но это просто не имеет смысла. Разве библиотеки не предоставляются в виде статически связанных библиотек? Я имею в виду, когда-то скомпилированный с любым компилятором, который может быть и успешно связан, что должно быть проблемой?
Мне удалось скомпилировать и успешно связать мой код с библиотеками OpenCL, поставляемыми с Nvidia SDK, однако исполняемый файл выдает ошибку сегментации в clGetPlatformIDs
, который является первым вызовом OpenCL в моем коде.
Вот моя команда компиляции
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
Обратите внимание, что эти библиотеки были взяты из .sln файла образца кода OpenCL.
Я пробовал различные комбинации этих библиотек, и ничего не работает.
Также есть способ скомпилировать, используя Mingw и ссылку, используя что-то еще? Я не уверен, что еще может быть.
Ответы
Ответ 1
Мы смогли это сделать, используя утилиты MinGW reimp и dlltool для создания библиотеки импорта "libOpenCL.a" для DLL "OpenCL.dll". Вот шаги, которые мы выполнили:
-
Шаг 1: Убедитесь, что у вас установлены mingw-utils (для reimp и dlltool). Если вы этого не сделаете, в приглашении MinGW введите:
mingw-get install mingw-utils
-
Шаг 2: Затем введите следующую команду:
reimp OpenCL.lib
Это должно дать файл OpenCL.def и libOpenCL.a. Если результатом является что-то вроде строки "неверная или поврежденная библиотека импорта", альтернативный шаг 2 должен работать.
-
альтернативный шаг 2: используйте dlltool вместе с файлом .def, который вы можете найти здесь: http://pastebin.com/f2ac38b2f. Команда будет:
dlltool -l libOpenCL.a -d OpenCL.def -A -k
Теперь вы можете ссылаться на недавно созданный libOpenCL.a. Если вы все еще видите отсутствующие символы, добавьте их в файл .def и повторите команду dlltool.
Мы смогли получить все это благодаря информации, найденной в следующих сообщениях, для справки:
Ответ 2
Библиотеки OpenCL - это просто заглушки в OpenCL.dll. Поэтому я рекомендую использовать метод динамической загрузки. Он просто решит все ваши проблемы. Или вам действительно нужны некоторые из настроек nVIDIA OpenCL?
Это не только безопаснее во время выполнения, но и проще скомпилировать, поскольку вам не нужен ни один компоновщик, ни определение, ни что-либо. Просто файлы cpp/hpp добавлены в ваш проект.
Очень хороший способ использовать CLEW. Однако я полностью не согласен с этой библиотекой, потому что обертки С++ нарушены. Так что, возможно, вам понадобится какая-то настройка. Также я обычно отключаю код "atexit", так как это может быть проблематично.