【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 不只是"有很多核心",它还是一个有任务队列、有调度、有异步执行机制的计算系统。

相关推荐
灵动的艺术3 小时前
如一 Agent 架构解读(二十四):Agent 高效率低成本思考
人工智能·agent·如一
Xxtaoaooo4 小时前
双11避坑:我用 WorkBuddy + TextIn xParse 做了个「避坑对比台」,商品详情图丢进去,参数矛盾自动现形
人工智能·1024程序员节·textin·workbuddy·ai数据层基础设施
昵称画4 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
Navicat中国4 小时前
将 Navicat 的 AI 助手连接到本地 LLM
人工智能·chatgpt
“AI国潮设计-小江”4 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
点PY5 小时前
WeDetect论文精读
人工智能
CCC:CarCrazeCurator5 小时前
稀疏奖励 vs 稠密奖励:强化学习中的反馈带宽权衡
人工智能·深度学习·机器人
骑着蜗牛撵大象3275 小时前
语音变分录、规则挡幻觉:拆解开源 AI 记账系统 Smart Ledger 的全栈设计
人工智能·ai·架构·js·数据校验
墨染天姬5 小时前
[AI]Cursor Subagent 机制详解
人工智能
数睿数据无代码开发5 小时前
企业AI落地从高价值场景开始|数睿数据《AI应用场景集》正式发布
人工智能