Компиляция 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", так как это может быть проблематично.