¿Hay un simple ‘paralelismo para’ en Golang como OpenMP?

Estoy tratando de optimizar un rompecabezas con parallel processing, para un mejor rendimiento.

Idealmente, en C99 con OpenMP, debería poder hacer eso con la ayuda de un #pragma omp parallel for antes de un bucle for en cuestión, y luego debería estar en el sistema distribuir la carga entre las CPU.

La documentación oficial de Go at https://golang.org/doc/effective_go.html#parallel , sin embargo, parece sugerir que para el parallel processing debo, (0), obtener manualmente el número de núcleos del entorno de ejecución, ( 1), bucle sobre dichos núcleos, (2), codifique efectivamente un bucle for distinto para cada núcleo, (3), bucle sobre los núcleos una vez más para asegurarse de que todas las cosas se procesaron.

¿Me estoy perdiendo de algo? En el caso más simple, ¿es OpenMP con la antigua C superior a la nueva Go que se promociona como el mejor reemplazo de C? Para un ejemplo más complicado, ¿cómo se divide exactamente un range entre las CPU?

Effective Go no está actualizado, Go establece automáticamente GOMAXPROCS en el número de procesadores automáticamente (aún puede configurarlo manualmente para forzar el número que desee).

Aquí hay un ejemplo muy simple para el parallel processing de una porción:

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

patio de recreo

    Intereting Posts