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 - 未找到命名符号的主要内容,如果未能解决你的问题,请参考以下文章
既找不到 .cubin 也找不到 .ptx 文件编译 CUDA
使用带有 nvcc 的 -G 标志编译为 cubin 后,Cublas 无法在内核中工作