2015-02-25 2 views
0

Я пытаюсь оптимизировать код обработки изображений с помощью OpenMP. Я все еще изучаю его, и я пришел к классической параллели для цикла, которая медленнее, чем моя однопоточная реализация.Возможно ли оценить стоимость накладных расходов OpenMP?

Цикл for, который я пытался распараллелить, имеет только 50 итераций, и я увидел, что это объясняет, почему использование OpenMP в этом случае может быть бесполезным из-за накладных операций.

Но можно ли оценить эти затраты? Каковы различия в стоимости между общими/частными/первичными (...) статьями?

Это цикл я хочу распараллелить:

#pragma omp parallel for \ 
     shared(img_in, img_height, img_width, w, update_gauss, MoGInitparameters, nb_motion_bloc) \ 
     firstprivate(img_fg, gaussStruct) \ 
     private(ContrastHisto, j, x, y) \ 
     schedule(dynamic, 1) \ 
     num_threads(max_threads) 
    for(i = 0; i<h; i++){ // h=50 
    for(j = 0; j<w; j++){ 
     ComputeContrastHistogram_generic1D_rect(img_in, H_DESC_STEP*i, W_DESC_STEP*j, ContrastHisto, H_DESC_SIZE, W_DESC_SIZE, 2, img_height, img_width); 
     x = i; 
     y = w - 1 - j; 
     img_fg->data[y][x] = 1-MatchMoG_GaussianInt(ContrastHisto, gaussStruct->gauss[i*w+j], update_gauss, MoGInitparameters);; 
     #pragma omp critical 
     { 
     nb_motion_bloc += img_fg->data[y][x]; 
     nb_motion_bloc += img_fg->data[y][x]; 
     } 
    } 
    } 

Может быть, я делаю какие-то ошибки, но если это так, скажите, пожалуйста, почему !!

+1

Да, можно оценили накладные расходы из различных OpenMP конструкций - см [EPCC OpenMP микро-набор тестов] (https://www.epcc.ed.ac.ик/исследования/вычислительная/производительность характеризация-и-сравнительный анализ/EPCC-OpenMP-микро-тест-набор). Кстати, похоже, что вы выполняете сокращение суммы в 'nb_motion_bloc' и поэтому должны использовать' сокращение (+: nb_motion_bloc) 'вместо того, чтобы суммировать в критическом блоке. Кроме того, 'schedule (dynamic, 1)', вероятно, очень субоптимально в вашем случае. –

ответ

2

Несколько вопросов, которые не касаются ваших конкретных вопросов.

Старайтесь избегать #pragma omp critical. В этом случае вы можете полностью удалить его, добавив пункт reduction(+:nb_motion_bloc) в строку omp parallel for и используя nb_motion_bloc += 2*img_fg->data[y][x];.

В зависимости от того, как много работы каждая итерация должна делать, короткие петли несут (намного) больше накладных расходов, чем они того стоят.

Теперь на вопросы. Если вы не изменяете какие-либо переменные, не ставьте их классифицировать как shared/private/firstprivate. Если они должны быть использованы каждым потоком и отбрасываются, вы можете использовать конструкцию как

#pragma omp parallel 
{ 
    int x, y; 
    #pragma omp for 
    for(i = 0; i<h; i++) 
    { 
     ... 
    }  
} 

Если нагрузка уравновешивается, а затем рассмотреть вопрос об использовании schedule(static).

Что касается разницы между общим/частным/первым приватным, см. this и this вопросов. От wikipedia:

  • совместно: данные в пределах параллельной области является общим, что означает, видимыми и доступными для всех потоков одновременно. По умолчанию все переменные в области совместного использования разделяются, за исключением счетчика итераций цикла.
  • частный: данные в параллельной области являются частными для каждого потока, что означает, что каждый поток будет иметь локальную копию и использовать его как временную переменную. Закрытая переменная не инициализируется, и значение не поддерживается для использования вне параллельной области. По умолчанию счетчики циклов цикла в конструкциях цикла OpenMP являются закрытыми.
  • default: позволяет программисту заявить, что область данных по умолчанию в параллельном регионе будет либо общей, либо ни одной из них для C/C++ или shared, firstprivate, private или none для Fortran. Параметр none не позволяет программисту объявить каждую переменную в параллельном регионе, используя атрибуты атрибутов совместного использования данных.
  • firstprivate: как частный, кроме инициализированного оригиналом.
  • lastprivate: как частный, кроме первоначального значения обновляется после создания.
Смежные вопросы