OpenMP улучшить разложение блоков SpeedUp - PullRequest
0 голосов
/ 10 января 2019

Итак, я распараллелил этот код с OpenMP, используя разложение блоков для матрицы. Я пытаюсь исправить дисбаланс нагрузки с помощью:

#define lowerb(id, p, n) ( id * (n/p) + (id < (n%p) ? id : n%p) )
#define numElem(id, p, n) ( (n/p) + (id < (n%p)) )
#define upperb(id, p, n) ( lowerb(id, p, n) + numElem(id, p, n) - 1 )
#define min(a, b) ( (a < b) ? a : b )
#define max(a, b) ( (a > b) ? a : b )

Вот код. Извините, я должен опубликовать фотографию, но я не смогу добраться до своего ноутбука до следующей недели.

О коде объяснять особо нечего, каждый поток получает несколько строк и разделяет объем работы. Я использую reduction(+:sum), чтобы избежать состояния гонки.

enter image description here

Хорошо, вот в чем дело. Я только получаю это ускорение, и я на 100% уверен, что он может стать намного лучше:

enter image description here

Дело в том, что я не знаю, что мне делать или в чем может быть проблема. Может быть, какая-то ложная доля в переменной double *utmp? Или, может быть, я стремлюсь к циклической декомпозиции данных?

Ценю вашу помощь!

...