【CUDA6】CUDA Stream 是什么,为什么 CUDA 是异步执行,如何正确测量 GPU 时间以及多个任务如何重叠执行

之前在实验中我们写过c_gpu = a_gpu + b_gpu,CPU 执行这行代码时,并不是一定要等 GPU 把加法彻底做完,CPU 发出任务后,可以继续干自己的事情,CUDA默认一个非常重要的特性:CPU 发起 GPU 工作,GPU 异步执行,它更像是CPU--CUDA Stream--KernelA,B,C--GPU执行,Stream就是组织这些GPU工作的机制之一,这也是我们写torch.cuda.synchronize()的原因,它实现了CPU 等 GPU,把当前已经提交的工作执行完。

现在我们步入今天的正题:

CUDA Stream 是什么

我们可以把它想象为GPU的一条任务队列,task1--task2--task3,同一个stream中任务默认按照顺序执行Kernel A--Kernel B--Kernel C,事实上通常会有多个stream,假设我们有两个独立的任务,如果只有一个stream,只能完成一个在完成另一个,我们使用两个stream,理论上可以节约一半的时间,这就是overlap。

pytorch中如何创建stream?

python 复制代码
stream = torch.cuda.Stream()

#use the stream work
with torch.cuda.stream(stream):
    x = a + b
    
    
#多个stream
stream1 = torch.cuda.Stream()
stream2 = torch.cuda.Stream()

with torch.cuda.stream(stream1):
    x = a + b

with torch.cuda.stream(stream2):
    y = c + d

温馨提示:多个stream提供并发机会,不保证一定并发,因为GPU资源是有限的

之前我们使用time.perf_counter()来测量GPU时间,其实有更适合GPU的方式,torch.cuda.Event,为什么它更好一点呢,因为它是直接在GPU execution timeline上标记,而time.perf_counter()是站在CPU,下面是示例代码

python 复制代码
import torch

N = 10_000_000

a = torch.randn(N, device="cuda")
b = torch.randn(N, device="cuda")

# warm up
for _ in range(10):
    c = a + b

torch.cuda.synchronize()

start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)

start.record()

c = a + b

end.record()

torch.cuda.synchronize()

print(f"GPU time: {start.elapsed_time(end):.3f} ms")

前几节我们

复制代码
CPU
 ↓
CUDA Kernel
 ↓
Grid
 ↓
Block
 ↓
Thread
 ↓
Warp
 ↓
Memory

现在我们加入stream:

复制代码
CPU
 │
 ├───────────────┐
 │               │
 ▼               ▼
Stream 0       Stream 1
 │               │
 ▼               ▼
Kernel A       Kernel B
 │               │
 └───────┬───────┘
         ▼
        GPU

GPU 不只是"有很多核心",它还是一个有任务队列、有调度、有异步执行机制的计算系统。

相关推荐
学编程就要猛6 小时前
RAG(Retrieval Augmented Generation)
人工智能·spring ai
冬奇Lab6 小时前
一天一个开源项目(第259篇):Modern Web Guidance —— Chrome 团队给 AI 编码 Agent 的「现代 Web 最佳实践」外挂
人工智能·开源
飞哥数智坊8 小时前
打造自己的 Personal Agent,从抄大肥鱼作业开始
人工智能·deepseek
对你无可奈何8 小时前
Magpie 实战:把 WorkBuddy、Qoder 的订阅模型接进一个本地池子
人工智能
Csvn8 小时前
每请求到底多少钱?把 Token 成本算成可观测指标(C01)
人工智能·aigc·agent
吴名氏.8 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
老金带你玩AI10 小时前
惊人的一致性!Seedream 5.5实测!
人工智能
用户0807759078511 小时前
从输入到输出:大模型推理全流程复盘(含纠错清单)
深度学习
数据技术说11 小时前
在 KES AI 数据库上搭一条 NL2SQL 链路:语义、召回、权限各放哪
人工智能·sql·代码规范