Я работаю с OpenMP в C, чтобы распараллелить мою программу. У меня есть такой код:
for (num = 0; num < NUM_DATA; num++) {
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
Я распараллеливаю свой код примерно так:
for (num = 0; num < NUM_DATA; num++) {
#pragma omp parallel
{
#pragma omp for
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
#pragma omp for
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
}
Когда я запустил распараллеленный код, время выполнения у меня было намного хуже, чем у серийной версии. Из того, что я узнал, это произошло потому, что в конце каждой итерации num
созданная параллельная область завершается закрывающей скобкой #pragma omp parallel
, но параллельная область должна быть создана снова на следующей num
итерация. Параллельная схема будет выглядеть примерно так: this .
Из-за этого параллельные издержки (для создания параллельной области) попадают в программу каждый цикл num
, а не только один раз. Есть ли способ заставить программу не завершать созданную параллельную область для следующей итерации num
? Или какие-нибудь другие обходные пути в виду?
Я не могу распараллелить этот код во что-то вроде этого:
#pragma omp parallel for
for (num = 0; num < NUM_DATA; num++) {
{
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
}
, поскольку B
, используемый в some_calc()
для любой итерации num
, зависит от other_calc()
от предыдущей итерации num-1
.