Вопрос по параллельному программизму

alfa114

Дано: массив чисел А и его длина n.
Задача: заменить элементы А на среднее арифметическое соседних элементов (крайние не трогать запустив для обработки А число p нитей (неизвестно, p берётся как нравится или вычисляется из каких-то соображений). В качестве параметров нить получает А, n и свой порядковый номер.
Хинт: загрузка нитей д. быть равномерной.
Вопрос: можно ли исхитриться и разбить массив на непересекающиеся с точки зрения нитей части, чтоб не юзать расшаренную память, семафоры и подобную бадягу? Если да, то как?

kachokslava

на что заменять элементы - непонятно. м.б. на среднее арифметическое соседей? - тогда распараллелить без конфликтов нельзя.

kliM

что такое "их среднее арифм."? (A[0]+A[1]+...+A[n-1])/n ?

alfa114

Ах, да. Каждый элемент - на среднее арифметическое соседей. Акромя крайних.
Прочитал пост Базилио - ответ ясен. Спасибо.
// Каждое A[k] меняем на ( A[k-1] + A[k+1] ) / 2.0.

kliM

короче, можно так попытаться: разбиваешь весь массив на P интервалов, примерно равных, потом делаешь два массива содержащих значения в хвостах каждого интервала (пострадать-то только хвосты могут а поток считает средние для крайних элементов, используя значения не из основного массива, а из массивов с хвостами

alfa114

Спасибо. Я же говорил, что не хочу юзать память, пропорциональную длине массива.
Но всё равно спасибо.

kliM

почему длине массива?.. Памяти надо 2*P (пропорционально числу потоков).
А непропорционально числу потоков и не получится, т.к. у каждого потока свой стек!

alfa114

Тьфу, тормоз я. Хотя я так и хотел делать сначала, а потом переклинило, и подумал, что длина вспомогательного массива - не p, а n/p. Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: