У меня есть большая сетка значений для вычисления, и я хочу использовать несколько потоков для повышения производительности.
Основной однопоточный код выглядит примерно так:
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();
}
}
Кажется, это работает нормально.
Это хорошо, чтобы пойти?В основном я хочу убедиться, что я не теряю память и не делаю что-то ужасно неэффективное, создавая и уничтожая новые потоки в каждой строке.