如何使用MPI创建单个进程但多线程MFC GUI应用程序?

时间:2015-06-05 15:14:22

标签: c++ multithreading mfc mpi

我只需要使用MSMPI编写一个简单的MFC Windows应用程序,但我不想启动多个进程,因为我的GUI应用程序可能需要在多线程部分之前进行一些用户交互。例如,我想在点击“运行”按钮后创建2个线程。

我尝试使用命令行运行我的程序:mpiexec.exe -n 2 myprogram.exe但这将创建两个进程,我将看到两个应用程序窗口。

我也在Visual Studio 2010中尝试了MPI群集调试选项,但它也创建了两个进程。

这似乎是一个非常基本的问题,但我发现很难在Google找到答案。

修改

为了消除这里的困惑,我必须澄清一些事情:

  1. 我有一个非常复杂和庞大的代码库,已经使用MS-MPI 来实现并行性,我必须在它上面构建一个MFC GUI。出于这个原因,我不能使用任何其他并行机制,例如std :: thread,因为这意味着我必须重写很多不可承受的东西。
  2. 根据我的理解,要启动MPI程序,我必须在Windows中运行名为mpiexec.exe的外部程序。我还没弄清楚是否有可能自己启动程序并仍然实现MPI功能。我对MPI很新。我不太确定是否有可能实现我的要求。如果不是,我将非常感激,如果有人能让我知道为什么和可能的解决方法。
  3. 简单地说,我想为支持MPI的软件创建一个MFC GUI包装器,这必须是一个多线程程序,而不是这个GUI包装程序的多个实例(进程)(例如,通过mpiexec -n 2 xxx运行该程序) .exe将只创建同一程序的2个实例)

2 个答案:

答案 0 :(得分:2)

我猜你正在为你的一些MPI软件创建某种图形前端。据我所知,你有两种选择。

选项1

创建一个单独的Win32应用程序(没有MPI)作为您的GUI,让这个应用程序运行“mpiexec”或等效的正确参数,以便在用户请求时启动应用程序。

选项2

您需要确保只在一个MPI实例上启动GUI。您可以通过在启动期间从MPI查找当前程序的ID来执行此操作,如果它是0,则启动GUI。

这样的事情:

int main(int argc, char** argv){
    int myid;
    ...
    MPI_Init(&argc, &argv);
    ...
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    if(myid == 0){
        launchGui();
    }else{
        waitForAndProcessMessages();
    }
    ...
    MPI_Finalize();
    return 0;
}

显然,您仍然需要填充所有位以使MPI正常运行,但在此示例中,第一个启动的实例将成为GUI而不进行任何处理。稍后加入HPC的任何实例都将等待消息并处理它们,直到它们终止。

答案 1 :(得分:0)

  

点击“运行”按钮后,我想创建2个帖子“

既然你有VS 2010,我不确定std :: thread兼容性。您可以使用MFC's threading API,如下所示 -

CWinThread* myThread = AfxBeginThread(myThreadFunc, &threadInfoStruct);

enter image description here

您可以使用PostThreadMessage API在各种MFC线程之间传递信息,即从GUI到业务逻辑,从而传入MPI线程并返回。

当然,如果您的编译器支持std::thread,那么就可以了。

std::thread相关,通常最实用的方法是使用std::async。阅读 Effective Modern C ++ 中有关基于线程的编程与基于任务的编程的相关内容。