Ama*_*ama 8 parallel-processing performance mpi openmpi
通常,并行代码是否可能比串行代码慢?我是,我真的很沮丧!我能做什么?
dre*_*ash 14
确定并行模型性能的其他3个关键因素是:
• Parallel task granularity;
• Communication overhead;
• Load balancing among processes.
Run Code Online (Sandbox Code Playgroud)
并行任务粒度
并行任务的粒度必须足以超越并行模型开销(并行任务创建和它们之间的通信).由于与线程同步相比,通信开销通常优于分布式存储器(DM)模型中的进程,因此进程必须具有更高的任务粒度.这种粒度也不应该危及负载平衡.
tl; dr:您的并行任务必须"足够大"才能证明并行化的开销.
通信开销
每当一个进程打算与其他进程通信时,它就有创建/发送消息的成本,并且在使用synchronous communication例程的情况下,还有等待其他进程接收消息的成本.因此,要使用MPI提高应用程序的性能,必须减少进程之间交换的消息量.
您可以在进程之间使用计算冗余,而不是等待来自某个特定进程的结果,此结果可以直接在每个进程中执行.当然,当交换结果的开销与其自身计算所消耗的时间重叠时,这通常是合理的.另一个解决方案可能是通过替换synchronous communicationfor asynchronous communication.在synchronous communication发送消息的过程中,等待直到另一个进程收到消息,然后在asynchronous communication该过程中从发送调用返回后立即恢复执行.因此,与计算重叠通信.然而,为了利用asynchronous communication它可能有必要重写应用程序,也可能仍然难以实现良好的重叠率.
通过使用更高性能的通信硬件可以提高通信性能,但可能会变得昂贵.集体通信也可以提高通信性能,因为它可以根据硬件,网络和拓扑优化通信.
tl; dr:减少并行任务之间的通信和同步量.使用:冗余计算,异步通信,集体通信和更快的通信硬件.
进程之间的负载平衡
良好的负载平衡至关重要,因为它可以最大限度地并行完成工作.负载平衡受进程之间的任务分配和应用程序运行的资源集的影响.
在以固定资源集运行的应用程序中,您应该关注任务分发.如果任务具有大致相同的计算量(例如,对于迭代),则仅需要在进程之间执行最平等的任务分配.
但是,某些应用程序可能在具有不同速度的处理器的系统中运行,或者它可能具有具有不同计算量的子任务.对于这种情况,为了促进更好的负载平衡,farming model可以使用任务,因为它可以用动态任务分配来实现.但是,在此模型中,使用的通信量可能会危及效率.
其他解决方案是手动执行任务分配的调整.这可能会变得复杂而艰难.但是,如果资源集不是速度同构的并且在应用程序执行之间不断变化,则可能危及任务分发调整的性能可移植性.
tl; dr:每个过程应该大致在同一时间完成他们的工作.
| 归档时间: |
|
| 查看次数: |
4414 次 |
| 最近记录: |