Сбор результатов MPI_SCAN

У меня есть этот массив [1 2 3 4 5 6 7 8 9], и я выполняю операцию сканирования на нем.

У меня есть задачи 3 mpi, и каждая задача получает 3 элемента, затем каждая задача вычисляет свое сканирование и возвращает результат основной задаче

task 0 - [1 2 3] => [1 3 6] 
task 1 - [4 5 6 ] => [4 9 15] 
task 2 - [7 8 9] => [7 15 24]

Теперь задача 0 получает все результаты [1 3 6] [4 9 15] [7 15 24]

Как я могу объединить эти результаты для получения окончательного результата сканирования?

окончательный результат сканирования массива будет [1 3 6 10 15 21 28 36 45]

Кто-нибудь может мне помочь?


person user1423932    schedule 29.05.2012    source источник


Ответы (1)


Вы пытаетесь реализовать собственную операцию сканирования? Поскольку это не то, что делает MPI_SCAN. Он применяет операцию сканирования поэлементно к каждому i -ому элементу входного массива, хранящегося на каждом узле, и результат будет примерно таким:

rank 0 - [1 2 3] => [ 1  2  3]
rank 1 - [4 5 6] => [ 5  7  9]
rank 2 - [7 8 9] => [12 15 18]

Тем не менее, чтобы получить желаемый результат, вы должны добавить 6 (последний элемент из первого сканирования в задаче 0) ко всем элементам в следующих сканированиях:

[ 1  3  6][ 4  9 15][ 7 15 24]
           +6 -------------->
            =
[ 1  3  6][10 15 21][13 21 30]

Затем вы должны добавить 15 (последний элемент из сканирования в задаче 1 перед добавлением 6) ко всем элементам в следующих сканированиях и так далее.

[ 1  3  6][10 15 21][13 21 30]
                    +15 ---->
                    =
[ 1  3  6][10 15 21][28 36 45]

В качестве альтернативы вы можете добавить 6 только к результатам второго сканирования, затем добавить 21 к результатам третьего сканирования и так далее.

Может быть, вы найдете какой-нибудь умный способ сделать это, используя операции MPI.

person Hristo Iliev    schedule 29.05.2012
comment
+1; Можно реализовать вышеизложенное, используя MPI_Scan на последних элементах массивов (например, чтобы получить 6 и 15), а затем действовать, как указано выше, но если все равно все будет отправлено на процессор 0, это намного лучше способ сделать это, так как нет дополнительных накладных расходов на связь. - person Jonathan Dursi; 29.05.2012