我正试图使我的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
}
每次迭代只需将其数据打印到一个输出文件,这样的顺序也就不重要了。由于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
块,并让每个线程处理不同的块。
我需要保留一个核心来把工作广播给其他核心吗?我可以在分区上迭代吗?我在网上搜索,运气不太好。有什么建议吗?
发布于 2018-09-25 03:23:12
当代码的MPI部分启动时,请将其看作是运行在处理器上的独立程序。这意味着您编写的循环在两个处理器上独立运行。例如,分裂它的一种方法是
for ( int i = rank*partition; i <= rank*partition+partition; i++ )
{
a.do_something()
}
另外,在使用之前声明N:)
发布于 2020-09-09 01:28:53
一个简单的方法是:
for ( int i = 0; i <= N; i++ )
{
if (i% numprocs != procid) continue;
a.do_something()
}
https://stackoverflow.com/questions/52496748
复制相似问题