我试图通过并行处理优化拼图,以获得更好的性能。
理想情况下,在C99 w / OpenMP中,我应该能够在问题#pragma omp parallel for
循环之前for
的帮助下做到这一点,然后它应该由系统决定在CPU之间分配负载。
Go https://golang.org/doc/effective_go.html#parallel的官方文档似乎表明,对于并行处理,我必须(0)手动从运行时环境中获取核心数,(1),循环遍历所述核心,(2),为每个核心有效地编写一个不同的for循环,(3),再次遍历核心,以确保所有的东西都得到处理。
我错过了什么吗?对于最简单的情况,OpenMP与古老的C优于全新的Go,被誉为C的最佳替代品吗?有关更复杂的示例,您究竟是如何在CPU之间拆分range
的?
答案 0 :(得分:6)
Effective Go已经过时了,Go会自动将GOMAXPROCS设置为处理器数量(你仍然可以手动设置它以强制你想要的数字)。
这里是切片并行处理的一个非常简单的例子:
data := make([]float64, SZ)
var wg sync.WaitGroup
for i := range data {
wg.Add(1)
go func(v *float64) {
// note that using rand is a bad example because global rand uses a mutex
*v = rand.Float64()
wg.Done()
}(&data[i])
}
wg.Wait()