生于娱乐,长于智能

生于娱乐,长于智能

2025 南京大学《操作系统原理》
生于娱乐,长于智能

记得刚才的想法

用更多更简单的处理器

  • 同等面积,处理器越简单,数量越多
  • 我们甚至不需要处理器有 CPU 指令集的计算能力
    • “领域专用加速器”
      • ISP: Image Signal Processing (手机相机)
      • GPU: Graphics Processing Unit (图形渲染)
      • DPU: Data Processing Unit (网络/数据处理)
2025 南京大学《操作系统原理》
生于娱乐,长于智能

至少有一件事,可以让专用处理器来做

画图

  • fi,jf_{i,j} 的计算是 “massive parallel” 的
for (int y = 0; y < H; ++y) {
    for (int x = 0; x < W; ++x)
        putchar(f(x, y) ? '*' : ' ');
    putchar('\n');
}
  • 对 CPU 来说是个根本不可能完成的任务
    • NES: MOS 6502 @ 1.79Mhz; IPC \approx 0.43
    • 屏幕共有 256 x 240 = 61K 像素 (256 色)
    • 60FPS → 10K 条指令完成 61K 像素的渲染
2025 南京大学《操作系统原理》
生于娱乐,长于智能

NES Picture Processing Unit 绘图模型

8×88\times8 的 “贴块” (tile) 为绘制的基本单位

  • 背景画布 + 动态前景 (sprites)

center

2025 南京大学《操作系统原理》
生于娱乐,长于智能

NES PPU 的图形绘制

center

  • Sprite = (xx, yy, tile, attr), 256-byte Sprite RAM (64 个)
76543210
||||||||
||||||++- Palette
|||+++--- Unimplemented        
||+------ Priority
|+------- Flip horizontally
+-------- Flip vertically
2025 南京大学《操作系统原理》
生于娱乐,长于智能

Massive Parallelism

// 逐行扫描
for (int row = 0; row < lines; row++) {

    // 我们可以作弊 😊
    #pragma omp parallel for
    for (int i = 0; i < 64; i++) {
        struct sprite *s = &SPRAM[i];
        if (s->y <= row && row < s->y + 8) {
            // 绘制 sprite
        }
    }

    display_row(row);
}
  • 这就是早期的 “fixed-function pipeline”
2025 南京大学《操作系统原理》
生于娱乐,长于智能

Aside: 超越机能的限制

神奇的 MMC1 芯片

  • “Memory mapper”
  • 如果我们有更大的 ROM,就有更大的 hack 空间

center

2025 南京大学《操作系统原理》
生于娱乐,长于智能

The Legend of Zelda

center

2025 南京大学《操作系统原理》
生于娱乐,长于智能

图形渲染管线 im=f(description)\text{im} = f(\text{description})

center

“Fixed-function pipeline”

  • 每个部分都有可配置的参数
    • 例如,glLightfv, glMaterialfv 设置光源和材质
2025 南京大学《操作系统原理》
生于娱乐,长于智能

功能越强,人们想要的越多

Rendering pipeline 逐渐从 “固定功能” 到 “可编程”

center

  • Vertex shader: v=f(v)v' = f(v)
  • Fragment shader: c=f(c)c' = f(c)
2025 南京大学《操作系统原理》
生于娱乐,长于智能

现代图形渲染管线

center

2025 南京大学《操作系统原理》
生于娱乐,长于智能

于是,人们开始玩起了花活

center

  • Fast matrix multiplies using graphics hardware” (SC'01)
    • 外积分解: A×B=k=1nA,kBk,A \times B = \sum_{k=1}^n A_{*,k} B_{k,*}
    • GPGPU 总是围绕 “图像”
      • 所以把各种计算问题转换为 “图像” 的计算 (物理模拟、天气预报……)
2025 南京大学《操作系统原理》
生于娱乐,长于智能

绕了一圈……知道我们要干啥了吧!

void vertex_shader(  // HLSL
    float4 position : POSITION,
    float4 color : COLOR,
    out float4 oPosition : POSITION,
    out float4 oColor : COLOR
) {
    float r = rand(position.xyz, seed);
    float3 offset = (r - 0.5) * 0.1; // 随机扰动
    float4 newPos = position + float4(offset, 0.0);
    oPosition = mul(newPos, WorldViewProj);
    oColor = color;
}
for (int y = 0; y < H; ++y) {
    for (int x = 0; x < W; ++x)
        putchar(f(x, y) ? '*' : ' ');
    putchar('\n');
}
2025 南京大学《操作系统原理》