2013-03-03 4 views
12

Можно ли скомпилировать OpenCL с помощью Mingw и Nvidia SDK?Скомпилировать OpenCL на Mingw Nvidia SDK

Я знаю, что его официально не поддерживали, но это просто не имеет смысла. Разве библиотеки не предоставляются в виде статически связанных библиотек? Я имею в виду, когда-то скомпилированный с любым компилятором, который может быть и успешно связан, что должно быть проблемой?

Мне удалось скомпилировать и успешно связать мой код с библиотеками OpenCL, поставляемыми с SDK Nvidia, однако исполняемый файл выдает ошибку сегментации в 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 и ссылку, используя что-то еще? Я не знаю, что еще может быть.

+0

Почему вы не используете VC++ Express для создания кода хоста? Также вы используете 32-битные или 64-битные библиотеки? Существует путаное сочетание CUDA \ v5.0 \ lib \ x64 и -luse32 -lcomdlg32 -ladvai32 ... -m64 - все эти библиотеки нужны? Упростите свою командную строку. –

+1

64-битный, мой код на C++ использует возможности C++ 11, поэтому VC++ не идет. Я попытался удалить и добавить libs, тупик. – omarzouk

ответ

12

Мы смогли это сделать, используя утилиты MinGW reimp и dlltool для создания библиотеки импорта libOpenCL.a для библиотеки DLL OpenCL.dll. Вот шаги, которые мы следовали:

  • шаг 1: Убедитесь, что у вас есть MinGW-утилита, установленная (для РПУЭИ и dlltool). Если вы этого не сделаете, в MinGW строке введите:

    MinGW-получить установку MinGW-Utils

  • шаг 2: Далее, введите следующую команду:

    РПУЭИ 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.

Мы были в состоянии получить это все рабочие благодаря информации, содержащейся в следующих постах, для справки:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (я могу только вставить 2 ссылки)
+0

Подтверждено, что это позволяет вам связать хотя бы с GPU Computing SDK 5.5. – imallett

2

OpenCL библиотеки - это просто заглушки в OpenCL.dll. Поэтому я рекомендую использовать метод динамической загрузки.Он просто решит все ваши проблемы. Или вам действительно нужны некоторые из настроек nVIDIA OpenCL?

Это не только безопаснее во время выполнения, но и проще скомпилировать, поскольку вам не нужен ни линкер, ни определение, ни что-либо. Просто файлы cpp/hpp добавлены в ваш проект.

Очень хороший в использовании - CLEW. Однако я полностью не согласен с этой библиотекой, потому что обертки C++ нарушены. Так что, возможно, вам понадобится какая-то настройка. Также я обычно отключаю код «atexit», так как это может быть проблематично.

+0

clew кажется мертвым? – rogerdpack