2012-04-09 8 views
0

В основном я хочу, чтобы добиться чего-то вроде этого:
Как сделать два процесса с двумя потоками, отправленными друг другу в 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 для языка C с библиотекой Pthreads.
Я сделал это уже в PVM, вот исходный код:
master.c: http://pastebin.com/wwEie7gn,
slave.c: http://pastebin.com/gfeCkcss.
Что я пытался:
prog.c: http://pastebin.com/tCVKN3fe
Каким-то образом потоки приемников ничего не получают. Я не знаю, в чем проблема. Я надеюсь, что кто-то может показать мне правильный способ сделать это.
Я использую MPI, скомпилированный без поддержки нитей.

+0

Почему бы просто не создать 4 процесса? – suszterpatt

+0

вам нужно прочитать: http://www.mpi-forum.org/docs/mpi-20-html/node162.htm#Node162 – Anycorn

+0

@suszterpatt later on Я хочу, чтобы эти потоки разделяли пространство памяти с помощью pthreads. – wieczorek1990

ответ

0

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

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