使用MPI在c ++中并行进行循环

时间:2018-09-25 11:08:27

标签: c++ parallel-processing mpi

我正在尝试在c ++中使for循环并行。迭代是完全独立的。下面是捕获任务概念的类似程序。

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
}

每次迭代都将简单地将其数据打印到输出文件中,其顺序也不重要。由于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
}

但是我真的很努力地拆分for循环,并且不知道如何进行。

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

我需要保留一个核心以将作业广播到其他核心吗?我可以遍历分区吗?我已经在网上搜索,运气还不太好。有什么建议么?

2 个答案:

答案 0 :(得分:0)

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

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

{
    a.do_something()
}

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

答案 1 :(得分:0)

一种简单的方法是:

for ( int i = 0; i <= N; i++ )
{
   if (i% numprocs != procid) continue;

   a.do_something()
}