Простой пример использования потоков C ++ 11 для вычисления сетки - PullRequest
0 голосов
/ 10 марта 2019

У меня есть большая сетка значений для вычисления, и я хочу использовать несколько потоков для повышения производительности.

Основной однопоточный код выглядит примерно так:

void compute() {
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            calculate(i,j);
}

Строка сеткирассчитывается на основе предыдущих строк, но в пределах одной строки значения могут быть вычислены в любом порядке.Так что моя идея состоит в том, чтобы просто разбить когда-либо строку на K разделов, по одному для каждого потока:

void compute_chunk(int i, int j_lo, int j_hi) {
    for (int j = j_lo; j<j_hi; j++)
        calculate(i, j);
}

void compute(int K) {
    for (int i=0;i<n;i++) {
        vector <thread *> threads;
        for (int chunk = 0; chunk<K; chunk++)
            threads.push_back(new thread(compute_chunk, i, chunk*n/K, (chunk+1)*n/K));

        for (auto t : threads)
            t->join();
    }
}

Кажется, это работает нормально.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...