2013-02-13 4 views
1

У меня есть сеть, в которой процессы отправляют случайное сообщение своим соседям и одновременно получают сообщения от своих соседей. Я могу сделать это с помощью сокетов и потоков. Один поток принимает сообщения, а другой отправляет сообщения соседнему, выбранному случайным образом. Можно ли добиться этого с помощью MPI_SEND и MPI_RECV?одновременная отправка и получение с использованием MPI

+0

Вы имеете в виду неблокирующую версию отправки и получения? – arunmoezhi

+0

Ничего. На самом деле, я плохо понимаю ваш вопрос, чтобы ответить на него. – nhahtdh

+0

Я попытался использовать это, но мне нужно поместить отправку в цикле, который отправляет сообщения в произвольные интервалы времени. Во время этого выполнения цикла ранг должен получить любое отправленное сообщение – arunmoezhi

ответ

1

Вы можете использовать вызовы MPI в многопоточной среде. Проверьте руководство для функции MPI_Init_thread и этой статьи: http://www.mcs.anl.gov/~thakur/papers/mpi-threads.pdf. Помните, что стандарт MPI-1 не требует, чтобы реализация была потокобезопасной, только MPI-2 (но реализация, которую вы используете, скорее всего, MPI-2).

+0

Спасибо. Является ли многопоточность единственным вариантом или теоретически можно достичь этого, используя неблокирующие отправки и получения? – arunmoezhi

+0

Трудно сказать, не зная подробно, что делает ваш код, возможно, возможно каким-то образом изменить ваш алгоритм и использовать неблокирующие вызовы. С другой стороны, у меня была очень похожая проблема в прошлом - я работал над параллельной сортировкой, и было необходимо отправлять и получать сообщения одновременно; единственным решением, которое я нашел, было использование двух потоков и сокетов (это было в то время, когда MPI-2 еще не существовал, и все доступные мне реализации MPI-1 не были потокобезопасными). – miy

0

Ваше определение: "одновременное"?

В любом случае, вы можете быть заинтересованы в MPI_Sendrecv:

Семантика операции передачи-приема является то, что можно было бы получить, если вызывающий раздвоенный два параллельных потоков, один для выполнения отправки, и один для выполнения приема, за которым следует объединение этих двух потоков.

+0

Спасибо. Скажем, у меня есть 3 ранга, и каждый ранг должен отправить 2 сообщения в другие ряды. Например, Rank1 отправляет 2 сообщения в Rank0 и 2 сообщения в Rank1. В целом каждый ранг отправляет 4 сообщения. Но временной интервал между каждой отправкой рандомизирован. И я не хочу помещать блок синхронизации между каждым sendrecv. – arunmoezhi

Смежные вопросы