我已经实现了一个带有生产者和消费者的示例 MPI 应用程序。生产者在等级为 0 的进程上运行,消费者将在所有非零等级上运行。消费者将产生消费者工作线程来处理生产者生成的消息。消费者线程分为接收线程和工作线程。
消费者接收者线程执行recv,并在接收时传递要由消费者工作者消费的消息,消费者工作者在执行计算后将处理后的消息发送回生产者(根)。
我在我的双核机器上运行这段代码。我注意到的是,当我使用 执行我的应用程序时mpirun -np 2
,该应用程序对于生产者生成的任意数量的消息都运行良好。当我尝试使用 运行应用程序时mpirun -np 4
,应用程序在处理几次运行后崩溃。
以前有人遇到过这个问题吗?了解为什么会发生这种情况会很棒。
编辑:这是我每次运行应用程序时都会遇到的异常:
*** glibc detected *** application: free(): invalid pointer: 0x00007f67d1f9f9e0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7f67d0671626]
/usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x9041)[0x7f67cc790041]
/usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x5a00)[0x7f67cc78ca00]
/usr/lib/libmpi.so.0(MPI_Recv+0x154)[0x7f67d1d531e4]
/usr/local/lib/libboost_mpi.so.1.50.0(_ZN5boost3mpi6detail19packed_archive_recvEP19ompi_communicator_tiiRNS0_15packed_iarchiveER20ompi_status_public_t+0x33)[0x7f67d1fcb223]
/usr/local/lib/libboost_mpi.so.1.50.0(_ZNK5boost3mpi12communicator4recvINS0_15packed_iarchiveEEENS0_6statusEiiRT_+0x45)[0x7f67d1fc4755]
application(_ZNK5boost3mpi12communicator9recv_implI7MessageEENS0_6statusEiiRT_N4mpl_5bool_ILb0EEE+0x74)[0x464d98]
application(_ZNK5boost3mpi12communicator4recvI7MessageEENS0_6statusEiiRT_+0x3b)[0x46479b]
application(_ZN12WorkerReceiver3runEv+0xac)[0x46b1da]
/usr/local/lib/libPocoFoundation.so.12(_ZN4Poco10ThreadImpl13runnableEntryEPv+0x96)[0x7f67d26fcb16]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7f67d09b7e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f67d06e54bd]
谢谢