Мне нужно сделать алгоритм быстрее, поэтому я немного изучил 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-цикл для более быстрой работы, и, поскольку он выполняется очень часто, я думал, что выиграю от распараллеливания, несмотря на накладные расходы.