cpp*_*ame 1 c parallel-processing mpi openmp
我正在考虑为MPI实现一个模仿OpenMP并行化循环方式的包装器.
begin_parallel_region( chunk_size=100 , num_proc=10 );
for( int i=0 ; i<1000 ; i++ )
{
//some computation
}
end_parallel_region();
Run Code Online (Sandbox Code Playgroud)
上面的代码将for循环中的计算分配给10个从MPI处理器.在进入并行区域时,提供块大小和从处理器的数量.在离开并行区域时,MPI处理器被同步并被置于空闲状态.
编辑以回应高性能标志.
我无意模拟OpenMP的共享内存模型.我提出这个是因为我需要它.我正在开发一个从数学函数构建图形所需的库.在这些数学函数中,经常存在如下所示的循环.
for( int i=0 ; i<n ; i++ )
{
s = s + sin(x[i]);
}
Run Code Online (Sandbox Code Playgroud)
所以我想首先能够将sin(x [i])分发给从属处理器,最后减少到单个变量,就像在OpenMP中一样.
我想知道是否有这样的包装,所以我不必重新发明轮子.
谢谢.
没有这样的包装从研究实验室转移到广泛使用.你提出的建议不是重新发明轮子就像发明飞行汽车一样.
我可以看到你如何建议编写模拟OpenMP共享循环负担的方法的MPI代码,你不太清楚如何建议让MPI模拟OpenMP的共享内存模型?
在一个简单的OpenMP程序中,你可能会有10个线程,每个线程执行10%的大循环迭代,可能会更新大型(共享)数据结构的值.要在MPI中模拟你的狡猾包装内,你要么必须(i)说服单面通信表现得像共享内存(这可能是可行的并且肯定会很困难),或者(ii)将数据分发给所有进程,让每个进程独立地计算10%的结果,然后将结果全部广播,以便在执行结束时每个进程都拥有其他进程拥有的所有数据.
在分布式存储器硬件上模拟共享内存计算是并行计算的热门话题,始终如一,始终如一.谷歌为分布式共享内存计算加入了乐趣.
编辑
好吧,如果您分布x在各个流程中,那么单个流程可以计算sin(x[i]),您可以使用减少一个流程的总和MPI_Reduce.
我一定错过了一些关于你的要求的东西,因为我无法理解为什么你要在MPI已经提供的东西之上构建任何上层结构.然而,我对你原来问题的回答仍然是否定,没有你所寻求的包装,我的所有其余答案仅仅是评论.