【问题标题】:Compile OpenCL on Mingw Nvidia SDK在 Mingw Nvidia SDK 上编译 OpenCL
【发布时间】:2013-02-17 14:52:58
【问题描述】:

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

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

我设法编译并成功地将我的代码链接到 Nvidia 的 SDK 提供的 OpenCL 库,但是可执行文件在 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

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

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

还有没有办法使用 Mingw 进行编译并使用其他东西进行链接?我不确定其他可能是什么。

【问题讨论】:

  • 为什么不使用 VC++ Express 来构建主机代码?您还使用 32 位还是 64 位库? CUDA\v5.0\lib\x64 和 -luse32 -lcomdlg32 -ladvai32 ... -m64 混合在一起令人困惑...... -m64 所有这些库都是必需的吗?简化你的命令行。
  • 64 位,我的 C++ 代码使用 C++11 特性,所以 VC++ 不行。我尝试删除和添加库,死路一条。

标签: windows mingw opencl gpu nvidia


【解决方案1】:

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

  • 第 1 步:确保已安装 mingw-utils(用于 reimp 和 dlltool)。如果您不这样做,请在 MinGW 提示符下键入:

    mingw-get 安装 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个链接)

【讨论】:

  • 确认这允许您至少与 GPU Computing SDK 5.5 链接。
【解决方案2】:

OpenCL 库只是 OpenCL.dll 的存根。因此,我建议使用动态加载技术。它会简单地解决你所有的问题。还是您真的需要一些 OpenCL 的 nVIDIA 调整?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多