OpenMP замедляет цикл, даже если потоки уже созданы - PullRequest
0 голосов
/ 22 сентября 2019

Мне нужно сделать алгоритм быстрее, поэтому я немного изучил openMP и нашел решение:

#pragma omp parallel
{
    for (int i = 0; i < src.rows; i++) {
        for (int j = 0; j < src.cols; j++) {
            // printf("%d%d:", i, j);
            if (j == 0) { ... }
            else {
                #pragma omp single
                { ... }

                one = getTickCount();
                #pragma omp for
                for (int h = 0; h < 256; h++)
                    histogram[h] += colHisto[j + side / 2][h];
                printf("histotime = %d\n", getTickCount() - one);
            }
        }
    }
}

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

Пожалуйста, не предлагайте мне изменить другие вещи в коде, такие как перемещение #pragma omp for в первом циклеЕсть причины, по которым я не могу этого сделать, мне просто нужен этот 256-цикл для более быстрой работы, и, поскольку он выполняется очень часто, я думал, что выиграю от распараллеливания, несмотря на накладные расходы.

...