【问题标题】:Compiling Boost.python and cuda code编译 Boost.python 和 cuda 代码
【发布时间】:2012-06-04 07:30:25
【问题描述】:

我想编译parallel.cupython_wrapper.cpp,其中python_wrapper.cpp使用Boost.pythonparallel.cu中的方法暴露给python。
我是 cudaBoost.python 的新手。
从他们的手册和谷歌中,我找不到如何让他们说话。
一些网站说,我应该做类似的事情

nvcc -o parallel.cu
g++ -o python_wrapper.cpp
g++ parallel.o python_wrapper.o

但我知道编译Boost.python 代码的唯一方法是使用bjam
已经尝试将nvcc 集成到bjam 中,但我无法让它们工作。

parallel.cuh

__global__ void parallel_work();
int do_parallel_work();

python_wrapper.cpp

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include "parallel.cuh"

BOOST_PYTHON_MODULE(parallel_ext){
    using namespace boost::python;
    def("parallel", do_parallel_work);
}

如何编译这些文件?
我听说过PyCuda,但我需要在我的.cu 文件中包含Boostthrust 库。
另外,如果可能的话,我想坚持一个标准的命令行驱动的编译过程。

【问题讨论】:

  • 在没有 bjam 的情况下编译 Boost.Python 代码是完全可能的(而且我认为它比尝试使用 bjam 更容易)。您基本上只需要编译一个链接到 Python 和 Boost.Python 共享库的共享库,并使用 Python 和 Boost.Python 标头的包含路径。
  • 我建议使用已经存在的库来将 CUDA 与 Python 集成。仔细看看 PyCUDA。另外,看看 ArrayFire(我正在研究的那个)。谷歌“gpu python”。这些会有帮助吗?

标签: boost cuda boost-python bjam nvcc


【解决方案1】:

使用 CUDA 函数创建静态或动态库并将其链接。也就是说,使用 nvcc 创建库,然后在单独的步骤中使用 g++ 创建 Python 模块并链接到库中。

【讨论】:

  • 是的,nvcc 预处理器无法正确处理真的复杂的 C++ 模板构造,而 boost 是最臭名昭著的代码示例,无法使用 nvcc steerage 进行编译。
【解决方案2】:

为了整合用nvcc编译的代码和用g++编译的代码,我刚刚为cuda源定义了一个新的编译规则,存储在.cu文件到.o

.cu 编译为.o 的规则存储在我从 Jamroot 导入的nvcc.jam 文件中。

下面是我的 nvcc.jam 文件

import type ;
type.register CUDA : cu ;

import generators ;
generators.register-standard nvcc.compile : CUDA : OBJ ;

actions compile
{
    "/usr/local/cuda/bin/nvcc" -gencode=arch=compute_10,code=\"sm_10,compute_10\"  -gencode=arch=compute_20,code=\"sm_20,compute_20\" -gencode=arch=compute_30,code=\"sm_30,compute_30\"  -m64 --compiler-options -fno-strict-aliasing  -I. -I/usr/local/cuda/include -I/home/user/GPU/SDK/C/common/inc -I/home/user/GPU/SDK/shared/inc -DUNIX -O2   -o $(<) -c $(>)
}

显然,由于 cuda 安装路径是硬编码的,所以这有点麻烦,但它可以很好地满足我的需要。我希望拥有从 NVidia SDK 分发的等效(希望更清洁)bjam 扩展。

然后我可以在主项目文件中使用 .cpp 和 .cu 文件定义编译规则,例如:

exe testdraw
:
    gpu/drawable.cu
    gpu/testdraw.cpp
    gpu/cudacommon.cu
    gpu/host.cpp
    gpu/opencl.cpp
    gpu/opencl24.cpp

    png
    z
    cl
    libboost_program_options

    cuda
    cudart
    cublas
:
;

cudacudartcublas 是像往常一样声明的常用 cuda 库。

lib cudart : : <name>cudart ;
lib cuda : : <name>cuda ;
lib cublas : : <name>cublas ;

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2017-07-28
    • 2012-04-19
    • 2018-05-03
    相关资源
    最近更新 更多