Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 514864

Как правильно использовать MPI_Send (параллельное программирование)? - С++ для начинающих

$
0
0
Доброго времени суток! ))

Нужна помощь по задаче по параллельному программированию с применением MPI. Условие задачи звучит так:

"Племя кроманьонцев охотится на пещерного медведя, который спит в своем логове в одной из пещер. Для этого они разделяются и начинают заглядывать во все пещеры подряд до тех пор, пока один из них не найдет медведя. Так как крики могут разбудить медведя раньше времени, нашедший медведя находит каждого из своих товарищей и шепотом сообщает ему, что медведь найден. Написать программу, моделирующую поведение племени, исключающую коллективные обмены."

Решение задачи вижу следующим образом. На нулевом процессе создаем массив, все элементы которого равны нулю, кроме одного - он равен единице, это искомая пещера. Это массив необходимо разделить между всеми процессами, включая нулевой (мастер). Он тоже участвует в поиске.

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

Можно ли выполнять две команды MPI_Send подряд? То есть:
MPI_Send (размер массива, 1, MPI_INT, .......)
MPI_Send (сам массив, кол-во элементов, .....)

Или надо как-то отделять эти команды, что не нарушить порядок приема? Например, использовать MPI_ISend и MPI_Wait


Вторая проблема: как я понял, из нулевого процесса можно передавать только в другие процессы. Когда я пытаюсь сделать так:
for (rank=0; rank<size; rank++0 {
MPI_Send(&array, count, MPI_INT, rank, teg, MPI_COMM_WORLD);
}

консоль выдает ошибку и мгновенно закрывается.

Как тогда правильно делать, как часть массива нулевой процесс должен передать себе же? Разделить массив на "голову" и "хвост" в нулевом процессе? Голову обрабатывать в нулевом, а хвост передать в остальные процессы?

Сам поиск вынесен в отдельную функцию. Если искомый элемент найден, то данный процесс должен оповестить все процессы. То есть себе он не должен отправлять. Опять делить? То есть, например, искомый элемент нашел процесс-кроманьонец rank=2.
Значит сначала MPI_Send для процессов от 0 до 2, а затем с 3 до последнего.

MPI_BCast использовать нельзя по условию задачи
Пока исходим из того, что количество пещер кратно количеству кроманьонцев, то есть размер массива кратен количеству процессов.

Viewing all articles
Browse latest Browse all 514864

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>