Почему Go использует больше процессоров, но не уменьшает длительность вычислений? - PullRequest
0 голосов
/ 05 марта 2020

Я написал простую Go программу для добавления чисел во многие процедуры.
Когда я увеличиваю количество процедур, программа использует больше процессоров, и я ожидаю, что продолжительность вычислений будет меньше. Это верно для 1, 2 или 4 подпрограмм, но когда я пробую 8 подпрограмм, продолжительность равна 4 (я запускаю тест на i5-8265U, процессоре с 8 процессорами).
Можете ли вы объяснить это мне ?
Код:

package main

import (
    "fmt"
    "time"
)

// Sum returns n by calculating 1+1+1+..
func Sum(n int64) int64 {
    ret := int64(0)
    for i := int64(0); i < n; i++ {
        ret += 1
    }
    return ret
}

func main() {
    n := int64(30000000000) // 30e9
    sum := int64(0)
    beginTime := time.Now()

    nWorkers := 4
    sumChan := make(chan int64, nWorkers)
    for i := 0; i < nWorkers; i++ {
        go func() { sumChan <- Sum(n / int64(nWorkers)) }()
    }
    for i := 0; i < nWorkers; i++ {
        sum += <-sumChan
    }

    fmt.Println("dur:", time.Since(beginTime))
    fmt.Println("sum:", sum)

    // Results on Intel Core i5-8265U (nWorkers,dur):
    // (1, 8s), (2, 4s), (4, 2s), (8, 2s). Why 8 CPUs still need 2s?
}

1 Ответ

2 голосов
/ 05 марта 2020

Я запускаю тест на i5-8265U, процессоре с 8 процессорами

i5-8265U - это не 8-ядерный процессор, это 4-ядерный 8- потоки CPU : он имеет 4 физических ядра, и каждое ядро ​​может запускать 2 потока одновременно через гиперпоточность .

«Преимущество производительности» в HT зависит от рабочие нагрузки и возможность «смешивать» операции из одного потока с вычислениями другого. Это означает, что если ваш процессор сильно загружен, гиперпотоки могут не иметь возможности получить более нескольких% времени выполнения и, таким образом, не сильно влиять на общую производительность.

Кроме того, 8265U имеет номинальную частоту 1,6 ГГц и максимальный турбо режим 3,9 (3,7 на 4 ядрах). Также возможно, что полная загрузка процессора, включая гиперпотоки, еще больше снизит «турбо-потолок». Вам нужно проверить состояние cpuinfo во время выполнения, чтобы увидеть.

...