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