CUDA Samples 版本演进全解析:从 CUDA 9.2 到 13.3 的变更日志深度解读
2026/9/15 20:58:16 网站建设 项目流程

CUDA Samples 版本演进全解析:从 CUDA 9.2 到 13.3 的变更日志深度解读

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

CUDA Samples 是 NVIDIA 官方提供的 CUDA Toolkit 功能示例集,其 CHANGELOG.md 记录了从 CUDA 9.2 首次开源发布到 CUDA 13.3 的全部版本演进。本文以该变更日志为核心骨架,结合仓库源码(C++ 与 Python 示例、CMake 构建脚本、公共头文件)逐版本剖析 API 迁移、示例增删与工程化改进,帮助你快速定位"哪个示例对应哪个 CUDA 版本特性",并在升级 CUDA Toolkit 时准确预判构建与代码迁移风险。

一、版本全貌与目录结构演进

1.1 版本时间线概览

从 CHANGELOG.md 可以梳理出仓库覆盖的版本区间:CUDA 9.2(GitHub 首版发布)→ 10.x → 11.x(目录结构重构、全面转向 GitHub 分发)→ 12.x(CMake 构建迁移、跨平台工具链更新)→ 13.x(重大 API 弃用清理、CUDA Python 与 CUDA Tile 新示例群)。各版本的核心动作可归纳为三类:新增示例移除过时示例适配 API 变更

1.2 目录结构与语言双轨

CUDA 13.2 起,仓库将顶层Samples目录重命名为cpp,以便与新增的python/示例并存:

  • cpp/:C++/CUDA 示例,按功能分为0_Introduction1_Utilities2_Concepts_and_Techniques3_CUDA_Features4_CUDA_Libraries5_Domain_Specific6_Performance7_libNVVM8_Platform_Specific/Tegra9_CUDA_Tile共十个子目录;
  • python/:CUDA Python 示例,采用与 C++ 树一致的1_GettingStarted2_CoreConcepts3_FrameworkInterop4_DistributedComputing组织方式,并共享 python/Utilities/cuda_samples_utils.py 等辅助模块;
  • Common/:C++ 示例共享的公共头文件(helper_cuda.hhelper_image.hnvrtc_helper.h等)。

注意:CHANGELOG 明确指出,Python 示例不参与根 CMake 工程的构建。安装方式为在示例目录内执行pip install -r requirements.txt,再按各示例 README 运行对应的.py文件。

二、CUDA 13.x:API 大迁移与新特性示例

CUDA 13.x 是变更最密集的版本段,核心工作是清理被弃用(deprecated)并移除的 API,同时引入两个全新的示例族。

2.1 CUDA 13.0:cudaDeviceProp 字段迁移到 cudaDeviceGetAttribute

CUDA 13.0 移除了多个cudaDeviceProp字段,仓库统一改用cudaDeviceGetAttribute查询等价属性。CHANGELOG 给出了完整的字段映射表:

被移除的cudaDeviceProp字段替代查询(cudaDeviceGetAttribute枚举)
clockRatecudaDevAttrClockRate
deviceOverlapcudaDevAttrGpuOverlap
kernelExecTimeoutEnabledcudaDevAttrKernelExecTimeout
computeModecudaDevAttrComputeMode
memoryClockRatecudaDevAttrMemoryClockRate
cooperativeMultiDeviceLaunch弃用(cudaLaunchCooperativeKernelMultiDevice亦已弃用)

源码印证:在 deviceQuery.cpp 中可以看到典型迁移模式,并且通过CUDART_VERSION >= 13000宏做了条件编译——CUDA 13.0 及以上走cudaDeviceGetAttribute,旧版本仍读deviceProp字段,保证跨版本兼容:

int clockRate; checkCudaErrors(cudaDeviceGetAttribute(&clockRate, cudaDevAttrClockRate, dev)); printf(" GPU Max Clock rate: %.0f MHz (%0.2f GHz)\n", clockRate * 1e-3f, clockRate * 1e-6f); #if CUDART_VERSION >= 13000 checkCudaErrors(cudaDeviceGetAttribute(&memoryClockRate, cudaDevAttrMemoryClockRate, dev)); #else memoryClockRate = deviceProp.memoryClockRate; #endif

同样地,kernelExecTimeoutgpuOverlap(deviceQuery.cpp)、computeMode(deviceQuery.cpp)也都切换到了属性查询接口,而cooperativeMultiDeviceLaunch则在 CUDA 13.0 起直接由#if CUDART_VERSION < 13000保护(deviceQuery.cpp)。本次迁移涉及 6 个目录下的示例,包括UnifiedMemoryStreamssimpleHyperQsimpleIPCsimpleMultiCopysystemWideAtomicsstreamOrderedAllocationIPCsimpleCUBLASXTsimpleVulkanvulkanImageCUDA等。

2.2 CUDA 13.0:Driver API 与 Runtime API 签名升级

cudaDeviceProp外,CUDA 13.0 还升级了三个核心 API 签名:

(1)cuCtxCreatecuCtxCreate_v4:新增CUctxCreateParams参数。公共头文件 nvrtc_helper.h 中loadCUBIN的实现即为标准迁移样板——先初始化空的CUctxCreateParams ctxCreateParams = {},再传入cuCtxCreate

CUctxCreateParams ctxCreateParams = {}; ... checkCudaErrors(cuInit(0)); checkCudaErrors(cuCtxCreate(&context, &ctxCreateParams, 0, cuDevice));

受影响的示例包括 Driver API 系列matrixMulDrvsimpleTextureDrvvectorAddDrvvectorAddMMAPmemMapIPCDrv,以及7_libNVVM下的cuda-c-linkingdevice-side-launchsimpleuvmlite等。

(2)cudaGraphAddNode/cudaStreamGetCaptureInfo_v2/_v3:新增cudaGraphEdgeData指针参数。以 graphConditionalNodes.cu 为例,cudaGraphAddNode的调用模式为传入 NULL 依赖数组与边数据指针:

checkCudaErrors(cudaGraphAddNode(&kernelNode, graph, NULL, NULL, 0, &params)); checkCudaErrors(cudaGraphAddNode(&conditionalNode, graph, &kernelNode, NULL, 0, &cParams));

(3)cudaMemAdvise/cudaMemPrefetchAsync_v2int device参数改为cudaMemLocation location。涉及conjugateGradientMultiDeviceCGUnifiedMemoryPerf两个多 GPU 内存管理示例。

2.3 CUDA 13.0:cuFFT 错误码重构

cuFFT 弃用了CUFFT_INCOMPLETE_PARAMETER_LISTCUFFT_PARSE_ERRORCUFFT_LICENSE_ERROR,新增四个错误码。公共头文件 helper_cuda.h 中的_cudaGetErrorEnum(cufftResult)已同步加入新错误码的字符串映射:

case CUFFT_MISSING_DEPENDENCY: return "CUFFT_MISSING_DEPENDENCY"; case CUFFT_NVRTC_FAILURE: return "CUFFT_NVRTC_FAILURE"; case CUFFT_NVJITLINK_FAILURE: return "CUFFT_NVJITLINK_FAILURE"; case CUFFT_NVSHMEM_FAILURE: return "CUFFT_NVSHMEM_FAILURE";

新增错误码的语义可以从命名推断:MISSING_DEPENDENCY表示缺失运行时依赖,NVRTC_FAILURE/NVJITLINK_FAILURE表示 cuFFT 内部通过 NVRTC 或 NVJITLINK 做 JIT 编译时失败,NVSHMEM_FAILURE表示 NVSHMEM 相关路径失败。受影响示例为simpleCUFFTsimpleCUFFT_2d_MGPUsimpleCUFFT_MGPUsimpleCUFFT_callback四个 FFT 示例。

2.4 CUDA 13.1 与 13.2

  • CUDA 13.1:仅"小规模 bug 修复与增强,无结构或功能变化",属于低风险升级;
  • CUDA 13.2:针对 MSVC 编译器新增-Xcompiler=/Zc:preprocessor编译选项。根 CMakeLists.txt 中的实现如下,作用是启用符合标准的预处理器以兼容 CUDA 13.2 的 CCCL——CHANGELOG 特别强调,若继续使用传统预处理器,会触发 "MSVC/cl.exe with traditional preprocessor is used…" 警告并最终导致构建错误
# Add MSVC-specific flags for standard-conforming preprocessor (required for CCCL) if(MSVC) add_compile_options($<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=/Zc:preprocessor>) endif()
  • CUDA 13.2 (update):新增python/示例树,并将Samples目录重命名为cpp,同步更新了 CMakeLists.txt 与Common头文件中的路径引用。

2.5 CUDA 13.3:CUDA Tile C++ 与 CCCL 特性示例

CUDA 13.3 新增两大示例群:

(1)CUDA Tile C++ 示例(cpp/9_CUDA_Tile/):官方 CUDA Tile C++ 库入门到进阶。根据 9_CUDA_Tile/README.md,各示例定位如下:

示例技术要点
helloTileTile 内核基础:启动方式与 SIMT/Tile 内核间经全局内存传数据
tileVectorAddcuda::tiles::partition_view将数据切分为 1024 元素块,掩码加载/存储处理越界尾块
tileTranspose分块矩阵转置:块内加载→本地转置→写入目标位置
tileMatmulFP16 输入 + FP32 累加的cuda::tiles::mma矩阵乘,对比朴素与优化实现并用 CUDA events 计时验证
tileMatmulAutotuner基于 nvrtc/nvcc 的矩阵乘自动调优器
tileBmm静态持久化批量矩阵乘(BMM),网格按 SM 数量启动固定数量的持久块
tileLayerNorm/tileRope/tileSpMV/tileTranspose算子级 Tile 实现

(2)CCCL 3.3 特性示例(cpp/4_CUDA_Libraries/):这批示例通过 CPM 拉取 CCCL(固定 v3.3.3,可用CCCL_SOURCE_DIR覆盖):

  • cubDeviceFindcub::DeviceFind::FindIfLowerBoundUpperBound设备级查找算法;
  • cubDeviceSegmentedScanExclusiveSegmentedSum与带自定义二元算子的InclusiveSegmentedScan
  • cubDeviceTransform:操作符返回cuda::std::tuple的 N-to-Mcub::DeviceTransform::Transform
  • libcuxxRandomcuda::pcg64cuda::std::philox4x32引擎驱动<cuda/std/random>中的均匀、正态、泊松、伯努利分布;
  • libcuxxMdspan:通过cuda::to_device_mdspan/cuda::to_dlpack_tensor实现 DLPack 与cuda::std::mdspan互转,并提供cuda::shared_memory_mdspan对共享内存建立多维视图。

(3)cuda.compute 1.0 Python 示例(python/2_CoreConcepts/)cudaComputeLambdasbinarySearch两个示例。根据 cudaComputeLambdas/README.md,cuda.compute(来自cuda-cccl包)接受纯 Python 可调用对象(含 lambda)作为算子,内部通过 Numba 将算子 JIT 编译为 LTO-IR 供设备端执行,覆盖reduce_intounary_transforminclusive_scan三类算法族;binarySearch则演示并行的upper_bound/lower_bound,并用numpy.searchsorted校验结果。硬件要求 Compute Capability 7.0+,软件要求 CUDA Toolkit 13.0+ 与 Python 3.10+。

三、CUDA 12.x:工程化改造与示例清理

3.1 CUDA 12.8:全面迁移到 CMake

CUDA 12.8 是工程层面的分水岭:仓库构建系统统一为 CMake,移除了 Visual Studio 工程文件与 Makefile。根 CMakeLists.txt 展示了当前构建配置要点:

  • cmake_minimum_required(VERSION 3.20)project声明 C/CXX/CUDA 三种语言,find_package(CUDAToolkit REQUIRED)
  • C++ 与 CUDA 均使用 C++17 标准;
  • CMAKE_CUDA_ARCHITECTURES默认覆盖 75/80/86/87/89/90/100/110/120 多个架构;
  • 默认追加-lineinfo便于调试工具使用(ENABLE_CUDA_DEBUG时改用-G启用 cuda-gdb);
  • 全局开启--extended-lambda并(MSVC 下)追加/Zc:preprocessor

3.2 CUDA 12.8:过时示例清理清单

CHANGELOG 明确列出了被移除的示例及其理由,对评估旧教程代码有直接参考价值:

目录移除示例移除理由
0_Introductionc++11_cuda过时
concurrentKernels过时
cppIntegration过时
cppOverload过时
simpleSeparateCompilation过于简单
simpleTemplates_nvrtcsimpleTemplates冗余
simpleVoteIntrinsics_nvrtcsimpleVoteIntrinsics冗余
2_Concepts_and_TechniquescuHook与现代glibc不兼容
4_CUDA_LibrariesbatchedLabelMarkersAndLabelCompressionNPP库中部分功能被移除
5_Domain_SpecificfluidsD3D9simpleD3D9simpleD3D9TexturesimpleD3D10simpleD3D10RenderTargetsimpleD3D10TextureSLID3D10TextureVFlockingD3D10遗留 Direct3D 9/10 互操作示例
8_Platform_Specific/Tegranbody_screensimpleGLES_screen暂移出,待 QNX 更新

同一版本还把 12 个 Tegra 专属示例(EGLSync_CUDAEvent_InteropcuDLAErrorReportingcuDLAHybridModecuDLALayerwiseStatsHybridcuDLALayerwiseStatsStandalonecuDLAStandaloneModecudaNvSciBufMultiplanarcudaNvSciNvMediafluidsGLESnbody_openglessimpleGLESsimpleGLES_EGLOutput)统一迁入 8_Platform_Specific/Tegra。

3.3 CUDA 12.9:测试工具与代码格式化

CUDA 12.9 的主要变化包括:

  • 新增 run_tests.py 工具用于批量执行全部示例(详情见 README.md),脚本支持并发执行、线程安全输出,并将豁免(waived)测试的退出码约定为 2;
  • 全仓库统一代码格式;
  • 移除已过时且结果不准确的bandwidthTest(官方建议改用 NVBandwidth 工具);
  • 更新 Tegra Linux 交叉编译工具链。

3.4 CUDA 12.0 ~ 12.5 关键新增

  • CUDA 12.0:新增 JIT 编译相关 flag,移除 Hopper 架构中的弃用 API;
  • CUDA 12.1:新增 Large Kernel 示例(cpp/6_Performance/LargeKernelParameter/);
  • CUDA 12.2:libNVVM 示例更新,修复jitLto案例问题,为 GCC 启用(未经充分测试的)HOST_COMPILER选项;
  • CUDA 12.3:新增 cuDLA 系列示例,修复jitLto回归;
  • CUDA 12.4:新增 graphConditionalNodes(条件图节点)示例。

四、CUDA 11.x:目录重构与示例爆发期

4.1 CUDA 11.0~11.6 代表性新增

CUDA 11.x 是新增示例最多的时期,CHANGELOG 记录的核心新增包括:

  • Tensor Core 矩阵乘(Ampere,CUDA 11.0)dmmaTensorCoreGemm(双精度 WMMA)、bf16TensorCoreGemm__nv_bfloat16)、tf32TensorCoreGemm(tf32),全部基于 Ampere 芯片家族张量核心;
  • 协作组(Cooperative Groups,CUDA 11.0)warpAggregatedAtomicsCG(warp 聚合原子操作,CC 7.0+)、binaryPartitionCG(二分分区与块内归约)、reduction新增reduce_add_synccooperative_groups::reduce两个新内核;
  • 异步拷贝与屏障(CUDA 11.0)globalToShmemAsyncCopy(CC 8.0+ 全局到共享内存异步拷贝)、simpleAWBarrier(arrive-wait 屏障);
  • 流顺序内存分配(CUDA 11.2)streamOrderedAllocationstreamOrderedAllocationP2P,演示cudaMallocAsynccudaMemPoolAPI 族;
  • 图内存节点(CUDA 11.5)graphMemoryNodes(图内内存分配/释放)、graphMemoryFootprint(虚拟地址与物理内存复用);
  • cuDLA 系列(CUDA 11.5)cuDLAHybridModecuDLAStandaloneModecuDLAErrorReporting
  • 其他cudaOpenMP(多 GPU OpenMP,11.1)、simpleZeroCopy(零拷贝,11.1)、watershedSegmentationNPP(分水岭分割,11.1)、simpleCUBLAS_LU(批量 LU 分解,11.3)、cdpQuadtree(CUDA Dynamic Parallelism 四叉树,11.4)、simpleVulkan/simpleVulkanMMAP/vulkanImageCUDA的 SPIR-V 与时间线信号量更新(11.4)、cudaNvSciNvMedia(NvSciBuf/NvSciSync 互操作,11.2)。

4.2 CUDA 11.5/11.6 工程与分发变化

  • CUDA 11.5:CUDA Toolkit 中的全部示例迁移至 GitHub 发布;
  • CUDA 11.6:新增示例目录结构(即当前的cpp/0_Introduction~8_Platform_Specific框架);全部 Windows 示例支持 Visual Studio 2022;CUDA Samples 不再随 CUDA Toolkit 分发,仅通过 GitHub 获取
  • CUDA 11.4:新增 Linux 平台 VS Code 支持;
  • CUDA 11.2:Windows 端放弃 Visual Studio 2015;FreeImage 不再随示例分发(Windows 参见 README.md 的 Dependencies 章节,Linux 推荐使用发行版包管理器安装);全部示例支持nvcc --threads并行构建;Pipeline 与 arrive-wait 屏障示例统一迁移到新的cuda::pipeline/cuda::barrier接口。

五、CUDA 10.x:库互操作与图 API 奠基

CUDA 10.x 的示例为后续版本奠定了基础,代表性新增包括:

  • CUDA Graphs(10.0):simpleCudaGraphs(图的创建/实例化/启动)、conjugateGradientCudaGraphs(cuBLAS/cuSPARSE 调用捕获进图);
  • 互操作(10.0/10.1)simpleVulkansimpleD3D12vulkanImageCUDAEGLStream_CUDA_InteropsimpleD3D11(外部资源互操作 + Keyed Mutex 同步)、simpleDrvRuntime(Driver 与 Runtime API 协同加载 fatbinary);
  • 内存映射(10.2)vectorAddMMAPmemMapIPCDrv,演示cuMemMap物理属性指定与 IPC;
  • NPP/cuSolver/cuRAND(10.1~10.2)boxFilterNPPcannyEdgeDetectorNPPwatershedSegmentationNPP(10.1 Update 1)、cuSolverDn_LinearSolvercuSolverSp_LinearSolver(LU/QR/Cholesky 分解)、MersenneTwisterGP11213nvJPEG/nvJPEG_encoder
  • 性能与系统(10.0/10.1)p2pBandwidthLatencyTestUnifiedMemoryPerfsystemWideAtomicsreduction(数据并行优化策略集合);
  • 平台支持:10.1 Update 1 起支持 Visual Studio 2019,10.0 起放弃 Visual Studio 2010。

六、CUDA 9.2:GitHub 首版与长期保留的经典示例

CUDA 9.2 是 CUDA Samples 在 GitHub 的首个发布版本,CHANGELOG 列出的首批示例中,相当一部分至今仍保留在仓库中(如matrixMulsimpleCUBLASsimpleCUFFTdeviceQuery),另一些则演变为后续示例的源头:

  • 入门类vectorAdd_nvrtc(NVRTC 运行时编译)、deviceQuery(设备属性枚举);
  • 矩阵乘matrixMul(共享内存分块)、matrixMulDrv(Driver API 版本)、cudaTensorCoreGemm(Volta 张量核心 WMMA);
  • 同步原语(CUDA 9.0 引入的_sync版本)simpleVoteIntrinsics(vote intrinsics)、shfl_scan(shuffle intrinsics);
  • 协作组与求解器conjugateGradientMultiBlockCGconjugateGradientMultiDeviceCG(多设备协作组 + 统一内存预取与使用提示 API);
  • 库示例simpleCUBLAS(GEMM)、simpleCUFFT(FFT)。

从源码看,部分 9.2 时代的示例至今仍在随新 API 演进:例如 segmentationTreeThrust/segmentationTree.cu 中的thrust::copy_if谓词已在 CUDA 13.0 从弃用的thrust::identity<uint>()迁移为cuda::std::identity()

thrust::copy_if(thrust::make_counting_iterator(0U), thrust::make_counting_iterator(validEdgesCount), dEdgesFlags, dVertices_, cuda::std::identity()) .get();

七、升级指引:从 CHANGELOG 反推迁移清单

7.1 跨版本 API 迁移速查表

APICUDA 13.0 变化受影响示例
cudaDeviceProp.clockRate等 5 个字段改查cudaDeviceGetAttributedeviceQuery等 10 余个
cuCtxCreate新增CUctxCreateParams参数(cuCtxCreate_v4matrixMulDrvnvrtc_helper.h等 15 处
cudaGraphAddNode/cudaStreamGetCaptureInfo新增cudaGraphEdgeData参数(_v2/_v3graphConditionalNodes
cudaMemAdvise/cudaMemPrefetchAsyncint devicecudaMemLocationconjugateGradientMultiDeviceCGUnifiedMemoryPerf
thrust::identity<uint>()替换为cuda::std::identity()segmentationTreeThrust
cuFFT 错误码弃用 3 个、新增 4 个helper_cuda.h与 4 个 FFT 示例

7.2 构建与分发注意事项

  1. 构建系统:CUDA 12.8 起仅支持 CMake(最低 3.20),Visual Studio 工程与 Makefile 已移除;
  2. MSVC 用户:CUDA 13.2 起必须开启-Xcompiler=/Zc:preprocessor,否则 CCCL 相关代码直接构建失败;
  3. Windows 依赖:FreeImage 自 CUDA 11.2 起不再随示例分发,需按 README.md 的 Dependencies 章节手动配置;
  4. Python 示例:不纳入 CMake 构建,按示例目录内的 requirements.txt 安装依赖后独立运行;
  5. Tegra 交叉编译:CUDA 12.9/13.0 持续更新 Tegra Linux/QNX 交叉编译工具链,相关配置见 cmake/toolchains/;
  6. 示例获取方式:自 CUDA 11.6 起,CUDA Samples 仅通过 GitHub 仓库分发,不再随 CUDA Toolkit 附带。

八、结语:将 CHANGELOG 用作学习路线图

CHANGELOG.md 的价值不仅在于"发生了什么",更在于它本身就是一份按版本组织的 CUDA 特性路线图:想学习 Tensor Core WMMA,看 CUDA 9.2/10.1/11.0 的*TensorCoreGemm系列;想理解 CUDA Graphs 的完整演进,串联 CUDA 10.0 的simpleCudaGraphs、11.5 的图内存节点、12.4 的条件图节点与 13.3 的图性能缩放示例;想掌握最新的 Tile 编程模型与 CCCL 算法库,则直接研读 CUDA 13.3 新增的 9_CUDA_Tile 与 4_CUDA_Libraries 示例群。在升级 CUDA Toolkit 前,对照本文的迁移速查表逐一检查受影响的示例与公共头文件,可以显著降低构建与运行时的兼容性风险。

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

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询