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_Introduction、1_Utilities、2_Concepts_and_Techniques、3_CUDA_Features、4_CUDA_Libraries、5_Domain_Specific、6_Performance、7_libNVVM、8_Platform_Specific/Tegra、9_CUDA_Tile共十个子目录; - python/:CUDA Python 示例,采用与 C++ 树一致的
1_GettingStarted、2_CoreConcepts、3_FrameworkInterop、4_DistributedComputing组织方式,并共享 python/Utilities/cuda_samples_utils.py 等辅助模块; - Common/:C++ 示例共享的公共头文件(
helper_cuda.h、helper_image.h、nvrtc_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枚举) |
|---|---|
clockRate | cudaDevAttrClockRate |
deviceOverlap | cudaDevAttrGpuOverlap |
kernelExecTimeoutEnabled | cudaDevAttrKernelExecTimeout |
computeMode | cudaDevAttrComputeMode |
memoryClockRate | cudaDevAttrMemoryClockRate |
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同样地,kernelExecTimeout与gpuOverlap(deviceQuery.cpp)、computeMode(deviceQuery.cpp)也都切换到了属性查询接口,而cooperativeMultiDeviceLaunch则在 CUDA 13.0 起直接由#if CUDART_VERSION < 13000保护(deviceQuery.cpp)。本次迁移涉及 6 个目录下的示例,包括UnifiedMemoryStreams、simpleHyperQ、simpleIPC、simpleMultiCopy、systemWideAtomics、streamOrderedAllocationIPC、simpleCUBLASXT、simpleVulkan、vulkanImageCUDA等。
2.2 CUDA 13.0:Driver API 与 Runtime API 签名升级
除cudaDeviceProp外,CUDA 13.0 还升级了三个核心 API 签名:
(1)cuCtxCreate→cuCtxCreate_v4:新增CUctxCreateParams参数。公共头文件 nvrtc_helper.h 中loadCUBIN的实现即为标准迁移样板——先初始化空的CUctxCreateParams ctxCreateParams = {},再传入cuCtxCreate:
CUctxCreateParams ctxCreateParams = {}; ... checkCudaErrors(cuInit(0)); checkCudaErrors(cuCtxCreate(&context, &ctxCreateParams, 0, cuDevice));受影响的示例包括 Driver API 系列matrixMulDrv、simpleTextureDrv、vectorAddDrv、vectorAddMMAP、memMapIPCDrv,以及7_libNVVM下的cuda-c-linking、device-side-launch、simple、uvmlite等。
(2)cudaGraphAddNode/cudaStreamGetCaptureInfo→_v2/_v3:新增cudaGraphEdgeData指针参数。以 graphConditionalNodes.cu 为例,cudaGraphAddNode的调用模式为传入 NULL 依赖数组与边数据指针:
checkCudaErrors(cudaGraphAddNode(&kernelNode, graph, NULL, NULL, 0, ¶ms)); checkCudaErrors(cudaGraphAddNode(&conditionalNode, graph, &kernelNode, NULL, 0, &cParams));(3)cudaMemAdvise/cudaMemPrefetchAsync→_v2:int device参数改为cudaMemLocation location。涉及conjugateGradientMultiDeviceCG与UnifiedMemoryPerf两个多 GPU 内存管理示例。
2.3 CUDA 13.0:cuFFT 错误码重构
cuFFT 弃用了CUFFT_INCOMPLETE_PARAMETER_LIST、CUFFT_PARSE_ERROR、CUFFT_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 相关路径失败。受影响示例为simpleCUFFT、simpleCUFFT_2d_MGPU、simpleCUFFT_MGPU、simpleCUFFT_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,各示例定位如下:
| 示例 | 技术要点 |
|---|---|
helloTile | Tile 内核基础:启动方式与 SIMT/Tile 内核间经全局内存传数据 |
tileVectorAdd | 用cuda::tiles::partition_view将数据切分为 1024 元素块,掩码加载/存储处理越界尾块 |
tileTranspose | 分块矩阵转置:块内加载→本地转置→写入目标位置 |
tileMatmul | FP16 输入 + 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覆盖):
cubDeviceFind:cub::DeviceFind::FindIf、LowerBound、UpperBound设备级查找算法;cubDeviceSegmentedScan:ExclusiveSegmentedSum与带自定义二元算子的InclusiveSegmentedScan;cubDeviceTransform:操作符返回cuda::std::tuple的 N-to-Mcub::DeviceTransform::Transform;libcuxxRandom:cuda::pcg64与cuda::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/):cudaComputeLambdas与binarySearch两个示例。根据 cudaComputeLambdas/README.md,cuda.compute(来自cuda-cccl包)接受纯 Python 可调用对象(含 lambda)作为算子,内部通过 Numba 将算子 JIT 编译为 LTO-IR 供设备端执行,覆盖reduce_into、unary_transform、inclusive_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_Introduction | c++11_cuda | 过时 |
concurrentKernels | 过时 | |
cppIntegration | 过时 | |
cppOverload | 过时 | |
simpleSeparateCompilation | 过于简单 | |
simpleTemplates_nvrtc | 与simpleTemplates冗余 | |
simpleVoteIntrinsics_nvrtc | 与simpleVoteIntrinsics冗余 | |
2_Concepts_and_Techniques | cuHook | 与现代glibc不兼容 |
4_CUDA_Libraries | batchedLabelMarkersAndLabelCompressionNPP | 库中部分功能被移除 |
5_Domain_Specific | fluidsD3D9、simpleD3D9、simpleD3D9Texture、simpleD3D10、simpleD3D10RenderTarget、simpleD3D10Texture、SLID3D10Texture、VFlockingD3D10 | 遗留 Direct3D 9/10 互操作示例 |
8_Platform_Specific/Tegra | nbody_screen、simpleGLES_screen | 暂移出,待 QNX 更新 |
同一版本还把 12 个 Tegra 专属示例(EGLSync_CUDAEvent_Interop、cuDLAErrorReporting、cuDLAHybridMode、cuDLALayerwiseStatsHybrid、cuDLALayerwiseStatsStandalone、cuDLAStandaloneMode、cudaNvSciBufMultiplanar、cudaNvSciNvMedia、fluidsGLES、nbody_opengles、simpleGLES、simpleGLES_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_sync与cooperative_groups::reduce两个新内核; - 异步拷贝与屏障(CUDA 11.0):
globalToShmemAsyncCopy(CC 8.0+ 全局到共享内存异步拷贝)、simpleAWBarrier(arrive-wait 屏障); - 流顺序内存分配(CUDA 11.2):
streamOrderedAllocation、streamOrderedAllocationP2P,演示cudaMallocAsync与cudaMemPoolAPI 族; - 图内存节点(CUDA 11.5):
graphMemoryNodes(图内内存分配/释放)、graphMemoryFootprint(虚拟地址与物理内存复用); - cuDLA 系列(CUDA 11.5):
cuDLAHybridMode、cuDLAStandaloneMode、cuDLAErrorReporting; - 其他:
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):
simpleVulkan、simpleD3D12、vulkanImageCUDA、EGLStream_CUDA_Interop、simpleD3D11(外部资源互操作 + Keyed Mutex 同步)、simpleDrvRuntime(Driver 与 Runtime API 协同加载 fatbinary); - 内存映射(10.2):
vectorAddMMAP、memMapIPCDrv,演示cuMemMap物理属性指定与 IPC; - NPP/cuSolver/cuRAND(10.1~10.2):
boxFilterNPP、cannyEdgeDetectorNPP、watershedSegmentationNPP(10.1 Update 1)、cuSolverDn_LinearSolver、cuSolverSp_LinearSolver(LU/QR/Cholesky 分解)、MersenneTwisterGP11213、nvJPEG/nvJPEG_encoder; - 性能与系统(10.0/10.1):
p2pBandwidthLatencyTest、UnifiedMemoryPerf、systemWideAtomics、reduction(数据并行优化策略集合); - 平台支持:10.1 Update 1 起支持 Visual Studio 2019,10.0 起放弃 Visual Studio 2010。
六、CUDA 9.2:GitHub 首版与长期保留的经典示例
CUDA 9.2 是 CUDA Samples 在 GitHub 的首个发布版本,CHANGELOG 列出的首批示例中,相当一部分至今仍保留在仓库中(如matrixMul、simpleCUBLAS、simpleCUFFT、deviceQuery),另一些则演变为后续示例的源头:
- 入门类:
vectorAdd_nvrtc(NVRTC 运行时编译)、deviceQuery(设备属性枚举); - 矩阵乘:
matrixMul(共享内存分块)、matrixMulDrv(Driver API 版本)、cudaTensorCoreGemm(Volta 张量核心 WMMA); - 同步原语(CUDA 9.0 引入的
_sync版本):simpleVoteIntrinsics(vote intrinsics)、shfl_scan(shuffle intrinsics); - 协作组与求解器:
conjugateGradientMultiBlockCG、conjugateGradientMultiDeviceCG(多设备协作组 + 统一内存预取与使用提示 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 迁移速查表
| API | CUDA 13.0 变化 | 受影响示例 |
|---|---|---|
cudaDeviceProp.clockRate等 5 个字段 | 改查cudaDeviceGetAttribute | deviceQuery等 10 余个 |
cuCtxCreate | 新增CUctxCreateParams参数(cuCtxCreate_v4) | matrixMulDrv、nvrtc_helper.h等 15 处 |
cudaGraphAddNode/cudaStreamGetCaptureInfo | 新增cudaGraphEdgeData参数(_v2/_v3) | graphConditionalNodes |
cudaMemAdvise/cudaMemPrefetchAsync | int device→cudaMemLocation | conjugateGradientMultiDeviceCG、UnifiedMemoryPerf |
thrust::identity<uint>() | 替换为cuda::std::identity() | segmentationTreeThrust |
| cuFFT 错误码 | 弃用 3 个、新增 4 个 | helper_cuda.h与 4 个 FFT 示例 |
7.2 构建与分发注意事项
- 构建系统:CUDA 12.8 起仅支持 CMake(最低 3.20),Visual Studio 工程与 Makefile 已移除;
- MSVC 用户:CUDA 13.2 起必须开启
-Xcompiler=/Zc:preprocessor,否则 CCCL 相关代码直接构建失败; - Windows 依赖:FreeImage 自 CUDA 11.2 起不再随示例分发,需按 README.md 的 Dependencies 章节手动配置;
- Python 示例:不纳入 CMake 构建,按示例目录内的 requirements.txt 安装依赖后独立运行;
- Tegra 交叉编译:CUDA 12.9/13.0 持续更新 Tegra Linux/QNX 交叉编译工具链,相关配置见 cmake/toolchains/;
- 示例获取方式:自 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),仅供参考