【问题标题】:Using MPI in a multithreaded application在多线程应用程序中使用 MPI
【发布时间】:2012-05-15 19:05:26
【问题描述】:

我正在尝试在多线程应用程序中使用 MPI。在主线程中,我初始化 MPI 环境并创建一个 Manager 对象。 Manager 对象启动两个额外的线程,一个用于接收对象,一个用于 GUI 线程。每当用户单击发送按钮时,都应该将对象发送到相应的等级。有时操作会成功,但在某些情况下我会收到此错误:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
      at MPI.Unsafe.MPI_Recv(IntPtr buf, Int32 count, Int32 datatype, Int32 source, Int32 tag, Int32 comm, MPI_Status& status)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value, CompletedStatus& status)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value)
      at MPI.Communicator.Receive[T](Int32 source, Int32 tag)

代码:

public Manager(String managerID)
{
        //other actions...
        (new Thread(new ThreadStart(startGUIThread))).Start();
        ReceiverThread = new Thread(new ThreadStart(MachineReceiver));
        ReceiverThread.Start();
}
public void MachineReceiver()
{
        while (IsRunning)
        {
            System.Console.Out.WriteLine("initiated");
            Data data = Communicator.world.Receive<Data>(source, 100);
            System.Console.Out.Write("Received");
        }
}

【问题讨论】:

  • 为了更好的文本格式:请在每行的末尾放置两个空格,以换行。您的错误消息将看起来更具可读性
  • 请发布其他代码 - 特别是您进行 MPI 相关调用的地方。另外,您是否尝试在 gdb(或类似的)中运行它?
  • 您的 MPI 实现支持什么级别的线程?低级MPI_Thread_init返回级别,也可以使用MPI_Query_thread。请查阅您的 MPI 包装器文档以了解如何获取它。如果提供的级别不是MPI_THREAD_MULTIPLEMPI_THREAD_SERIALIZED,那么您不应从与调用MPI_Init_thread 的线程不同的线程进行MPI 调用。

标签: multithreading mpi


【解决方案1】:

您是否使用 MPI_Init() 初始化 MPI?如果是这样,那对于多线程程序来说是错误的。您需要改用 MPI_Init_thread()。见http://www.mpi-forum.org/docs/mpi-20-html/node165.htm

【讨论】:

  • 我这样初始化 MPI 环境:使用 (new MPI.Environment(ref args, Threading.Multiple))
  • 大概是一些 MPI 包装器;那么您需要检查该包装器如何初始化 MPI。
  • @user1045747:还要检查 MPI 库是否支持多线程。您使用的 MPI 库和包装器是什么?
  • 我想通了:MS MPI 最多支持并包括 MPI_THREAD_SERIALIZED;因此它确实支持多个线程同时进行 mpi 调用。谢谢!
猜你喜欢
  • 2015-08-20
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多