计算图与并发控制

计算图与并发控制

2025 南京大学《操作系统原理》
计算图与并发控制

理解你的计算任务:计算图模型

G(V,E)G(V, E): 有向无环的 Dependency Graph

  • 计算任务在节点上
    • (可以使用 shared memory)
  • (u,v)E(u, v) \in E 表示 vv 的计算要用到 uu 产生的值
    • (u,v)(u, v) 也是一个 happens-before 关系

这是一个非常基础的模型

  • 几乎总是可以用这个视角去理解并行计算
  • 如果节点 “独立计算时间” 足够长,算法就是可高效并行的
2025 南京大学《操作系统原理》
计算图与并发控制

例子:Longest Common Subsequence

center

2025 南京大学《操作系统原理》
计算图与并发控制

例子:电路模拟

center

2025 南京大学《操作系统原理》
计算图与并发控制

例子:深度神经网络

center w:full

  • 我们会专门有一次课讲各类计算任务的并行方法
2025 南京大学《操作系统原理》
计算图与并发控制

同步:实现任意计算图 (1)

为每个计算节点设置一个线程和条件变量

void T_u() {  // u -> v
    ... // u 的计算
    mutex_lock(v->lock);
    v->num_done++;
    cond_signal(v->cv);  // 这里是可以 signal 的
    mutex_unlock(v->lock);
}

void T_v() {
    mutex_lock(v->lock);
    while (!(v->num_done == v->num_predecessors)) {
        cond_wait(v->cv, v->lock);
    }
    mutex_unlock(v->lock);
    ... // v 的计算
}
2025 南京大学《操作系统原理》
计算图与并发控制

同步:实现任意计算图 (2)

实现一个任务的调度器

  • 一个生产者 (scheduler),许多消费者 (workers) 循环:
mutex_lock(🔒);
while (!(all_done || has_job(tid))) {
    cond_wait(&worker_cv[tid], 🔒);
}
mutex_unlock(🔒);

if (all_done) {
    break;
} else {
    process_job(tid);
}

signal(&sched_cv);
2025 南京大学《操作系统原理》
计算图与并发控制

用 “生产者-消费者” 理解计算图

方法 (1): 每个节点都 “先消费、后生产”

  • 对于 uvu \to v
    • TuT_u: 完成后为 TvT_v 生产一份
    • TvT_v: 消费 pred\texttt{pred} 份后继续

方法 (2): 双向生产/消费

  • TworkerT_\text{worker}: 生产 ready,消费 job
  • TschedulerT_\text{scheduler}: 消费 ready,生产 job
    • “生产 happens-before 消费”
2025 南京大学《操作系统原理》