OpenMP - создавать потоки только один раз

Я пытаюсь написать простое приложение, используя OpenMP. К сожалению, у меня проблема с ускорением. В этом приложении у меня есть один цикл while. Тело этого цикла состоит из нескольких инструкций, которые нужно выполнять последовательно, и одной инструкции цикла for. Я использую #pragma omp parallel for, чтобы сделать цикл for параллельным. Этот цикл не требует много работы, но вызывается очень часто.

Я готовлю две версии цикла for и запускаю приложение на 1, 2 и 4 ядрах.
версия 1 (4 итерации цикла for): 22 сек, 23 сек, 26 сек.
версия 2 (100000 итераций цикла for): 20сек, 10сек, 6сек.

Как видите, когда цикл for не требует много работы, время на 2 и 4 ядрах больше, чем на 1 ядре. Я предполагаю, что причина в том, что #pragma omp parallel forсоздает новые потоки в каждой итерации цикла while. Итак, я хотел бы спросить вас - есть ли возможность создать потоки один раз (до цикла while) и гарантировать, что какая-то работа в цикле while будет выполняться последовательно?

#include <omp.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
    double sum = 0;
    while (true)
    {
        // ...
        // some work which should be done sequentially
        // ...

        #pragma omp parallel for num_threads(atoi(argv[1])) reduction(+:sum)
        for(int j=0; j<4; ++j)  // version 2: for(int j=0; j<100000; ++j)
        {
            double x = pow(j, 3.0);
            x = sqrt(x);
            x = sin(x);
            x = cos(x);
            x = tan(x);
            sum += x;

            double y = pow(j, 3.0);
            y = sqrt(y);
            y = sin(y);
            y = cos(y);
            y = tan(y);
            sum += y;

            double z = pow(j, 3.0);
            z = sqrt(z);
            z = sin(z);
            z = cos(z);
            z = tan(z);
            sum += z;
        }

        if (sum > 100000000)
        {
            break;
        }
    }
    return 0;
}
5
задан mchrobok 14 May 2012 в 19:25
поделиться