编译Boost.python和cuda代码

时间:2012-05-30 04:18:28

标签: boost cuda boost-python bjam nvcc

我想汇编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,但我需要在Boost个文件中加入thrust.cu库。
另外,如果可能的话,我想坚持使用标准的命令行驱动的编译过程。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

为了整合用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。

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