使用CuPy调用CUDA内核遇Named symbol not found错误,求解决方案
问题:CuPy调用CUDA内核提示“named symbol not found”错误
问题场景
使用CuPy调用自定义CUDA内核中的compute_linear_recurrence方法,代码如下:
import cupy as cp # code_str 为目标CUDA内核代码内容 calc_kernel = cp.RawKernel(code_str, 'compute_linear_recurrence', backend='nvcc')
执行时触发错误:
cupy_backends.cuda.api.driver.CUDADriverError: CUDA_ERROR_NOT_FOUND: named symbol not found
且内核中其他方法也无法调用。
错误原因
目标CUDA内核代码里,compute_linear_recurrence及其他无法调用的方法均被定义为设备函数(__device__修饰),而CuPy的RawKernel仅支持调用CUDA中的全局函数(__global__修饰)——设备函数只能在GPU设备端被其他设备函数或全局函数调用,无法直接从主机端(Python代码)发起调用,因此会出现符号找不到的错误。
解决办法
方法1:为设备函数添加全局函数包装器
在原CUDA代码中新增一个__global__修饰的全局函数,作为主机端调用的入口,在该函数内部调用目标设备函数。示例如下:
// 假设原设备函数签名为:__device__ void compute_linear_recurrence(int* a, int* b, int n) __global__ void wrapper_compute_linear_recurrence(int* a, int* b, int n) { // 根据原函数逻辑补充线程索引处理(按需添加) int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < n) { compute_linear_recurrence(a, b, n); } }
之后在Python代码中调用这个包装后的全局函数:
calc_kernel = cp.RawKernel(code_str, 'wrapper_compute_linear_recurrence', backend='nvcc')
方法2:将目标函数改为全局函数
如果compute_linear_recurrence本身的逻辑适合作为内核入口,直接将其修饰符从__device__改为__global__,同时确保函数符合CUDA全局函数规则(比如不能有返回值,参数需为设备内存指针等)。修改后即可直接通过RawKernel调用该函数。
内容的提问来源于stack exchange,提问作者forestbat
相关产品推荐
相关产品推荐

