# CUDATutorial **Repository Path**: babakara/cudatutorial ## Basic Information - **Project Name**: CUDATutorial - **Description**: cuda tutorial 总结和收集 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-11 - **Last Updated**: 2026-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README CUDA教程 多查官方手册 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html?highlight=dim3#dim3 # cpp开发,一定要安装clangd 要不没有智能补全和提示,自定义函数也跳转不了,吐了。 一定要卸载微软的C++ intelligent之类的,只安装clangd。就可以函数跳转、智能补全了。 clangd不识别cuda的编译指令 根目录创建.clangd文件,然后填写下面的,可以避免这个报错。 ```.clangd CompileFlags: Add: - --cuda-path=/usr/local/cuda - --cuda-gpu-arch=sm_86 Remove: - "-forward-unknown-to-host-compiler" - "--generate-code=*" ``` # install CUDA toolkit for WSL Ubuntu 官网建议WSL不要安装驱动,不要使用默认安装方式,使用WSL专用的CUDA套件 ```terminal cuda_13.2.0_595.45.04_linux.run cudatutorial root@zzx:/home/catdog/WorkSpace# ./cuda_13.2.0_595.45.04_linux.run =========== = Summary = =========== Driver: Not Selected Toolkit: Installed in /usr/local/cuda-13.2/ Please make sure that - PATH includes /usr/local/cuda-13.2/bin - LD_LIBRARY_PATH includes /usr/local/cuda-13.2/lib64, or, add /usr/local/cuda-13.2/lib64 to /etc/ld.so.conf and run ldconfig as root To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-13.2/bin ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 595.00 is required for CUDA 13.2 functionality to work. To install the driver using this installer, run the following command, replacing with the name of this run file: sudo .run --silent --driver Logfile is /var/log/cuda-installer.log root@zzx:/home/catdog/WorkSpace# ``` add path to ./bashrc Then, source ~/.bashrc # 使用CMAKE管理cpp cu混合程序 教程连接[知乎教程 link](https://zhuanlan.zhuhu.com/p/701581020) 示例见本project的beginner folder 使用WSL更好开发,这个项目使用的WSL。 使用12.5版本的CUDA Toolkit 可以正常运行,如果使用最新的13.2会出现兼容性问题,导致各种运行报错,但编译正常,建议开发持续使用12.5版本。 # 使用Windows cuda vscode msvc进行开发环境配置教程 [知乎的配置教程 link](https://zhuanlan.zhihu.com/p/1905402464343164063) 其中Path中配置好了CUDA路径之后,cmake ..就可以了 然后ctrl+shift+P,配置CPP文件如下, 增加路径,要不然CMAKE 找不到 CUDA ```json { "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "${vcpkgRoot}/x64-windows/include", "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.2/bin", "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v13.2/bin/x64" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ] } ], "version": 4 } ``` # NVIDIA cpp support version 11 14 17(nvcc>11.0) # NVIDIA official Guide 官方教程 [英伟达 官方 手册 link](https://docs.nvidia.com/cuda/cuda-programming-guide/02-basics/intro-to-cuda-cpp.html) [英伟达 技术博客 link](https://developer.nvidia.cn/blog/even-easier-introduction-cuda-2/) ## 查看耗时 ```bash nsys profile --trace=cuda,nvtx,osrt -o report ./main nsys-ui report.nsys-rep ``` 在GUI下面的stats中可以找到kernel CUDA运行时间 确实一般很短,不到1ms,大量时间在初始化和内存分配。 只是因为: kernel 太小、执行太快 Unified Memory 数据少 默认 nsys_easy 脚本只捕获 CUDA API 所以 Nsight Systems 没有 GPU kernel 数据。 # GPU硬件知识 好的,我们来系统梳理一下 **CUDA 设备的核心数、SM 数量、每个 SM 最大线程块数** 的关系和区别,我会尽量清楚又精炼,同时结合 RTX 3050(你正在用的 GPU)举例。 --- ## 1️⃣ 基本概念 ### 1. **SM(Streaming Multiprocessor)** * GPU 的基本计算单元,相当于 CPU 的 “核心组”。 * 一个 SM 内部有多个 CUDA 核心(CUDA cores)。 * SM 内部共享: * 寄存器文件(registers) * 共享内存(shared memory) * 调度器(warp scheduler) **RTX 3050 Ti Laptop GPU 举例**: * 20 SM * 每个 SM 有 64 CUDA cores * 所以总 CUDA core 数 = 20 × 64 = 1280 cores ### 2. **CUDA Core** * SM 内部的实际算术逻辑单元(ALU)。 * 执行线程的实际计算。 * 每个 CUDA core 可以同时执行一个线程中的一个标量操作(加减乘除等)。 --- ### 3. **线程(Thread)和线程块(Thread Block)** * **线程(Thread)**:GPU 上执行的最小计算单元。 * **线程块(Thread Block)**:一组线程被分配到同一个 SM 上。 * **一个 SM 可以同时承载多个线程块(Block)**。 * **每个线程块内线程数量**由你在 kernel launch 时指定(通常 32 的倍数)。 --- ### 4. **每个 SM 的最大线程块数量 vs 最大线程数** SM 资源限制决定了: * 每个 SM 同时最多可以容纳多少个线程块(Thread Block) * 每个 SM 最大线程数(threads per SM) * 每个线程块最大线程数(threads per block) | 参数 | RTX 3050 Ti (Ampere) 参考 | | ------------ | ----------------------- | | 每个 SM 最大线程数 | 1024 threads | | 每个 SM 最大线程块数 | 32 blocks | | 每个线程块最大线程数 | 1024 threads | | 每个 warp 大小 | 32 threads | --- ## 2️⃣ 关系总结 1. **核心数 (CUDA cores)** * SM 内部实际算数运算单元数量 * 决定 **同一时间可以真正执行多少线程的标量操作** * 举例:1 个 SM 64 cores → 同一时刻 64 threads 在计算(warp 级别会时间片轮转) 2. **SM 数量** * 决定 GPU 可以 **并行运行多少线程块** * SM 内部的资源限制决定每个 SM 可以同时运行多少 threads / blocks 3. **每个 SM 最大线程块数** * **上限**:一个 SM 内部最多能容纳多少个 block * 线程数上限 = min(SM 最大线程数, 线程块数 × 每块线程数) 4. **每个线程块最大线程数** * **上限**:单个 block 内部最多线程数 * 通常 1024 threads/block --- ### 3️⃣ 例子(RTX 3050 Ti,Ampere 架构) 假设 kernel launch: ```cpp dim3 threadsPerBlock(256); dim3 numBlocks(80); // 总共 80 block myKernel<<>>(...); ``` * 每个 block 256 threads * 每个 SM 可以同时容纳最多 32 blocks(限制) * 每个 SM 最大线程数 1024 → 256 threads/block × 4 blocks = 1024 threads → 刚好满载 SM > 如果你把 block 数改大(比如 1000 blocks),GPU 会 **排队执行**,一个 SM 同时最多 32 block,在资源允许下轮流调度。 --- ### 4️⃣ 直观理解 * **SM = GPU 上的 “多核心计算单元组”** * **CUDA cores = SM 内的 ALU**,执行每个 thread 的计算 * **线程块数量** = kernel 分成的组 → SM 内线程资源分配单元 * **每块线程数** = 每个线程块内线程数量 → warp 切分粒度 --- ### 5️⃣ 核心公式 **每个 SM 最大线程数公式**: [ \text{Max threads per SM} = \min(\text{threads/block} \times \text{max blocks per SM}, \text{SM resource limits}) ] **总 GPU 最大并行线程数**: [ \text{Max threads GPU} = \text{threads per SM} \times \text{num SMs} ] **每个 block 内线程数量 ≤ 1024** **每个 SM 内最大线程块数量 ≤ 32 (Ampere)**