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

CUDA 12中cuModuleGetSurfRef与cuModuleGetTexRef的替代方案咨询

CUDA 12中cuModuleGetSurfRef和cuModuleGetTexRef的替代方案及相关问题

替代方案

CUDA 12弃用cuModuleGetSurfRef和cuModuleGetTexRef后,官方推荐切换到**纹理对象(Texture Objects)和表面对象(Surface Objects)**模型,对应的替代函数是cuModuleGetGlobal()。

旧的引用模型(CUsurfref/CUtexref)是通过引用间接绑定资源,而新的对象模型将纹理/表面资源封装为cudaTextureObject_t或cudaSurfaceObject_t类型的全局变量。你可以通过cuModuleGetGlobal()获取模块中这类全局对象的地址,进而在主机端或核函数中使用。

示例代码片段(获取纹理对象):

CUdeviceptr tex_obj_ptr;
size_t tex_obj_size;
cuModuleGetGlobal(&tex_obj_ptr, &tex_obj_size, hmod, "my_texture_object");
cudaTextureObject_t* tex_obj = reinterpret_cast<cudaTextureObject_t*>(tex_obj_ptr);

模块中表面和纹理的访问方式变化

是的,必须改用对象模型的方式访问:

  • 旧流程:获取引用 → 绑定资源到引用 → 核函数通过引用访问
  • 新流程:直接获取/创建对象 → 核函数直接使用对象进行纹理采样或表面读写,无需额外绑定步骤

核函数中的使用示例:

__global__ void kernel(cudaTextureObject_t tex_obj) {
    float value = tex2D<float>(tex_obj, x, y);
    // 对表面对象可使用surf2Dread/surf2Dwrite
}

是否会完全从模块中移除

目前CUDA 12仅标记这两个函数为弃用,暂时还能使用。但按照NVIDIA的API迭代策略,后续大版本(如CUDA 13及以后)很大概率会彻底移除旧的引用模型API,包括这两个函数以及相关的CUsurfref/CUtexref类型。

驱动API处理方式(若旧API被移除)

如果后续旧API完全移除,使用CUDA驱动API处理纹理/表面的标准流程如下:

  1. 设备代码定义:在.cu文件中定义全局的纹理/表面对象变量,或者在主机端动态创建对象后传递给核函数
  2. 获取对象地址:通过cuModuleGetGlobal()从加载的模块中获取全局对象的设备地址
  3. 主机端操作:可通过该地址对对象进行参数配置(如需),但更多场景下直接在核函数中使用对象即可
  4. 核函数访问:在核函数中直接使用cudaTextureObject_t或cudaSurfaceObject_t调用对应的采样/读写函数(如tex2D、surf2Dread等)

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:51:55