在C ++中使用并行处理加速矩阵计算?

时间:2011-03-24 19:36:02

标签: c++ matrix parallel-processing multiplication

我正在尝试计算以下内容:

Y = Y0 - (Un。(A * Y0)+ Vn。(Y0 * Z))* dt

以最快/最有效的方式,其中Y0,Un,Vn,A和Z是尺寸为300×300的矩阵,“。”是矩阵点乘积,“*”表示矩阵乘法。

我的问题是:

  1. 计算计算独立的子矩阵A2 = A * Y0和Z2 = Y0 * Z,然后Un2 = Un。* A2和Vn2 = Vn。* Z2,并行比串行计算它们更快,例如Y = Y0 - (Un2 + Vn2)* dt?如果是这样,那么并行计算将如何完成的一个很好的例子呢?

  2. 是否有其他更好/推荐的方法(例如,使用ATLAS)?

  3. 该语言是C ++,它将在具有多核(至少双重)处理器的Linux或Windows平台上运行。我目前正在使用BOOST uBLAS作为BLAS包。

4 个答案:

答案 0 :(得分:1)

OpenMP应该是一种快速简便的方法,可以看出并行路线是否会更快。

答案 1 :(得分:1)

我同意@genpfault,在我运行几个循环的实验中,我正在使用OpenMP,它非常有用且更易于使用!这是chryswoods' blog,OpenMPs基础知识的链接,它是我见过的最简单的教程之一。

答案 2 :(得分:0)

你的问题非常小。你应该尝试使用像Eigen这样的东西(或者你提到的ATLAS)。我更喜欢Eigen,因为它使用起来很快。

答案 3 :(得分:0)

当尝试将相似矩阵与boost ublas相乘时,我得到〜3GFLOPS。实现缓存感知矩阵乘法使我达到了约12GFLOPS。与OpenMP并行实现缓存感知乘法使我达到了约30GFLOPS(4核,2线程/核)

因此,首先,您应该确保使用的是可感知缓存的矩阵乘法算法(或者,如果愿意,可以忽略缓存)。然后可以并行化,但是您希望使并行度尽可能地粗糙,否则阿姆达尔定律将对您不利。

一个好的经验法则是选择一个需要至少1s来执行的工作单元,并将其并行化。在这里,矩阵乘法只需要几毫秒,所以我肯定会选择更大的值。例如,您可以尝试并行计算多个批次,而不是尝试并行化Y的单个计算。