news 2026/9/18 17:28:11

CUDA 13.0 来了,cuda-samples 迁移 5 步搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CUDA 13.0 来了,cuda-samples 迁移 5 步搞定

CUDA 13.0 来了,cuda-samples 迁移 5 步搞定

【免费下载链接】cuda-samplesSamples for CUDA Developers which demonstrates features in CUDA Toolkit项目地址: https://gitcode.com/GitHub_Trending/cu/cuda-samples

CUDA 13.0 发布,cuda-samples 仓库已同步适配。如果你把旧版示例代码搬到自己项目里,大概率会撞上编译报错——cudaDeviceProp 字段没了、cuCtxCreate 签名变了、CUFFT 错误码换了一半。下面按迁移顺序逐项讲清旧新代码对照,改完直接编译就能过。

影响面速查

先建立全局认知:这次 CUDA 13.0 升级共 6 项变更,波及 30 多个示例目录。对照表如下,后面按影响面从大到小逐项改。

CUDA 13.0 API 变更版本变化受影响示例代表示例
cuCtxCreate默认指向cuCtxCreate_v416 个示例 + nvrtc_helper.hmatrixMulDrv、memMapIPCDrv
cudaDeviceProp字段6 个字段废弃或移除11 个示例deviceQuery、simpleHyperQ
CUFFT 错误码删 3 个、新增 4 个4 个示例 + helper_cuda.hsimpleCUFFT
cudaMemAdvise/cudaMemPrefetchAsync默认指向_v2,设备号变cudaMemLocation2 个示例conjugateGradientMultiDeviceCG、UnifiedMemoryPerf
cudaGraphAddNode/cudaStreamGetCaptureInfo升级为_v2/_v3,新增cudaGraphEdgeData参数1 个示例graphConditionalNodes
thrust::identity移除1 个示例segmentationTreeThrust

完整对应清单在 CHANGELOG.md 的 CUDA 13.0 段落,可以直接当核对单用。

动手改:按影响面逐项替换

先改 cuCtxCreate,波及面最广

CUDA 13.0 把驱动 API 的cuCtxCreate默认指向了cuCtxCreate_v4,旧的三参形式没了,必须传CUctxCreateParams结构体。这段演示驱动 API 创建上下文的新写法,仓库里的改法可直接照抄:

// 旧 CUcontext ctx; checkCudaErrors(cuCtxCreate(&ctx, CU_CTX_SCHED_AUTO, 0, cuDevice)); // 新 CUctxCreateParams params = {}; params.flags = CU_CTX_SCHED_AUTO; checkCudaErrors(cuCtxCreate(&ctx, &params, 0, cuDevice));

注意函数名仍叫cuCtxCreate,只是第二参变成了结构体指针,设备号还在第三参,填 0 行为和以前一致。涉及 matrixMulDrv、simpleTextureDrv、EGLStream_CUDA_CrossGPU、threadMigration、jitLto、7_libNVVM 下 4 个示例,以及公共头 nvrtc_helper.h。

cudaDeviceProp 字段消失,改查 cudaDeviceGetAttribute

CUDA 13.0 把clockRatecomputeMode等 6 个cudaDeviceProp字段废弃或移除,这些属性要改用cudaDeviceGetAttribute逐个查询。这段对照以最常被引用的 clockRate 为例:

// 旧 cudaDeviceProp prop; checkCudaErrors(cudaGetDeviceProperties(&prop, dev)); int clock = prop.clockRate; // 新 int clock; checkCudaErrors(cudaDeviceGetAttribute(&clock, cudaDevAttrClockRate, dev));

字段映射:clockRatecudaDevAttrClockRatememoryClockRatecudaDevAttrMemoryClockRatedeviceOverlapcudaDevAttrGpuOverlapcomputeModecudaDevAttrComputeModekernelExecTimeoutEnabledcudaDevAttrKernelExecTimeoutcooperativeMultiDeviceLaunch整体废弃且无替代属性,新代码别走这条路。共 11 个示例,改法最完整的参照 deviceQuery,其余还有 simpleHyperQ、simpleIPC、systemWideAtomics、streamOrderedAllocationIPC、simpleCUBLASXT、vulkanImageCUDA。

CUFFT 错误码换血,switch 分支要重写

CUFFT 错误码集合调整:CUFFT_INCOMPLETE_PARAMETER_LISTCUFFT_PARSE_ERRORCUFFT_LICENSE_ERROR三个被删,新增CUFFT_MISSING_DEPENDENCYCUFFT_NVRTC_FAILURECUFFT_NVJITLINK_FAILURECUFFT_NVSHMEM_FAILURE四个细分错误码。这段对照是错误码分支的改法示意:

// 旧 if (result == CUFFT_PARSE_ERROR) fprintf(stderr, "parse error\n"); // 新 if (result == CUFFT_NVJITLINK_FAILURE) fprintf(stderr, "nvJitLink failure\n");

注意 helper_cuda.h 的错误码映射已同步更新,你项目里自写的 CUFFT 错误 if/switch 链也要跟着清一遍。涉及 simpleCUFFT、simpleCUFFT_2d_MGPU、simpleCUFFT_MGPU、simpleCUFFT_callback。

cudaMemAdvise 和 cudaMemPrefetchAsync:设备号变 cudaMemLocation

这两个 API 在 CUDA 13.0 默认指向_v2,签名里的int device参数换成了cudaMemLocation结构体。这段是多设备协同里设置内存建议与预取的改法:

// 旧 checkCudaErrors(cudaMemAdvise(ptr, size, cudaMemAdviseSetPreferredLocation, deviceId)); checkCudaErrors(cudaMemPrefetchAsync(ptr, size, deviceId, stream)); // 新 cudaMemLocation loc; loc.type = cudaMemLocationTypeDevice; loc.id = deviceId; checkCudaErrors(cudaMemAdvise(ptr, size, cudaMemAdviseSetPreferredLocation, loc)); checkCudaErrors(cudaMemPrefetchAsync(ptr, size, loc, 0, stream));

注意loc.id在设备位置时就是设备序号;预取目标如果是 CPU,用cudaMemLocationTypeHost,新签名下这是表达 host 的唯一方式。涉及 conjugateGradientMultiDeviceCG 和 UnifiedMemoryPerf。

CUDA Graphs 接口多传两个参数

cudaGraphAddNodecudaStreamGetCaptureInfo升级为_v2/_v3,新增了cudaGraphEdgeData参数用来描述图的边级属性。这段是节点添加接口的签名变化:

// 旧 checkCudaErrors(cudaGraphAddNode(&node, graph, deps, 0, &params)); // 新 checkCudaErrors(cudaGraphAddNode(&node, graph, deps, NULL, 0, &params));

注意不需要边属性时直接传NULL即可,cudaStreamGetCaptureInfo同理,edgeData位置传NULL、依赖计数挪到最后一个参数。涉及 graphConditionalNodes。

thrust::identity 移除,换 cuda::std::identity

thrust::identity<uint>()在 CUDA 13.0 被移除,等价能力转到了 CCCL。这段是无类型转换算法调用的替换:

// 旧 thrust::transform(in.begin(), in.end(), out.begin(), thrust::identity<uint>()); // 新 thrust::transform(in.begin(), in.end(), out.begin(), cuda::std::identity());

注意补一个<cuda/std/functional>头文件即可,算法本体仍留在thrust命名空间,改动面很小。涉及 segmentationTreeThrust。

编译与环境

先正常整仓构建一遍:

mkdir build && cd build cmake .. make -j$(nproc)

改完先别急着怀疑代码,九成问题是环境。这里要特别盯住"新工具链 + 旧驱动"的组合:如果你用 CUDA Toolkit 13.0+ 和 UMD 580+,但 KMD 还停在 550-,cmake 时必须把CMAKE_PREFIX_PATH指到新版驱动库:

cmake -DCMAKE_PREFIX_PATH=/usr/local/cuda/lib64/stubs/ ..

否则会链接到旧驱动,运行时直接报驱动版本不匹配,细节见 README.md 的 Forward Compatibility 一节。Tegra 平台要加平台开关和交叉编译工具链:

cmake .. -DBUILD_TEGRA=True \ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/toolchain-aarch64-linux.cmake \ -DTARGET_FS=/path/to/target/fs

CUDA 13.0 同期更新了 QNX 交叉编译工具链,对应配置文件在 cmake/toolchains/ 下。

改完怎么验

分三层验,每层信号不同:

  1. 基础层:跑 simpleCUBLAS。跑通说明运行时 API 主链路没断,Common 头文件也没有 API 残留。
  2. 多设备协同层:跑 conjugateGradientMultiDeviceCG。通过则说明cudaMemLocation新签名正确,且多 GPU 间的内存建议与预取真正生效。
  3. 性能层:跑 UnifiedMemoryPerf。拿带宽数字和升级前基线对比,确认迁移没引入性能回退。

想全量回归就一行搞定,仓库自带run_tests.py

python3 run_tests.py --output ./test --dir ./build/cpp --config test_args.json

输出目录会保存每个示例的 stdout 日志,失败直接看对应 txt,不用逐个跑。

容易踩的坑

  • 如果你遇到CUFFT_PARSE_ERROR之类 undeclared 的编译错误,大概率是 CUFFT 错误码瘦身了——那 3 个旧错误码已经不存在,换成CUFFT_MISSING_DEPENDENCYCUFFT_NVRTC_FAILURECUFFT_NVJITLINK_FAILURECUFFT_NVSHMEM_FAILURE四个新码,以 helper_cuda.h 为准。
  • 如果你在新 Toolkit + 旧 KMD 环境下刚启动就报驱动版本不匹配,大概率是 cmake 时没设CMAKE_PREFIX_PATH,链接到了旧驱动 stubs;UMD 580+ 配 KMD 550- 正是 README.md Forward Compatibility 一节描述的组合。
  • 如果你发现 EGLStream 相关示例在桌面 Linux 上不编译或缺文件,大概率是平台问题:8_Platform_Specific/Tegra 下的示例只对 Tegra 设备有意义,需要-DBUILD_TEGRA=True加 aarch64 工具链,桌面构建默认不含它们。

下次 Toolkit 再升级时,先把 CHANGELOG.md 的 CUDA 段落逐条 diff 一遍,是效率最高的适配路径;本轮改完记得用run_tests.py全量跑一次,让迁移结果可复现。

【免费下载链接】cuda-samplesSamples for CUDA Developers which demonstrates features in CUDA Toolkit项目地址: https://gitcode.com/GitHub_Trending/cu/cuda-samples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 17:28:04

自适应信号处理算法解析:从最陡下降到LMS/RLS

简介&#xff1a;这是一份系统讲解自适应信号处理核心原理的PDF学习资料&#xff0c;适合通信、雷达、语音信号处理等方向的研究生或工程师用来搭建理论基础。内容从自适应系统的基本概念和结构分类出发&#xff0c;依次梳理信号相关矩阵的厄米特性质、信号子空间与噪声子空间、…

作者头像 李华
网站建设 2026/9/18 17:23:59

Buck变换器仿真实战:从参数计算到闭环控制的MATLAB/Simulink实现

简介&#xff1a;基于MATLAB/SIMULINK的BUCK变换器研究与设计课程设计报告&#xff0c;面向电力电子专业学生及课程设计参与者&#xff0c;旨在帮助读者系统掌握降压型DC-DC变换器的设计、仿真与波形分析。资源包含1个doc文档&#xff0c;压缩包仅1.74MB&#xff0c;虽为单一文…

作者头像 李华
网站建设 2026/9/18 17:20:03

scrcpy 安卓投屏完整指南:一条命令把手机画面搬上电脑

scrcpy 安卓投屏完整指南&#xff1a;一条命令把手机画面搬上电脑 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 录手机操作教程&#xff0c;你架好三脚架、把相机对准屏幕&#xff0c;结…

作者头像 李华
网站建设 2026/9/18 17:18:57

RocketMQ与Kafka选型实战:从架构原理到运维避坑指南

做技术选型最怕的不是“哪个好”&#xff0c;而是“哪个适合我”。RocketMQ和Kafka这两大消息中间件&#xff0c;几乎撑起了国内互联网公司消息队列选型的半边天&#xff0c;网上对比文章一抓一大把&#xff0c;但大部分停留在“Kafka吞吐高、RocketMQ功能全”这种层面。今天我…

作者头像 李华
网站建设 2026/9/18 17:17:44

VS Code 内嵌视频播放实战:扩展、关联与排错全指南

说实话&#xff0c;我一开始没想过要在 VS Code 里看视频。直到有一次线上演示&#xff0c;我一边给同事讲解代码逻辑&#xff0c;一边想播放一段操作录屏&#xff0c;结果在 VS Code 里双击视频文件&#xff0c;系统直接弹出了默认播放器&#xff0c;窗口一切换&#xff0c;演…

作者头像 李华