读书

---
config:
theme: 'default'
themeVariables:
cScale0: '#d3d3d3'
cScaleLabel0: '#000000'
cScale1: '#a6a6a6'
cScaleLabel1: '#000000'
cScale2: '#76b900'
cScaleLabel2: '#ffffff'
---
timeline
title NVIDIA Desktop GPUs History
section early NVxx era
1999 : NV04
2004 : NV40
2006 : NV50 : Tesla : Introduction of per context VMA
section pre-Turing era
2010 : GF1xx : NVC0 - Fermi
2012 : GK1xx : NVE0 - Kepler : Vulkan support : nouveau start support reclocking
2014 : GM1xx : Maxwell
2014 : GM2xx : Maxwell 2 : Start of signed firmware thus little chance to reclock
2016 : GP1xx : Pascal
2017 : GV1xx : Volta
section New era for open source (GSP)
2018 : TU1xx : Turing : GPU System Processor support
2020 : GA1xx : Ampere
2022 : AD1xx : Ada Lovelace
2025 : GB2xx : Blackwell
1 | target ... : prerequisites ... |
众所周知,中断上下文不能睡眠,但是这句话细说起来,还是有很多值得深究的地方。所谓中断上下文,就是中断触发后,执行中断服务例程 (Interrupt Service Routine/Interrupt Handler) 的资源,这些资源有哪些呢?少得可怜,除了执行 ISR 代码的 CPU 核心外,中断上下文甚至都没有自己的栈来保存临时变量,所有的资源都是抢占中断触发时那个进程的,显然不能让这种“抢占”持续太久,所以 Linux 将 ISR 分成了 top half 和 bottom half 两部分,也就是硬件中断上下文和软件中断上下文, 所以严格来说是,在 Linux 内核中,硬件中断上下文不能睡眠。
flowchart TD
subgraph GPU
slot-0[HW Run Queue]
slot-1[HW Run Queue]
slot-2[HW Run Queue]
end
sched0[drm_gpu_scheduler]
sched1[drm_gpu_scheduler]
sched2[drm_gpu_scheduler]
runq00[drm_sched_rq<br>KERNEL]
runq01[drm_sched_rq<br>HIGH]
runq02[drm_sched_rq<br>NORMAL]
runq03[drm_sched_rq<br>LOW]
runq10[drm_sched_rq<br>KERNEL]
runq11[drm_sched_rq<br>HIGH]
runq20[drm_sched_rq<br>KERNEL]
runq21[drm_sched_rq<br>HIGH]
runq22[drm_sched_rq<br>NORMAL]
entity00@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity01@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity02@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity03@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity10@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity11@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity12@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity20@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity21@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity22@{shape: docs, label: "drm_sched_entity<br>job chain"}
entity00 --> entity01 --> entity02 --> entity03 --> runq00
entity10 --> entity11 --> entity12 --> runq10
entity20 --> entity21 --> entity22 --> runq02
runq00 --> sched0
runq01 --> sched0
runq02 --> sched0
runq03 --> sched0
runq10 --> sched1
runq11 --> sched1
runq20 --> sched2
runq21 --> sched2
runq22 --> sched2
sched0 --> slot-0
sched1 --> slot-1
sched2 --> slot-2