OpenMP для внутри цикла For без завершения параллельной области - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю с 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.

...