并行计算

并行计算

如果计算过程能够被分为几块可独立执行的过程,它就可以在每块计算结束时向信道发送信号,从而实现并行处理。

type Vector []float64

// 将此操应用至 v[i], v[i+1] ... 直到 v[n-1]
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
	for ; i < n; i++ {
		v[i] += u.Op(v[i])
	}
	c <- 1    // 发信号表示这一块计算完成。
}

我们在循环中启动了独立的处理块,每个 CPU 将执行一个处理。它们有可能以乱序的形式完成并结束,但这没有关系;我们只需在所有协程开始后接收,并统计信道中的完成信号即可。

const NCPU = 4  // CPU核心数

func (v Vector) DoAll(u Vector) {
	c := make(chan int, NCPU)  // 缓冲区是可选的,但明显用上更好
	for i := 0; i < NCPU; i++ {
		go v.DoSome(i*len(v)/NCPU, (i+1)*len(v)/NCPU, u, c)
	}
	// 排空信道。
	for i := 0; i < NCPU; i++ {
		<-c    // 等待任务完成
	}
	// 一切完成。
}
下一页