Как заставить два процесса с двумя потоками получать, отправлять друг другу в MPI?

В основном я хочу добиться чего-то вроде этого:

Process 1
  Thread 1
    Receive X from process 2
  Thread 2
    Receive Y from process 2
Process 2
  Thread 1
    Send X to process 1
  Thread 2
    Send Y to process 1

в MPI для языка Си с библиотекой pthreads.
Я сделал это уже в PVM, вот исходный код:
master.c: http://pastebin.com/wwEie7gn,
slave.c: http://pastebin.com/gfeCkcss.
Что я пытался сделать:
prog.c: http://pastebin.com/tCVKN3fe
Каким-то образом потоки получателя ничего не получают. Я не знаю, в чем проблема. Я надеюсь, что кто-то может показать мне правильный способ сделать это.
Я использую MPI, скомпилированный без поддержки потоков.

1 ответ

Вы хотите использовать разные теги для обоих сообщений, например, вы можете пометить сообщение с помощью (известного?) Идентификатора потока получателя. Тогда каждый поток в процессе 1 будет публиковать получение с его идентификатором в качестве тега, и этот прием будет соответствовать только сообщению, направленному в этот конкретный поток.

Обратите внимание, что MPI 2.2 обеспечивает ограниченную совместимость с потоками. По умолчанию большинство реализаций MPI не являются поточно-ориентированными. Например, для открытого MPI требуется явно включить поддержку полной потоковой обработки во время настройки (по умолчанию она отключена). Вам нужно хотя бы иметь MPI_THREAD_SERIALIZED уровень потоков, как возвращено в provided аргумент MPI_Thread_init (или же MPI_Query_thread) чтобы можно было делать вызовы MPI в разных потоках. Если ваша библиотека MPI предоставляет только MPI_THREAD_SINGLE или же MPI_THREAD_FUNNELED Уровни, вам не повезло, и вы не можете делать вызовы MPI в другом потоке. Если предоставленный уровень MPI_THREAD_SERIALIZEDзатем вы можете делать вызовы MPI из любого потока, но вы должны явно сериализовать вызовы, то есть убедиться, что два или более вызовов не выполняются одновременно (например, с критическими секциями или мьютексами). Если предоставленный уровень MPI_THREAD_MULTIPLE тогда у вас есть полная многопоточная поддержка и вы можете делать вызовы MPI из любого потока и в любой момент времени.

Другие вопросы по тегам