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

How to create a single process but multithreads MFC GUI application with MPI?

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

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

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

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

编辑

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

  1. 我有一个非常复杂和庞大的代码库,它已经使用 MS-MPI 来实现并行性,我必须在它之上构建一个 MFC GUI。出于这个原因,我不能使用任何其他并行机制,例如std::thread,因为这意味着我必须重写很多负担不起的东西。
  2. 据我了解,要启动 MPI 程序,我必须 运行 在 Windows 中调用名为 mpiexec.exe 的外部程序。我还没有弄清楚是否可以自己启动程序并仍然实现 MPI 功能。 我对 MPI 很陌生。我不太确定是否有可能实现我的要求。如果不是,如果有人能告诉我原因和可能的解决方法,我将不胜感激。

简单地说,我想为支持 MPI 的软件创建一个 MFC GUI 包装器,这必须是一个多线程程序,而不是这个 GUI 包装程序的多个实例(进程)(例如 运行ning 这个mpiexec -n 2 xxx.exe 的程序只会创建同一程序的 2 个实例)

I'd like to create 2 threads after click a 'Run' button"

因为你有 VS 2010,我不确定 std::thread 兼容性。您可以按如下方式使用 MFC's threading API -

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

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

当然,如果你的编译器支持std::thread,那就是要走的路。

std::thread相关,通常最正确的实现方式是使用std::async。在 Effective Modern C++.

中阅读有关基于线程的编程与基于任务的编程的内容

我猜您正在为您拥有的某些 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 的实例都将等待消息并处理它们,直到它们终止。