go入门教程- 14.13 在多核心上并行计算

  1. 14.13 在多核心上并行计算
    1. 链接

14.13 在多核心上并行计算

假设我们有NCPU个CPU核心:const NCPU = 4 //对应一个四核处理器 然后我们想把计算量分成NCPU个部分,每一个部分都和其他部分并行运行。

这可以通过以下代码所示的方式完成(我们且省略具体参数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func DoAll(){
sem := make(chan int, NCPU) // Buffering optional but sensible
for i := 0; i < NCPU; i++ {
go DoPart(sem)
}
// Drain the channel sem, waiting for NCPU tasks to complete
for i := 0; i < NCPU; i++ {
<-sem // wait for one task to complete
}
// All done.
}

func DoPart(sem chan int) {
// do the part of the computation
sem <-1 // signal that this piece is done
}

func main() {
runtime.GOMAXPROCS(NCPU) // runtime.GOMAXPROCS = NCPU
DoAll()
}
  • DoAll()函数创建了一个sem通道,每个并行计算都将在对其发送完成信号;在一个 for 循环中NCPU个协程被启动了,每个协程会承担1/NCPU的工作量。每一个DoPart()协程都会向sem通道发送完成信号。

  • DoAll()会在 for 循环中等待NCPU个协程完成:sem通道就像一个信号量,这份代码展示了一个经典的信号量模式。(参见 14.2.7

在以上运行模型中,您还需将GOMAXPROCS设置为NCPU(参见 14.1.3)。

链接


免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 [email protected]

推荐阅读:

文章标题:go入门教程- 14.13 在多核心上并行计算

本文作者:知识铺

发布时间:2019-10-15, 22:30:20

最后更新:2019-10-16, 21:00:36

原始链接:https://blog.zshipu.com/2019/10/15/golang/20191015/14.13/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏