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

C++ 如何使用MPI创建单进程多线程MFC GUI应用程序?,c++,multithreading,mfc,mpi,C++,Multithreading,Mfc,Mpi,我只需要使用MSMPI编写一个简单的MFC Windows应用程序,但我不想启动多个进程,因为我的GUI应用程序在多线程部分之前可能需要一些用户交互。例如,我想在单击“运行”按钮后创建2个线程 我尝试使用命令行运行我的程序:mpiexec.exe-n 2 myprogram.exe,但这将创建两个进程,我将看到两个应用程序窗口 我还在VisualStudio2010中尝试了MPI集群调试选项,但它也创建了两个进程 这似乎是一个非常基本的问题,但我发现在谷歌很难找到答案 编辑 为了消除这里的混乱,

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

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

我还在VisualStudio2010中尝试了MPI集群调试选项,但它也创建了两个进程

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

编辑

为了消除这里的混乱,我必须澄清几件事:

  • 我有一个非常复杂和庞大的代码库,它已经使用MS-MPI来实现并行性,我必须在此基础上构建一个MFC GUI。由于这个原因,我不能使用任何其他的并行机制,比如std::thread,因为这意味着我必须重写很多负担不起的东西
  • 据我所知,要启动MPI程序,我必须在Windows中运行名为mpiexec.exe的外部程序。我还没有弄清楚是否有可能单独启动该程序,并且仍然可以实现MPI功能。我对MPI还很陌生。我不太确定是否有可能实现我的要求。如果不是,如果有人能告诉我原因和可能的解决方法,我将非常感激 简单地说,我想为启用MPI的软件创建一个MFC GUI包装,它必须是一个多线程程序,而不是这个GUI包装程序的多个实例(进程)(例如,通过mpiexec-n 2 xxx.exe运行这个程序只会创建同一程序的两个实例)

    我想在单击“运行”按钮后创建2个线程”

    由于您有VS 2010,我不确定std::thread是否兼容。您可以使用以下方法-

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

    您可以使用
    PostThreadMessage
    API在各种MFC线程之间传递信息,即从GUI到业务逻辑,然后再到MPI线程

    当然,如果您的编译器支持
    std::thread
    ,那就是正确的选择


    <> >与<代码> STD::线程< /代码>,通常最正确的实现方法是使用<代码> STD::AsYNC 。在有效的现代C++中阅读基于线程的编程与基于任务的编程。< P> >我猜您正在为一些MPI软件创建某种图形前端。wo选项

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

    选择2 您需要确保只在一个MPI实例上启动GUI。您可以通过在启动期间从MPI中查找当前程序的ID来完成此操作,如果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的实例都将等待消息并处理它们,直到消息终止。

    您为什么坚持使用MPI?您有没有红色std::thread?如果现有的代码库没有使用MPI实现,我不会坚持使用MPI。现在我需要为这段代码构建一个GUI,这就是为什么我在这里结束的原因-我问题中的描述只是一个简化的场景。那么,现有的代码库是MPI吗?如果不是,那么我建议使用std::thread,除非您有具体的说明使用MPI的原因是的,现有的代码库是MPI。所以我没有选择。我在上面的评论中说,我的问题的描述只是一个简化的场景-其他人更容易理解我的问题。但是实际的代码库比这复杂得多,我无法使用std::thread.Thank重写所有内容s、 但是我不能使用其他API或库来实现并行性,因为我在问题的评论和编辑中已经解释了这个原因。另外,我没有否决你的答案。我想你建议使用MFC线程或std::thread来重新实现我现有代码库的并行性部分,这就是为什么我说这不是选项b因为这将涉及大量的工作。现在我才意识到/理解您实际上是建议使用单独的线程来启动我的MPI软件。这类似于Emily L的回答中的选项1。谢谢。@新手尽量保持现代C++11风格。您稍后会感谢您的选择。但我不太确定如何执行在实践中实现这个想法。要使用MS-MPI运行MPI程序,我想我必须先使用mpiexec.exe启动可执行文件,然后如果我传递参数-n 2 myprogram.exe,它将只创建整个程序的两个实例,并且在每个程序(进程)中,然后它将创建一个GUI线程和一些业务逻辑线程,这不是我真正想要的…我认为我们的误解来自这里…这正是我所要求的。这是否意味着在运行MPI应用程序时总是会有多个进程而不是线程?是的,您可以在HPC cl中启动任意多个进程但只有第一个启动的用户才能获得gui。