CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的并行计算平台与编程模型,通过 C/C++ 语言扩展将 GPU 的数千个流处理器暴露给通用计算任务。它解决的核心问题是:CPU 受功耗墙和频率墙限制,核心数有限,无法满足深度学习训练、科学计算、数据处理等场景的海量并行计算需求。CUDA 让开发者用接近 C 的语法编写内核函数(Kernel),在 GPU 上以单程序多数据(SPMD)模式运行,并配套 cuBLAS、cuDNN、NCCL 等高度优化的函数库。它的生态成熟度使其成为 AI 与高性能计算(HPC)领域的事实标准:PyTorch、TensorFlow、JAX 的默认 GPU 后端均构建于 CUDA 之上。本篇从安装配置、最小示例、核心机制、生产部署到选型对比,按工程实践路径完整覆盖 CUDA 上手过程。

岗位关联

掌握 CUDA 能让你理解 GPU 计算的底层运行机制,是诊断 AI 训练环境问题、优化模型性能、从事高性能计算方向的必备技能。

目录
  1. 为什么需要 CUDA:CPU 算力瓶颈 → 大规模并行计算
  2. 安装与环境配置:3 步就绪
  3. 快速上手:15 分钟跑通向量加法示例
  4. 核心能力详解:4 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
GPU 并行计算平台与编程模型(专有)
开发商
NVIDIA
开源协议
专有(免费使用,含 EULA)
GitHub Stars
无
主要语言
C/C++(支持 Fortran、Python 绑定)
当前版本
13.0(2025-08)
安装方式
runfile / deb / rpm / conda / pip
上手难度
★★★★☆(较难)
适合人群
AI 工程师、HPC 开发者、系统性能工程师
同类工具
ROCm(AMD)、oneAPI(Intel)、OpenCL
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 CUDA:CPU 算力瓶颈 → 大规模并行计算

传统 CPU 以延迟优化为核心,主频受功耗墙限制在 5GHz 以内,单颗服务器 CPU 仅有几十个核心,适合任务级并行和复杂控制流,但在“同时对海量数据做同一种运算”的场景中吞吐严重不足。深度学习中的矩阵乘法、卷积,科学计算中的分子动力学、气象模拟,本质上都是数据并行任务,每秒钟需要执行数十亿次独立浮点运算。用 CPU 运行这类任务,要么等几十个小时,要么堆上千台服务器,成本和能耗都不可接受。

CUDA 将 GPU 变成可编程的通用并行处理器:一块数据中心 GPU(如 H100)拥有上万个 CUDA 核心,通过把问题分解为大量线程并交给硬件调度,用并行换吞吐。开发者用 __global__ 声明内核函数,用 <<<grid, block>>> 语法配置线程规模,编译器将 C 代码编译为 GPU 指令。与 OpenCL、ROCm 等同类方案相比,CUDA 的最大差异是生态深度:深度学习框架的官方预编译包默认面向 CUDA,cuDNN 对卷积的优化、NCCL 对多卡通信的优化都是其余方案难以匹敌的。对 AI 从业者而言,即使不直接编写内核,理解 CUDA 也是排查"CUDA out of memory""driver version is too old"这类日常环境问题的前提。

安装与环境配置:3 步就绪

步骤一·安装驱动与检查硬件。CUDA 工具包(Toolkit)依赖 NVIDIA 驱动,新驱动兼容旧版 CUDA,但新版 CUDA 要求最低驱动版本。先执行 nvidia-smi 确认驱动可用及显存状态,用 lspci | grep -i nvidia 确认 GPU 型号。

步骤二·安装 CUDA Toolkit。以 Ubuntu 22.04 为例,通过 NVIDIA 官方 apt 源安装(同时适用于 24.04,需将 URL 中 ubuntu2204 替换为 ubuntu2404);Windows 用户直接从下载页获取安装器,勾选 CUDA 与 Visual Studio 集成即可。

步骤三·配置环境变量并验证。将 nvcc 加入 PATH,使 shell 可直接调用编译器;LD_LIBRARY_PATH 指向 lib64 使程序运行时能找到 CUDA 动态库。

bash16 行
# 1. 检查 GPU 与驱动nvidia-smilspci | grep -i nvidia # 2. 用官方 apt 源安装 CUDA 13.0(以 Ubuntu 22.04 为例)wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.debsudo dpkg -i cuda-keyring_1.1-1_all.debsudo apt-get updatesudo apt-get install -y cuda-toolkit-13-0 # 3. 配置环境变量(追加到 ~/.bashrc)export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH # 4. 验证nvcc --version

快速上手:15 分钟跑通向量加法示例

最小可用流程是“把数据拷入显存 → 启动内核 → 拷回结果”。向量加法没有数据依赖,是体现线程并行的最简例子。要点在于:主函数(host code)运行在 CPU 上,负责内存分配与拷贝;__global__ 内核函数运行在 GPU 上,每个线程计算一个元素的下标 blockIdx.x * blockDim.x + threadIdx.x。保存为 vecAdd.cu,用 nvcc 编译后运行;若输出 c[0]=3.0 与 c[1048575]=3.0 即成功。进阶技巧:用 cudaMallocManaged 统一内存可省去手动拷贝,但首次访问会触发页面迁移,生产代码仍以显式拷贝为主。

编译运行:

cuda33 行
#include <cstdio>#include <cuda_runtime.h> __global__ void vecAdd(float *a, float *b, float *c, int n) {    int i = blockIdx.x * blockDim.x + threadIdx.x;    if (i < n) c[i] = a[i] + b[i];} int main() {    int n = 1 << 20;    size_t bytes = n * sizeof(float);    float *h_a = new float[n], *h_b = new float[n], *h_c = new float[n];    for (int i = 0; i < n; i++) { h_a[i] = 1.0f; h_b[i] = 2.0f; }     float *d_a, *d_b, *d_c;    cudaMalloc(&d_a, bytes);    cudaMalloc(&d_b, bytes);    cudaMalloc(&d_c, bytes);    cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);    cudaMemcpy(d_b, h_b, bytes, cudaMemcpyHostToDevice);     int threads = 256;    int blocks = (n + threads - 1) / threads;    vecAdd<<<blocks, threads>>>(d_a, d_b, d_c, n);    cudaDeviceSynchronize();     cudaMemcpy(h_c, d_c, bytes, cudaMemcpyDeviceToHost);    printf("c[0]=%f c[%d]=%f\n", h_c[0], n - 1, h_c[n - 1]);     cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);    delete[] h_a; delete[] h_b; delete[] h_c;    return 0;}
bash2 行
nvcc -O2 -arch=sm_80 vecAdd.cu -o vecAdd./vecAdd

核心能力详解:4 大支柱

支柱一·线程层次结构。CUDA 的执行模型分为 grid、block、thread 三级:一次内核启动创建 1 个 grid,grid 内多个线程块(block),block 内包含成百上千个线程。blockIdx、threadIdx、blockDim 三个内建变量用于索引定位。block 内线程可通过 __syncthreads() 同步,但同一内核不同 block 之间无法直接同步——这是网格级协作需拆分为多个内核的原因。

支柱二·内存层次与访存优化。按速度从快到慢依次为:寄存器(线程私有)、共享内存(block 内共享,延迟约为全局内存的 1/10)、全局内存(所有线程可见)。优化的两条主线:一是合并访问,让同一 warp(32 个线程的调度单位)内线程访问连续地址,使每次访存事务满载;二是用共享内存复用数据,减少对全局内存的重复读取。

支柱三·流(Stream)与并发执行。默认内核启动在默认流上串行执行。将独立任务放入不同流(cudaStreamCreate),GPU 可在资源允许时并发执行多个内核,并让数据拷贝与计算重叠(overlap),从而隐藏 PCIe 传输延迟。这是提高 GPU 利用率的关键手段。

支柱四·数学库生态。cuBLAS 提供 BLAS 线性代数例程、cuDNN 提供深度学习卷积/归一化等原语、NCCL 提供多 GPU 集合通信、TensorRT 提供推理优化。这些库由 NVIDIA 针对各代架构手工调优,绝大多数场景应优先调用库函数而非自行编写内核。

生产部署与监控:从上线到运维

容器化部署。官方推荐使用 NVIDIA NGC 容器镜像(如 nvcr.io/nvidia/pytorch:24.09-py3),镜像内已预制 CUDA、cuDNN 与框架。宿主机需安装 nvidia-container-toolkit 并配置 Docker runtime,容器内调用 nvidia-smi 验证 GPU 可见。这样做到训练环境与底层驱动解耦:升级 CUDA 工具包只需拉取新镜像,不影响宿主环境。

性能分析。内核级性能用 Nsight Compute(ncu)分析占用率、访存吞吐、指令瓶颈;系统级时间线用 Nsight Systems(nsys)分析数据拷贝、内核启动、流重叠情况。旧工具 nvprof 已废弃,新项目直接使用 Nsight 系列。分析产出以“耗时占比”“带宽利用率”等量化指标为准,而不是凭经验猜测。

可观测性。生产环境用 nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv -l 5 周期采集利用率、显存,用 DCGM(NVIDIA 数据中心 GPU 管理器)做大规模机群监控。GPU 利用率低不一定是代码差,可能是数据加载(DataLoader 瓶颈)或 CPU 预处理过慢,需结合时间线分析。

<p class="para-label">避坑清单:</p>

<ul class=“dash-list“><li>驱动与 CUDA 版本不匹配:新版 CUDA 要求最低驱动版本,驱动过旧会在运行时(而非安装时)报错。先 nvidia-smi 看驱动版本,再对照官方兼容表选择 CUDA 版本。</li><li>nvcc 版本 ≠ 运行时版本:nvcc -V 显示编译工具链版本,运行时版本由驱动决定。用 cudaRuntimeGetVersion 与 cudaDriverGetVersion 分别查询,两者不一致是导致”编译通过、运行报错“的常见原因。</li><li>不检查 CUDA API 返回值:内核启动是异步的,错误在 cudaGetLastError() 或后续同步调用时才暴露。生产代码必须检查每个 API 的返回码,否则出错时只会得到”CUDA error: unknown error”这类无效线索。</li></ul>

维度CUDA(NVIDIA)ROCm(AMD)oneAPI(Intel)OpenCL(Khronos)
定位NVIDIA GPU 专有并行平台AMD GPU 开源计算平台Intel 统一编程框架跨厂商通用并行计算标准
编程模型CUDA C++ 扩展HIP(类 CUDA C++)SYCL / DPC++C99 内核语言
硬件支持仅 NVIDIA GPU主要 AMD GPU 和 CDNA 架构主要 Intel GPU/CPU多厂商 GPU、CPU、FPGA
性能表现NVIDIA 硬件上最优,库手工调优AMD 硬件上接近原生Intel 数据中心 GPU 上较优通用性高但优化深度有限
生态成熟度最高,PyTorch/TF 默认构建目标PyTorch 有 ROCm 分支,生态增长中TensorFlow 实验支持,生态早期无主流深度学习框架原生首选
学习曲线陡:线程/内存/同步模型较陡:类 CUDA,CUDA 经验可迁移中等:标准 C++ 并行化中等:概念多但底层抽象高
License专有免费(EULA)开源(MIT)开源(Apache 2.0)免版税开放标准
适合谁NVIDIA 生态 AI/HPC 开发者AMD 计算中心、避 NVIDIA 依赖者Intel 平台、异构未来迁移考量者学术研究、跨平台可移植性优先者

选型建议:AI 训练与推理场景首选 CUDA——深度学习框架预编译包、容器镜像、云 GPU 实例全部围绕 CUDA 构建,迁移成本为零。ROCm 适合已采购 AMD 计算卡且不希望绑定 NVIDIA 的机构;oneAPI 与 OpenCL 适合多厂商硬件统一编程,但需要接受生态成熟度和性能优化深度的差距。

版本迭代

CUDA 的版本演进与 NVIDIA GPU 架构强绑定,每代架构发布伴随新 CUDA 版本:Ampere(A100)对应 11.x,Hopper(H100)对应 12.x,Blackwell(B200/RTX 50 系)对应 13.x。围绕迭代的主线是新增硬件指令支持、编译器优化与数学库扩展。

版本时间变化提升
CUDA 11.02020-05Ampere 架构支持引入 MIG(多实例 GPU)、NVLink 3,编译工具链重写为 NVVM
CUDA 11.82022-11Hopper 架构初支持计算能力 sm_90、NVSwitch 多卡互联、cuBLAS/cuDNN 更新
CUDA 12.02022-12全面 Hopper 支持线程块集群(Thread Block Cluster)、CUDA C++ 标准库增强、移除旧平台依赖
CUDA 12.42024-02Blackwell 早期准备新架构 API 预置、编译时间优化、Python 绑定改进
CUDA 12.82025-01工具链强化编译器与 Nsight 工具集更新、新硬件兼容性增强
CUDA 13.02025-08Blackwell 全面支持计算能力 sm_120(RTX 50 系)、统一内存访问改进、库深度优化
结论

CUDA 版本必须与硬件算力和驱动匹配:持有 A100 的用户停留在 CUDA 11.x/12.x 即可,Blackwell 用户应升级到 13.0。升级 CUDA 前先确认框架版本兼容性(PyTorch 的 CUDA 版本后缀如 cu121/cu124 对应其编译时的 CUDA 版本),不必追求“最新”,稳定匹配优先。

AI 应用场景

深度学习训练与推理加速

阶段:模型训练、推理部署

解决的问题:GPU 是深度学习的算力基石。训练期间的矩阵乘法、卷积、归一化由 cuDNN/cuBLAS 在 GPU 上高效执行;推理阶段 TensorRT 对模型做层融合、精度校准(INT8/FP16)进一步提速。若不理解 CUDA 的线程与显存模型,很难定位 OOM、显存泄漏和吞吐瓶颈。

具体案例:NVIDIA 官方宣称,面向并行化友好的计算负载,GPU 相对 CPU 可实现 100 倍以上加速;LLM 训练场景中 H100 搭配 CUDA 12.x 的 FP8 支持,使同一模型的训练吞吐较上一代(A100/FP16)提升约 2-3 倍(NVIDIA 官方架构数据)。

高性能科学计算与仿真

阶段:数值计算核函数开发、HPC 集群部署

解决的问题:分子动力学、流体力学、气象预报等任务包含大量无依赖的粒子/网格计算,CPU 串行模拟需数周。CUDA 将每个粒子映射为一个线程,配合共享内存做邻近粒子缓存,将时间步迭代缩短到天级。统一内存(Unified Memory)简化了复杂数据结构的 CPU-GPU 数据传输。

具体案例:NVIDIA 与高校合作的项目中,分子动力学模拟在 GPU 集群上相对 CPU 集群获得数量级加速(Amber/NAMD 等主流软件的官方 GPU 版说明均以“数十倍提速”为标称效果)。

数据预处理与数据分析加速

阶段:数据工程、特征工程

解决的问题:Pandas 单线程处理数亿行结构化数据耗时以分钟计,成为训练流水线瓶颈。RAPIDS 生态(cuDF、cuML)基于 CUDA 将 DataFrame 操作并行化,加载到 GPU 后完成过滤、聚合、join 再导出,省去 CPU 侧反复拷贝。

具体案例:RAPIDS 官方宣称 cuDF 在 GPU 上相对 pandas 可实现 10-100 倍加速(依算子与数据量而定),典型 ETL 任务从小时级降到分钟级;与 PyTorch 配合时以 GPU 张量直通训练,避免落盘。

常见误区

误区装 CUDA 一定要装最新版,13.0 肯定比 12.4 快。

正解CUDA 工具包向后兼容,但新版本要求更高的最低驱动版本,且 PyTorch、cuDNN 等依赖库是按特定 CUDA 版本编译的。框架官方发布的 wheel 后缀(如 cu121、cu124)标注其编译时的 CUDA 版本,运行时只需驱动满足要求,不必与框架编译版本完全一致。升级前先查驱动版本、框架支持矩阵、硬件架构(架构过老时新版本可能不再生成对应 SASS)。

为何常见:普通软件“新版更快”的直觉被套用到 CUDA。实际上 CUDA 的性能主要由硬件架构和库实现决定,新版本的主要收益是支持新硬件。

误区`nvcc -V` 显示 13.0,就认为运行环境是 13.0。

正解nvcc 是编译工具链,其版本只代表编译时使用的工具包;程序实际运行时使用的是驱动提供的运行时库(driver 版本决定 CUDA Runtime 兼容范围)。两者可能不一致:用 12.x 工具包编译的程序可以在 13.0 驱动上跑,反之则可能不行。排查运行时错误用 cudaRuntimeGetVersion() / cudaDriverGetVersion() 查询真实版本。

为何常见:nvcc -V 是安装后最容易执行的验证命令,给人“环境就绪”的错觉,掩盖了 driver 与 toolkit 分离的架构。

误区CUDA 是标准 GPU 语言,AMD/Intel 显卡也能运行。

正解CUDA 专属于 NVIDIA GPU,从驱动、编译器(nvcc)到运行时库均为 NVIDIA 闭源实现。AMD 的对应方案是 ROCm(HIP 语言,语法与 CUDA 高度相似),Intel 是 oneAPI/SYCL。跨厂商迁移需将 CUDA 内核改写为 HIP(有 hipify 工具可做大部分自动转换)或使用 SYCL 这类开放标准,但生态和性能不可直接类比。

为何常见:CUDA 名词普及度高,许多人将其与“GPU 编程”画等号,忽略了它与硬件强绑定的商业模式。

误区写好 kernel 就万事大吉,CPU 与 GPU 之间拷贝数据很快。

正解PCIe 传输带宽(约 32GB/s,PCIe 5.0 x16)远低于显存带宽(H100 约 3.35TB/s),一次大数据拷贝可能比核函数本身还慢。正确的做法是:尽可能在 GPU 上完成整条计算链(用 cuBLAS/cuDNN 等库避免反复拷贝)、用流(Stream)让拷贝与计算重叠、或使用统一内存减少显式 memcpy 但接受页面迁移开销。

为何常见:初学时最小示例(向量加法)里拷贝数据占比不明显,掩盖了真实负载中“计算 1 秒、拷贝 10 秒”的经典性能陷阱。

误区把 block 数开到最大,GPU 就跑得最快。

正解GPU 性能取决于占用率(occupancy)与计算/访存密度,而非单纯线程数量。单 block 线程数上限 1024,block 数上限 2^31-1;线程过多时寄存器溢出到 local memory(实际落在全局内存)反而严重变慢。合理的启动配置需结合寄存器用量、共享内存大小、目标架构计算理论占用率,并用 ncu 实测 SM 活跃度。实践中常用 128-512 线程/block,再按问题规模算 block 数。

为何常见:线程是软件抽象、SM 资源是硬件上限,误以为“无限线程 = 无限并行”,忽略了寄存器文件和调度带宽的物理约束。

面试题

Q1. CUDA 执行模型中,grid、block、thread 三者的关系是?

单选题 · easy

  • A.一个 kernel 对应多个 grid,grid 含 block,block 含 thread
  • B.一次内核启动对应一个 grid,grid 含 block,block 含 thread← 正确答案
  • C.thread 组成 grid,grid 组成 block,thread 为最小编程单位
  • D.block 固定为 256 线程,grid 与 thread 不存在层级关系

答案:B。一次内核启动(<<<...>>>)对应一个 grid;grid 由多个 block 组成,block 由多个 thread 组成。A 中“一个 kernel 对应多个 grid”错误;C 的层级倒置;D 中 block 大小由开发者配置,无固定值。

Q2. 下列哪种内存的访问延迟最低?

单选题 · easy

  • A.全局内存(global memory)
  • B.共享内存(shared memory)
  • C.寄存器(register)← 正确答案
  • D.常量内存(constant memory)

答案:C。寄存器是每个线程私有的物理存储单元,访问无延迟,是最快的内存;共享内存是 block 内共享的可编程缓存,延迟数十周期;全局内存和常量内存都要经过显存层级,延迟数百周期。编程时应优先复用寄存器。

Q3. 环境变量 PATH 中需要加入 CUDA 的 bin 目录,主要目的是?

单选题 · easy

  • A.使 shell 可直接找到 nvcc 编译器← 正确答案
  • B.使 nvidia-smi 命令能够正常输出
  • C.使 GPU 驱动程序开机自动加载
  • D.使 Python 能自动导入 CUDA 模块

答案:A。nvcc 是 CUDA 编译器,只有将其所在目录(默认 /usr/local/cuda/bin)加入 PATH 才能直接执行。nvidia-smi 位于 /usr/bin 或 /usr/lib/nvidia,与 CUDA 安装无关;驱动加载由内核模块完成;Python 导入 CUDA 模块依赖库路径而非 PATH。

Q4. nvcc 编译参数 -arch=sm_80 的含义是?

单选题 · mid

  • A.为计算能力 8.0(Ampere)生成 SASS 指令← 正确答案
  • B.限制内核最多执行 80 个线程
  • C.要求宿主编译器版本不低于 8.0
  • D.指定使用 CUDA 8.0 的运行时库

答案:A。sm_XX 中的 XX 是 NVIDIA GPU 的计算能力(Compute Capability),sm_80 对应 Ampere 架构(A100)。该参数让编译器生成针对该架构优化的 SASS 指令,同时决定 PTX 兼容性。它不限制线程数、不约束编译器版本,也与 CUDA 版本号无关。

Q5. 关于统一内存(Unified Memory / cudaMallocManaged),正确的说法是?

多选题 · mid

  • A.让 CPU 与 GPU 共享同一虚拟地址空间← 正确答案
  • B.免去手工 cudaMemcpy,但仍有页面迁移开销← 正确答案
  • C.任何场景下性能均优于显式内存拷贝
  • D.适合访存数据量小且追求代码简洁的场合← 正确答案

答案:ABD。统一内存的核心是统一虚拟地址空间,CPU/GPU 通过同一指针访问数据,省去显式拷贝的样板代码。但其性能依赖页面迁移:数据在 CPU 与 GPU 间按需迁移,频繁交替访问会显著退化,因此并非总是优于显式拷贝。在小数据量或访问模式简单的场景,它能显著简化代码。

Q6. __syncthreads() 的作用是?

单选题 · mid

  • A.同步同一 grid 内的所有线程
  • B.同步同一 block 内的所有线程← 正确答案
  • C.同步同一 warp 内的所有线程
  • D.同步 CPU 与 GPU 之间的操作

答案:B。__syncthreads() 是 block 级屏障(barrier),保证同一 block 内所有线程执行到该点后才继续,常用于共享内存写入后再读取的场景。它不能跨 block 同步;warp 内线程天然按锁步(lockstep)执行无需显式同步;CPU 与 GPU 同步应使用 cudaDeviceSynchronize。

Q7. kernel 启动是异步的,获取启动错误正确的方式是?

单选题 · hard

  • A.读取 kernel 函数的返回值
  • B.调用 cudaGetLastError 获取错误码← 正确答案
  • C.在 kernel 内部用 printf 打印状态
  • D.让 CPU 线程 sleep 数毫秒后再继续

答案:B。kernel 返回类型必须为 void,A 不可行;启动错误(如配置越界)在异步启动时不会直接抛出,而是记录在错误状态中,需调用 cudaGetLastError() 获取,程序结束前调用 cudaDeviceSynchronize() 也可暴露执行期错误。printf 只能从设备端输出文本,sleep 则完全不可靠。

Q8. 关于 warp,下列说法正确的是?

单选题 · hard

  • A.warp 大小固定为 64 个线程
  • B.warp 是 GPU 硬件调度的最小线程单位← 正确答案
  • C.block 的线程数必须是 warp 大小的整数倍
  • D.warp 内分支发散不产生任何性能损失

答案:B。warp 是硬件调度与执行的基本单位,NVIDIA GPU 的标准 warp 大小为 32 线程。block 大小不强制要求为 32 的倍数(多余线程被填充),但建议按 warp 对齐以提升效率;warp 内 if/else 分支发散时,每个分支路径串行执行,未走该路径的线程被屏蔽,会产生性能损失。

Q9. 下列哪些是提升全局内存访问带宽的常用优化手段?

多选题 · hard

  • A.合并访问:让同一 warp 内线程访问连续内存地址← 正确答案
  • B.使用共享内存缓存被反复访问的数据← 正确答案
  • C.用 float4 向量化访问扩大单次访存宽度← 正确答案
  • D.增加 kernel 的内层循环迭代次数

答案:ABC。合并访问使 warp 的 32 个线程一次事务即可读取所需数据,是最重要的访存优化;共享内存可避免重复访问全局内存;float4 以 128 位向量读写,减少事务数量。增加循环次数与访存带宽无关,反而可能降低占用率。

Q10. 关于 CUDA 软件生态,下列说法正确的是?

多选题 · mid

  • A.cuDNN 提供深度学习卷积等原语的高性能实现← 正确答案
  • B.cuBLAS 实现标准线性代数 BLAS 接口的 GPU 版本← 正确答案
  • C.NCCL 用于多 GPU 之间高速集合通信← 正确答案
  • D.TensorRT 是一种 Python 解释器

答案:ABC。cuDNN、cuBLAS、NCCL 分别是深度学习原语库、线性代数库和多卡通信库,是 CUDA 生态的核心组件。TensorRT 是 NVIDIA 的推理优化引擎(SDK),用于模型部署加速,不是 Python 解释器。