You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:07:09