【问题标题】:PyCuda - use *.cubin - named symbol not foundPyCuda - 使用 *.cubin - 未找到命名符号
【发布时间】: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

【问题讨论】:

    标签: nvcc pycuda


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2012-08-02
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多