像OpenMP一样在Golang中有一个简单的`parallel for`吗?

cns*_*nst 2 c parallel-processing openmp go

我正在尝试使用并行处理优化拼图,以获得更好的性能.

理想情况下,在C99 w/OpenMP中,我应该能够在有问题#pragma omp parallel forfor循环之前做到这一点,然后应该由系统来分配CPU之间的负载.

对于围棋在官方文档https://golang.org/doc/effective_go.html#parallel,然而,似乎表明,并行处理,我必须,(0),手动从运行环境获取核心数量,( 1),遍历所述核心,(2),有效地为每个核心编码一个不同的for循环,(3),再次在核心上循环以确保所有的东西都得到处理.

我错过了什么吗?对于最简单的情况,OpenMP与古老的C优于全新的Go,被吹捧为C的最佳替代品吗?对于一个更复杂的例子,你究竟是如何range在CPU之间拆分的?

One*_*One 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()
Run Code Online (Sandbox Code Playgroud)

playground