使用MPI在c ++中并行for循环
parallel for loop in c++ using 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
块,并让每个线程处理不同的块。
我是否需要保留一个核心来将作业广播到其他核心?我可以遍历分区吗?我在网上搜索过,但运气不佳。有什么建议么?
当代码的 MPI 部分开始时,将其视为处理器上的独立程序 运行。这意味着您编写的循环在两个处理器上都是 运行 独立的。例如,拆分它的一种方法是
for ( int i = rank*partition; i <= rank*partition+partition; i++ )
{
a.do_something()
}
此外,在使用 N 之前声明它:-)
一个简单的方法是:
for ( int i = 0; i <= N; i++ )
{
if (i% numprocs != procid) continue;
a.do_something()
}
我试图在 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
块,并让每个线程处理不同的块。
我是否需要保留一个核心来将作业广播到其他核心?我可以遍历分区吗?我在网上搜索过,但运气不佳。有什么建议么?
当代码的 MPI 部分开始时,将其视为处理器上的独立程序 运行。这意味着您编写的循环在两个处理器上都是 运行 独立的。例如,拆分它的一种方法是
for ( int i = rank*partition; i <= rank*partition+partition; i++ )
{
a.do_something()
}
此外,在使用 N 之前声明它:-)
一个简单的方法是:
for ( int i = 0; i <= N; i++ )
{
if (i% numprocs != procid) continue;
a.do_something()
}