Итак, я распараллелил этот код с 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)
, чтобы избежать состояния гонки.
Хорошо, вот в чем дело. Я только получаю это ускорение, и я на 100% уверен, что он может стать намного лучше:
Дело в том, что я не знаю, что мне делать или в чем может быть проблема. Может быть, какая-то ложная доля в переменной double *utmp
? Или, может быть, я стремлюсь к циклической декомпозиции данных?
Ценю вашу помощь!