Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么并行代码比串行代码慢?_Performance_Parallel Processing_Mpi_Hpc_Processing Efficiency - Fatal编程技术网

Performance 为什么并行代码比串行代码慢?

Performance 为什么并行代码比串行代码慢?,performance,parallel-processing,mpi,hpc,processing-efficiency,Performance,Parallel Processing,Mpi,Hpc,Processing Efficiency,一般来说,并行代码是否可能比串行代码慢?我的是,我真的很沮丧!我能做什么?除其他外,决定并行模型性能的3个关键因素是: 并行任务粒度 通信开销 进程之间的负载平衡 并行任务粒度 并行任务的粒度必须足够大,以覆盖并行的开销(例如,并行任务的创建和它们之间的通信)。由于分布式内存(DM)模型中的进程的通信开销通常高于线程同步,因此进程应该具有更高的任务粒度。这种粒度也不应危及负载平衡 tl;dr:您的并行任务必须足够大,以证明并行化的开销是合理的 通信开销 每当一个进程打算与其他进程通信时,它

一般来说,并行代码是否可能比串行代码慢?我的是,我真的很沮丧!我能做什么?

除其他外,决定并行模型性能的3个关键因素是:

  • 并行任务粒度
  • 通信开销
  • 进程之间的负载平衡
并行任务粒度

并行任务的粒度必须足够大,以覆盖并行的开销(例如,并行任务的创建和它们之间的通信)。由于分布式内存(DM)模型中的进程的通信开销通常高于线程同步,因此进程应该具有更高的任务粒度。这种粒度也不应危及负载平衡

tl;dr:您的并行任务必须足够大,以证明并行化的开销是合理的


通信开销

每当一个进程打算与其他进程通信时,它就要承担创建/发送消息的成本,在
同步通信
例程的情况下,也要承担等待其他进程接收消息的成本。因此,为了使用MPI提高应用程序的性能,有必要减少进程之间交换的消息数量

您可以在进程之间使用计算冗余,而不是等待某个特定进程的结果,该结果可以直接在每个进程中执行。当然,当交换结果的开销与计算本身所花费的时间重叠时,这通常是合理的。另一种解决方案是将
同步通信
替换为
异步通信
。在
同步通信中
发送消息的进程等待另一进程接收消息,而在
异步通信中
从发送调用返回后,进程立即恢复执行。因此,通信与计算重叠。然而,为了利用
异步通信
可能需要重写代码,而且可能仍然难以实现良好的重叠率

通过使用更高性能的通信硬件可以减少通信开销,但结果可能会很昂贵。集体通信还可以提高通信性能,因为它基于硬件、网络和拓扑优化通信

tl;灾难恢复:减少并行任务之间的通信和同步量。使用:冗余计算、异步通信、集体通信和更快的通信硬件


进程间的负载平衡

一个好的负载平衡是必不可少的,因为它最大化了并行完成的工作。负载平衡受进程之间的任务分配和应用程序正在运行的资源集的影响

在一组固定资源中运行的应用程序中,您应该关注任务分布。如果任务具有大致相同的计算量(例如,对于迭代),则只需要在进程之间执行任务的最相等分布

但是,一些应用程序可能在具有不同速度处理器的系统中运行,或者可能具有不同计算量的子任务。对于这种情况,为了促进更好的负载平衡,可以使用task
farming模型,因为它可以通过动态任务分布来实现。然而,在这个模型中,使用的通信量可能会影响效率

另一个解决方案是手动执行任务分发的调优。这可能会变得复杂而困难。但是,如果资源集速度不均匀,并且在应用程序执行之间不断变化,则任务分布优化的性能可移植性可能会受到影响


tl;dr:每个进程完成其工作所需的时间应大致相同。

正如其他人所指出的,并行代码比串行代码慢有几个原因

如果您正在执行矩阵运算,您可能希望通过“阻塞”代码来更有效地利用cpu缓存。根据cpu缓存大小,您可能会获得高达3到4倍的性能改进。分块本质上是在小分片或块中处理矩阵,以便它们适合缓存内存。这减少了对主内存的读/写操作,提高了性能

另一种选择是使用GPU

上述解决方案在大部分计算用于浮点或整数运算的情况下运行良好


对于通用计算,理想情况下,您希望将应用程序设计为自适应的,以便在运行时确定分配工作负载是否会提高性能,并且仅在有利的情况下进行分配。

是的,这是可能的,尤其是在计算量较小的情况下。您可以增加MPI调用之间的计算量,减少屏障的数量,并使发送/接收调用更加同步。请提供有关问题的更多信息,并使您的问题更简洁。您是否可能在内核少于进程的计算机上运行并行代码?糟糕的并行化比根本没有并行化更糟糕。你可以随便引用我。。。