并行计算
并行计算
如果计算过程能够被分为几块可独立执行的过程,它就可以在每块计算结束时向信道发送信号,从而实现并行处理。
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 // 等待任务完成
}
// 一切完成。
}