2016-05-06 3 views
2

Можно ли указать набор тегов для функции MPI_Recv?Набор тегов MPI

Мой сценарий:

Я работаю с приложением, которое имеет несколько потоков, которые одновременно выполнять функцию MPI_RECV. Я намерен использовать тег mpi для управления тем потоком, который получит сообщение. Но мне также нужно контролировать, является ли сообщение data_message или stop_message.

Итак, можно ли определить набор тегов для MPI_Recv? Семантически, было бы что-то вроде «Получить сообщения с тегами 0 или 1» или «Получить сообщения с тегами 10 или 11» и т. Д. Это должно быть несколько значений.

Используя этот подход можно было бы использовать теги thread_id * 2 в data_message и thread_id * 2 + 1 как stop_message.

ответ

1

Я предпочел бы использовать пустое сообщение (MPI_Send(count = 0)), чтобы сигнализировать о состоянии остановки в вашем случае. Просто дождитесь соответствующего сообщения с MPI_Probe(tag = thread_id), а затем используйте MPI_Get_count на возвращаемом объекте статуса, чтобы определить размер сообщения. Если это произойдет, то обнулите цикл обработки.

Другой вариант - поддерживать связь каждого потока в отдельном коммуникаторе. Используйте MPI_Comm_dup, чтобы создать массив дубликатов MPI_COMM_WORLD, а затем у вас есть нить i общаться в comms[i]. Затем вы можете использовать MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i]) для соответствия сообщениям с любым тегом, и это будет связано с потоком. На стороне отправителя используйте MPI_Send(rank = dest, comm = comms[i]) для адресной нити i ранга dest.

1

Не существует прямой функции для соответствия определенному набору тегов (поскольку MPI_TAG_ANY здесь не подходит, из-за неспецифичности), но есть способ достичь той же цели. Отправьте два запроса MPI_Irecv в каждом потоке, по одному для каждого тега, который вы хотите сопоставить. Затем используйте MPI_waitany или MPI_Testany, чтобы посмотреть, что входит.

+2

'MPI_Testany' и' MPI_Waitany' являются источниками недетерминизма. Он будет работать только в том случае, если OP может гарантировать, что сообщение _stop_message_ не будет отправлено до того, как будет гарантировано получение предыдущего _data_message_. –

+1

Это хороший момент. Мое предложение зависит только от одного или другого из тех сообщений, которые действительно доступны для соответствия, поскольку семантика упорядочения не поможет между разными указанными тегами при разных приемах. – Novelocrat