Почему я не могу ускорить мою программу, одновременно вычисляя различные части среза? - PullRequest
0 голосов
/ 23 февраля 2020

Я написал программу для вычисления оценок сходства между запросом и целевым документом. Эскиз, как показано ниже:

type Dictionary struct {
    Documents map[int][]string
    Queries   map[int][]string
}

type Similarity struct {
    QID   int
    DocID int
    Sim   float64
}

func (dict * Dictionary) CalScore(qID, docID int) float64 {
    query := dict.Queries[qID]
    document := dict.Documents[docID]
    score := calculation(query, document) // some counting and calculation
    // for example: count how many words in query are also in document and so on,
    // like tf-idf things.
    return score
}

// Calculate the similarity scores for each group.
func SimWorker(index int, dict *Dictionary, simsList *[][]Similarity, wg *sync.WaitGroup) {
    defer wg.Done()
    for i, sim := range (*simsList)[index] {
        // Retrieving words from Dictionary and compute, pretty time consuming.
        (*simsList)[index][i].Sim = dict.CalScore(dict.Queries[sim.QID], dict.Documents[sim.DocID])
    }
}

func main() {
    dict := Dictionary{
        // All data filled in.
    }
    simsList := [][]Similarity{
        // Slice of groups of structs containing
        // pairs of query id and doc id.
        // All sims scores are 0.0 initially.
    }

    var wg sync.WaitGroup
    for i := range simsList {
        wg.Add(1)
        go SimWorker(i, &dict, &simsList, &wg)
    }
    wg.Wait() // wait until all goroutines finish

    // Next procedures to the simsList
}

По сути, у меня есть фрагмент групп идентификаторов query-do c, идентификаторы запросов в каждой группе одинаковые, а идентификаторы do c разные. Процедура довольно проста, я просто получаю строки из словаря, а затем вычисляю счет, используя некоторые алгоритмы. Сначала я сделал все это по порядку (не используя горутины), и мне потребовалось несколько минут, чтобы вычислить баллы для каждой группы и всего несколько часов. Затем я ожидал некоторого улучшения скорости, введя goroutines, как описано выше. Я создал программу для каждой группы, так как они имеют доступ к различным частям в Dictionary и [][]Similarity. Но оказалось, что скорость не улучшилась и несколько уменьшилась (количество используемых мной программ составляет около 10). Почему это произошло и как я могу улучшить программу, чтобы фактически ускорить вычисления?

1 Ответ

0 голосов
/ 24 февраля 2020

добавьте эту строку в вашу точку входа

 runtime.GOMAXPROCS(runtime.NumCPU())

она позволяет использовать все ядра в вашем P C. Без этой строки ваша программа будет работать параллельно, но не параллельно

GoDo c

...