【问题标题】:Compiling library with cuda 7.0 using nvcc on windows while linking to 32-bit python 2.5在 Windows 上使用 nvcc 使用 cuda 7.0 编译库,同时链接到 32 位 python 2.5
【发布时间】:2015-08-02 12:48:26
【问题描述】:

我正在尝试编译一个可以使用 nvcc 从 python 调用的库。通常在 Windows 上,我使用 msys/mingw 工具链并且可以毫无问题地编译 python 扩展。但是,当我尝试使用 nvcc 进行编译时,我相信它使用的是 link.exe,它是(Microsoft Visual Studio 的一部分)。虽然它编译得很好,但在链接步骤失败了。

我意识到我使用的是旧版本的 python(2.5 版)。我正在使用旧版应用程序,我暂时坚持使用旧版本。

这是我正在尝试的 nvcc 命令:

nvcc -I "C:\Python25\include" -I "C:\python25\Lib\site-packages\numpy\core\include\numpy" -L "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64" -lcusolver -lcusparse -Xlinker "C:\Python25\libs\python25.lib" cusolve5.cu

但它失败并显示此消息:

   Creating library a.lib and object a.exp
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyObject_GetAttrString referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyCObject_AsVoidPtr referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyErr_SetString referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyErr_Format referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyArg_ParseTuple referenced in function main
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_Py_BuildValue referenced in function main
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_Py_InitModule4_64 referenced in function "void __cdecl initbmc(void)" (?initbmc@@YAXXZ)
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyErr_Print referenced in function "void __cdecl initbmc(void)" (?initbmc@@YAXXZ)
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyImport_ImportModule referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyCObject_Type referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyExc_AttributeError referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyExc_ImportError referenced in function _import_array
tmpxft_00001128_00000000-28_cusolve5.obj : error LNK2019: unresolved external symbol __imp_PyExc_RuntimeError referenced in function _import_array
a.exe : fatal error LNK1120: 13 unresolved externals

在我看来,找不到 python 库。使用 msys/mingw 我可以像这样链接一个类似的库:

g++ bmc.o -L "/c/python25/libs" -lpython25 -shared -o bmc.pyd

效果很好(但不包括我正在研究的任何 GPU 加速)。我的猜测是有一些选项我需要通过 -Xlinker 命令传递 link.exe,但我似乎无法在构建时找到包含 python 库的方法。

【问题讨论】:

  • 你的 Python 是用 Visual Studio 构建的吗?
  • 我正在使用官方 python 解释器和从 python.org 下载为二进制文件的库。我假设官方的 python 发行版是用 Visual Studio 编译的,但我不确定。
  • 如果您尝试从命令行使用可视编译器进行编译,会发生什么情况?我的主要观点是,我不认为你可以混合编译器(而 CUDA 需要 Visual Studio)。
  • 这是怎么一回事:-Xlinker "C:\Python25\libs\python25.lib" 您是否要将该库添加到链接规范中?如果是这样,那不是你的做法。尝试用-L"C:\Python25\libs" -lpython25 替换它。此外,您显示的nvcc 编译命令对于从cusolve5.cu 构建可执行文件是正确的,但如果您打算构建,则不正确。

标签: python windows cuda nvcc


【解决方案1】:

感谢@talonmies 的提示,我得出的结论是,我试图做的事情是不可能的,原因有两个:

  1. python2.5 是用 VS 2005 编译的,我无法访问它,而且 nVidia 可能不支持它(http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-microsoft-windows 的列表中不包括这么旧的编译器)

不过,这可以通过使用 ctypes 加载 dll 而不是标准的 python 导入来解决。不过……

  1. 我的 python 二进制文件是 32 位的,而 Cuda 7.0 只支持 64 位。 cusolver.lib 和 cusparse.lib(对我的优化很重要)可以在 Cuda 7.0 发行版的 x64 目录中找到。在将“--machine 32”传递给 nvcc 时链接到它们不起作用,尽管这并不奇怪。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多