Почему оператор Go не выполняется параллельно? - PullRequest
8 голосов
/ 04 июня 2011

Я тестирую этот код Go на моем VirtualBoxed Ubuntu 11.4

package main

import ("fmt";"time";"big")
var c chan *big.Int

func sum( start,stop,step int64) {
    bigStop := big.NewInt(stop)
    bigStep := big.NewInt(step)
    bigSum  := big.NewInt(0)
    for i := big.NewInt(start);i.Cmp(bigStop)<0 ;i.Add(i,bigStep){
        bigSum.Add(bigSum,i)
    }
    c<-bigSum           
}

func main() {
    s := big.NewInt( 0 )
    n := time.Nanoseconds()

    step := int64(4)
    c = make( chan *big.Int , int(step))
    stop := int64(100000000)
    for j:=int64(0);j<step;j++{
        go sum(j,stop,step)     
    }
    for j:=int64(0);j<step;j++{
        s.Add(s,<-c)
    }
    n = time.Nanoseconds() - n
    fmt.Println(s,float64(n)/1000000000.)
}

Ubuntu имеет доступ ко всем моим 4 ядрам. Я проверил это с одновременным запуском нескольких исполняемых файлов и системного монитора. Но когда я пытаюсь запустить этот код, он использует только одно ядро ​​и не получает никакой выгоды от параллельной обработки.

Что я делаю не так?

1 Ответ

24 голосов
/ 04 июня 2011

Возможно, вам необходимо просмотреть раздел Параллельность в FAQ часто задаваемых вопросов Go , в частности эти два вопроса, и решить, какие (если не оба) применимы к вашему делу:

Почему не моя многогранная программа? использовать несколько процессоров?

Вы должны установить среду оболочки GOMAXPROCS переменная или используйте одноименную функцию пакета времени выполнения, чтобы позволить время выполнения поддержка использования более одного потока ОС.

Программы, которые выполняют параллельные вычисления должно выиграть от увеличения GOMAXPROCS. Однако следует помнить, что параллелизм не является параллелизмом .

Почему используется GOMAXPROCS> 1 иногда сделать мою программу медленнее?

Это зависит от характера вашего программа. Программы, содержащие несколько горутины, которые проводят много времени общение по каналам будет испытать снижение производительности при использовании нескольких потоков ОС. это из-за значительного штраф за переключение контекста, вовлеченный в отправка данных между потоками.

Планировщик Goroutine Go не так хорошо, как это должно быть. В будущем это следует признать такие случаи и оптимизировать использование потоков ОС. За Теперь GOMAXPROCS должен быть установлен на для каждого приложения.

Подробнее об этой теме см. доклад под названием Параллелизм не есть параллелизм .

...