Lab3 (perftune) 已布置
对所有学计算机的同学来说,“设备” 才是真正触摸到的,但设备到底是什么?
按下键盘之后,计算机硬件/软件系统到底发生了什么?
本讲内容
1950s: 随着计算机运算速度和存储器的发展,计算机已经快到可以 “计算” 人类日常任务了。
计算机 “Turing Machine” 中的一切都是数据
CPU 可以直接通过指令读写这些寄存器
“COM1”; putch()
的实现
#define COM1 0x3f8
static int uart_init() {
outb(COM1 + 2, 0); // 控制器相关细节
outb(COM1 + 3, 0x80);
outb(COM1 + 0, 115200 / 9600);
...
}
static void uart_tx(AM_UART_TX_T *send) {
outb(COM1, send->data);
}
static void uart_rx(AM_UART_RX_T *recv) {
recv->data = (inb(COM1 + 5) & 0x1) ? inb(COM1) : -1;
}
打印机:将字节流描述的文字/图形打印到纸张上
例子:PostScript (1984)
总线
lspci -t
, lsusb -t
中断控制器
I/O 设备:“小计算机”
今天很多 I/O 设备都带有或简单或复杂的 CPU
for (int i = 1; i <= H; i++) {
for (int j = 1; j <= W; j++)
putchar(j <= i ? '*' : ' ');
putchar('\n');
}
难办的是性能
76543210
||||||||
||||||++- Palette
|||+++--- Unimplemented
||+------ Priority
|+------- Flip horizontally
+-------- Flip vertically
CPU 只
for (int x = 0, pos = 0; x < HEIGHT; x++) { // 行扫描
for (int y = 0; y < WIDTH; y++, pos++) {
vbuf[pos] = draw(x, y); // 算出 (x,y) 的贴块 (和颜色)
}
}
地址空间 | 大小 | 功能 |
---|---|---|
$0000-$1FFF |
8 KB | Pattern tables |
$2000-$2FFF |
4 KB | Nametables |
$3000-$3EFF |
3.75KB | Mirrors of $2000-$2EFF |
$3F00-$3F1F |
32B | Palette RAM indexes |
$3F20-$3FFF |
224B | Mirrors of $3F00-$3F1F |
OAM (DMA 访问) | Sprite Y, #, attribute, X |
背景:“卷轴” 操作
通过切换 tile pattern table 实现背景动画
如果我们有更多的晶体管?
2D 图形加速硬件:图片的 “裁剪” + “拼贴”
实现 3D
GameBoy Advance
三维空间中的三角形需要正确渲染
我们不要纸片人
CPU 负责描述,GPU 负责渲染
__global__
void hello(char *a, char *b) {
a[threadIdx.x] += b[threadIdx.x];
}
char a[N] = "Hello ";
char b[N] = {15, 10, 6, 0, -11, 1};
cudaMalloc( (void**)&ad, N );
cudaMalloc( (void**)&bd, N );
cudaMemcpy( ad, a, N, cudaMemcpyHostToDevice );
cudaMemcpy( bd, b, N, cudaMemcpyHostToDevice );
printf("%s", a); // Hello
dim3 dimBlock( blocksize, 1 );
dim3 dimGrid( 1, 1 );
hello<<<dimGrid, dimBlock>>>(ad, bd); // run on GPU
cudaMemcpy( a, ad, N, cudaMemcpyDeviceToHost );
printf("%s\n", a); // World!
...
例子:GLSL (Shading Language)
任何能与 CPU 交换数据的 “东西”。
完成与物理世界的交互
效率更高的专用处理器
(今天应该解开了很多同学对计算机专业的疑惑?)