关于解决并行化问题的一般问题

时间:2011-03-27 12:57:48

标签: c openmp mpi

我有一个关于C中并行算法编程的一般性问题。让我们假设我们的任务是用MPI和/或OpenMP实现一些矩阵算法。在某些情况下,例如OpenMP或MPI中的虚假共享,其中通信依赖于矩阵维度(在进程之间循环分布的列)而产生,这会导致一些问题。例如,通过转置矩阵来解决这种情况是不是一个好的和共同的尝试,因为这会减少必要的通信甚至避免错误的共享问题?之后你将撤消换位。当然,假设这会导致更好的加速。 我不认为这会非常狡猾,更多的是懒惰的方式来做到这一点。但我很想读一些关于此的观点。

3 个答案:

答案 0 :(得分:3)

让我们先从第一个问题开始:转置是否有意义?答案是,这取决于,你可以估计它是否会改善。

转换/重传与一次性内存带宽成本为2 *(通过内存快速方式)+ 2 *(通过内存缓慢的方式)这些内存操作实际上是多核情况下的内存操作,或分布式内存中的网络通信。你将以快速的方式读取矩阵,并以缓慢的方式将其放入内存中。 (你可以通过一次读取一个缓存大小的块中的矩阵,在缓存中转置,然后按顺序写出)来实现4 *(通过内存快速方式)。

这是否胜利取决于您将访问阵列的次数。如果您在“错误”方向上进行了4次内存访问,那么你将完全击中整个非转置阵列,那么你将通过两个转置显然获胜。如果你只是在错误的方向上经过非转置阵列,那么你几乎肯定不会通过换位获胜。

对于更大的问题,@ AlexandreC绝对正确 - 尝试实现自己的线性代数例程是疯狂的。看一下,例如,How To Write Fast Numerical Code,图3;在幼稚和高调(例如)GEMM操作之间可能存在40个性能因素。这些东西的内存带宽很高,而且并行意味着网络受限。到目前为止,最好是使用现有工具。

对于多核线性代数,现有的库包括

对于MPI实现,有

或完整的求解器环境,如

答案 1 :(得分:0)

我不知道你在完成操作的第二个时间内抛出了转置,但是这是增加并行性的有效机制。

我不是专家;我只阅读了一些关于这个主题的内容,甚至那是针对SIMD架构的,所以请轻视我的意见......但我认为通常的机制是将你的结构放在内存中以匹配机器(所以你'转换一个大矩阵以更好地与你的向量对齐并增加你的循环中的依赖距离),然后你还构建一个指针的索引结构,以便你可以快速访问转置中的各个元素。随着您的输入动态变化,这变得更加困难。

答案 2 :(得分:0)

  

我不认为这会非常狡猾,更多的是懒惰的做法。

懒惰解决方案通常比“狡猾”解决方案更好,因为它们往往更简单直接。因此,它们更易于实施,记录,理解和维护。事实上,懒惰可以说是程序员可以拥有的最伟大的美德之一。只要程序以可接受的速度产生正确的结果,没有人应该关心你如何优雅地解决问题(包括你)。