像OpenMP一样在golang中有一个简单的`parallel for?'

时间:2016-04-29 23:58:51

标签: c go parallel-processing openmp

我试图通过并行处理优化拼图,以获得更好的性能。

理想情况下,在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的?

1 个答案:

答案 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()

playground