Я работаю над адаптацией программы для использования OpenMP. У меня есть группа вложенных циклов. Самый внешний для цикла - петли оси y, которые спускаются по изображению. Я хотел бы запустить несколько параллельных потоков в цикле, но у меня возникли проблемы с этим.OpenMP For - групповые петли для оптимизации кеша
В настоящее время, когда я бегу 8 потоков он работает как:
thread 0 -> row 0,8,16...
thread 1 -> row 1,9,17...
thread 2 -> row 2,10,18...
thread 3 -> row 3,11,19...
Я хотел бы, чтобы работать в блоках, так что нить 0 делает первый 1/8 строк. Каков наилучший способ сделать это?
Текущий код:
...
int y_percent = data_size_Y/8;
int thread = 0;
#pragma omp parallel for num_threads(8) firstprivate(vecs, bufferedOut,data_size_X, data_size_Y, kern_cent_X, kern_cent_Y, sum)
for(int y = y_percent*omp_get_thread_num(); y < (omp_get_thread_num()+1)*y_percent; y++){ // the y coordinate of theoutput location we're focusing on
Если кто-то не связан с заказом дистрибутива, но он связан с производительностью, то «расписание (динамический)» следует использовать только в качестве последнего средства для устранения дисбаланса нагрузки. Накладные расходы на динамическое планирование огромны по сравнению со статическим. –