Я пытаюсь распараллелить часть кода, но есть некоторые проблемы, критическая часть для вставки в общую карту создает узкое место в моем исполнении. Есть способ распараллелить вставку?
Вторая проблема касается того, как выполнять итерацию с openMP на картах заданное количество раз. Вот код, я использую g++-5 на Clion.
else if (PERF_ROWS <= MAX_ROWS && function_switch == false)
{
int array_dist_perf[PERF_ROWS];
int array_dist[MAX_ROWS];
multimap<float, int> temp_map;
#pragma omp parallel for schedule(dynamic) private(array_dist_perf) shared(temp_map)
for (int i = 0; i < MAX_COLUMNS; i++)
{
if (i % PERF_CLMN == 1) continue;
for (int j = 0; j < PERF_ROWS; j++) //truncation perforation
{
array_dist_perf[j] = abs(input[j] - input_matrix[j][i]);
}
float av = mean(PERF_ROWS, array_dist_perf);
float temp_score = score_func(av);
#pragma omp critical(map_update)
temp_map.insert({temp_score, i});
}
map<float,int>::reverse_iterator rit;
int iter = 0;
#pragma omp parallel for schedule(dynamic) private(array_dist) shared(iter)
for (rit=temp_map.rbegin(); rit!=temp_map.rend(); rit++)
{
int s = rit->second;
for (int k = 0; k < MAX_ROWS; k++)
{
array_dist[k] = abs(input[k] - input_matrix[k][s]);
}
float av_real = mean(MAX_ROWS, array_dist);
float score_real = score_func(av_real);
rank_function(score_real, s);
#pragma omp atomic
iter++;
if (iter == THRESHOLD_NUM)
break;
}
}
schedule(dynamic)
? Ваши итерационные рабочие нагрузки не кажутся мне сильно различающимися. - person Klaas van Gend   schedule 14.04.2016break
). Вы должны использовать механизмcancel
иcancellation_point
OpenMP4 - в противном случае поведение вашего кода не определено. - person Klaas van Gend   schedule 14.04.2016cancel
, которое вызывает досрочный выход. Чтобы другие потоки следовали за выходом, вы определяете точки отмены, см. software.intel.com /ru-ru/узел/524513 . - person Klaas van Gend   schedule 19.04.2016