2

我有 3 个功能和 4 个核心。我想使用 MPI 和 C++ 在新线程中执行每个函数我写这个

int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
size--;
if (rank == 0)
{
    Thread1();
}
else 
{
    if(rank == 1)
    {
        Thread2();
    }
    else
    {
        Thread3();
    }
}
MPI_Finalize();

但它只执行 Thread1()。我必须如何更改代码?

谢谢!

4

2 回答 2

6

打印以筛选变量的当前值size(可能不递减),您会发现1. 即:“有1进程正在运行”。

您可能以错误的方式运行已编译的代码。考虑使用mpirun (或mpiexec,取决于您的 MPI 实现)来执行它,即

 mpirun -np 4 ./MyCompiledCode

-np参数指定您将启动的进程数(这样做,您 MPI_Comm_size将是 4,如您所愿)。


但是,目前,由于 C++,您没有明确使用任何东西。您可以考虑 MPI 的一些 C++ 绑定,例如Boost.MPI.


我对您提供的代码做了一些工作。我对其进行了一些更改,以生成 工作mpi 代码(我以大写字母提供了一些需要的更正)。

供参考:

  • 编译(在 gcc、mpich 下):

     $ mpicxx -c mpi1.cpp 
     $ mpicxx -o mpi1 mpi1.o
    
  • 执行

    $ mpirun -np 4 ./mpi1
    
  • 输出

    size is 4
    size is 4
    size is 4
    2 function started.
    thread2
    3 function started.
    thread3
    3 function ended.
    2 function ended.
    size is 4
    1 function started.
    thread1
    1 function ended.
    

请注意,这stdout可能会搞砸。

您确定以正确的方式编译代码吗?

于 2012-10-28T13:00:42.210 回答
2

您的问题是 MPI 无法将控制台输入提供给许多进程,而只能提供给具有 rank 的进程0。由于 中的前三行main

int main(int argc, char *argv[]){

    int oper;
    std::cout << "Enter Size:";
    std::cin >> oper;           // <------- The problem is right here

    Operations* operations = new Operations(oper);
    int rank, size;
    MPI_Init(&argc, &argv);
    int tid;
    MPI_Comm_rank(MPI_COMM_WORLD, &tid);
    switch(tid)
    {

所有进程,但排名0块等待他们无法获得的控制台输入。您应该main如下重写函数的开头:

int main(int argc, char *argv[]){

    int oper;

    MPI_Init(&argc, &argv);
    int tid;
    MPI_Comm_rank(MPI_COMM_WORLD, &tid);

    if (tid == 0) {
       std::cout << "Enter Size:";
       std::cin >> oper;
    }
    MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);

    Operations* operations = new Operations(oper);
    switch(tid)
    {

它的工作原理如下:仅 rank0显示提示,然后将控制台输入读入oper. 然后广播operfrom rank的值,0以便所有其他进程获得正确的值,创建Operations对象,然后分支到适当的函数。

于 2012-10-29T13:39:08.287 回答