Как сделать дополнение к гистограмме? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть этот алгоритм, который сканирует изображение и для каждого пикселя p вычисляет гистограмму 256 бинов, в которой сохраняются значения пикселя внутри патча около p .Алгоритм должен быть O (1), поэтому нужно много сложить гистограмму, я бы хотел ускорить алгоритм, распараллеливая сложение гистограммы с OpenMP, поэтому я добавил #pragma omp parallel for перед каждым для (только те, у которых гистограммадополнения) но на самом деле это делает его в 10 раз медленнее.Я думаю, что мне нужно создать параллельную область снаружи, но я не понимаю, как.

Кроме того, я боюсь, что накладные расходы, генерируемые OpenMP, преодолевают скорость, полученную при распараллеливании 256-для, но яне знаю наверняка

for (int i = 0; i < src.rows; i++) {
    for (int j = 0; j < src.cols; j++) {
        if (j == 0)
            { ... }
        else {
            if (j > side/2) { // subtract col
                for (int h = 0; h < 256; h++) // THIS ONE
                    histogram[h] -= colHisto[j - (side/2) - 1][h];
            }
            if (j < src.cols - side/2) { // add column
                if (i > side/2) { // subtract pixel
                    colHisto[j + side/2][src.at<uchar>(i - side/2 - 1, j + side/2)]--;
                }
                if (i < src.rows - side/2) { // add pixel
                    colHisto[j + side/2][src.at<uchar>(i + side/2, j + side/2)]++;
                }

                for (int h = 0; h < 256; h++) // AND THIS ONE
                    histogram[h] += colHisto[j + side/2][h];
            }
        }
    }
}

1 Ответ

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 parallel for перед каждым циклом, но все же медленнее, чем последовательная версия

...