使用 MPI 在 C++ 中并行 for 循环

Ang*_*Man 2 c++ parallel-processing mpi

我正在尝试使我的for循环在 C++ 中并行。迭代是完全独立的。下面是一个类似的程序,它体现了该任务的想法。

class A{

    // create experiment 
    // perform experiment
    // append results to file 
    // reset the experiment 

};

main {

    // open a file 

    // instance class
    A a;
    int N = 10000;

    for ( int i = 0; i <= N; i++ ){
        a.do_something()
    }

    // close file
    // return
}
Run Code Online (Sandbox Code Playgroud)

每次迭代都会简单地将其数据打印到输出文件中,其顺序也不重要。由于a.do_something()篇幅较长,我想将其并列。我已经安装了MPI并且现在已经熟悉了它的基本用法。

N我的逻辑是根据可用处理器的数量将范围划分为多个分区。我正在寻求一些有关如何将我的串行版本与 MPI 并行的帮助。我的尝试是:

class A{

    // create experiment 
    // perform experiment
    // append results to file 
    // reset the experiment 

};

main {

    // open a file 

    // instance class
    A a;


    // initialise the MPI 
    int ierr = MPI_Init(&argc, &argv);
    int procid, numprocs;

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &procid);
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    // partition = (job size) over (processors). 
    unsigned int partition = N / numprocs;


    int N = 10000;

    for ( int i = 0; i <= N; i++ ){
        a.do_something()
    }



    ierr = MPI_Finalize();
    // close file
    // return
}
Run Code Online (Sandbox Code Playgroud)

但我真的很难分割 for 循环,并且不知道如何继续。

这只会运行串行代码两次(在我的 2 核机器上)。我想将 for 循环分成N/2多个块,并让每个线程处理不同的块。

我是否需要保留一个核心来将作业广播给其他核心?我可以迭代分区吗?我在网上搜索过,但运气不佳。有什么建议么?

joh*_*ohn 5

当代码的 MPI 部分启动时,将其视为在处理器上运行的独立程序。这意味着您编写的循环在两个处理器上独立运行。例如,一种分割方法是

for ( int i = rank*partition; i <= rank*partition+partition; i++ )

{
    a.do_something()
}
Run Code Online (Sandbox Code Playgroud)

另外,在使用之前声明 N :-)