在Mingw Nvidia SDK上编译OpenCL

时间:2013-03-03 13:04:28

标签: windows mingw opencl gpu nvidia

是否可以使用Mingw和Nvidia SDK编译OpenCL?

我知道它没有得到官方支持,但这没有意义。库不是作为静态链接库提供的吗?我的意思是一旦用可能的任何编译器编译,并成功链接,什么应该是问题?

我设法编译并成功将我的代码链接到Nvidia SDK提供的OpenCL库,但是可执行文件在clGetPlatformIDs处抛出了Segmentation Fault,这是我代码中的第一个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

请注意,这些库来自示例OpenCL代码的.sln文件。

我尝试了这些库的各种组合,但似乎没有任何效果。

还有一种方法可以使用Mingw进行编译并使用其他东西进行链接吗?我不确定其他东西是什么。

2 个答案:

答案 0 :(得分:14)

我们已经能够通过使用MinGW reimp和dlltool实用程序为“OpenCL.dll”DLL创建导入库“libOpenCL.a”。以下是我们遵循的步骤:

  • 第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命令。

由于以下帖子中提供的信息,我们能够完成所有工作,以供参考:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries(我只能粘贴2个链接)

答案 1 :(得分:2)

OpenCL库只是OpenCL.dll的存根。因此我建议使用动态加载技术。它只会解决你所有的问题。或者您真的需要对OpenCL进行一些nVIDIA调整吗?

它不仅在运行时更安全,而且还易于编译,因为您不需要链接器或定义,也不需要任何内容​​。只需将一个简单的cpp / hpp文件添加到您的proyect中。

一个非常好用的是CLEW。但是我并不完全赞同该库,因为C ++包装器已经破坏了。所以也许你需要一些调整。此外,我通常禁用“atexit”代码,因为它可能有问题。