PyCuda - 使用 *.cubin - 未找到命名符号

Posted

技术标签:

【中文标题】PyCuda - 使用 *.cubin - 未找到命名符号【英文标题】:PyCuda - use *.cubin - named symbol not found 【发布时间】:2021-05-07 11:49:45 【问题描述】:

我尝试在 PyCuda 中使用已编译的 *.cubin 文件,但出现此错误:

func = mod.get_function("doublify")
pycuda._driver.LogicError: cuModuleGetFunction failed: named symbol not found

doublify.cu 的内容:

    __global__ void doublify(float *a)
    
        int idx = threadIdx.x + threadIdx.y * 4;
        a[idx] *= 2;
    

我使用以下命令编译它:

nvcc --cubin -arch sm_75 doublify.cu

这是我的 python 脚本:

    import pycuda.driver as cuda
    import pycuda.autoinit
    from pycuda.compiler import SourceModule
    import numpy

    a = numpy.random.randn(4, 4)
    a = a.astype(numpy.float32)
    a_gpu = cuda.mem_alloc(a.nbytes)

    mod = pycuda.driver.module_from_file("doublify.cubin")

    func = mod.get_function("doublify")
    func(a_gpu, block=(4,4,1))

    cuda.memcpy_dtoh(a_doubled, a_gpu)

    print(a)

我需要向 nvcc 编译器传递额外的标志吗?如果我将它与 Pycuda 的 SourceModule 一起使用,一切都会按预期工作。它也不适用于编译 *.fatbin

【问题讨论】:

【参考方案1】:

在调试 PyCuda 本身后自己弄清楚。如果其他人偶然发现了同样的问题,这就是解决方案: 我错过了 *.cu 文件开头的 extern "C" 语句。

extern "C"
__global__ void doublify(float *a)

        int idx = threadIdx.x + threadIdx.y * 4;
        a[idx] *= 2;

【讨论】:

以上是关于PyCuda - 使用 *.cubin - 未找到命名符号的主要内容,如果未能解决你的问题,请参考以下文章

PyCUDA 2D数组实现(或使用字符串)

既找不到 .cubin 也找不到 .ptx 文件编译 CUDA

NVRTC 编译何时应生成 CUBIN?

使用带有 nvcc 的 -G 标志编译为 cubin 后,Cublas 无法在内核中工作

PTX 和 CUBIN w.r.t 有啥区别? NVCC 编译器?

GPU加速系列PyCUDA:上手简单操作