2

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

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

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

我的问题是:

  1. 正在计算计算独立的子矩阵 A2 = A*Y0 和 Z2 = Y0*Z,然后 Un2 = Un.*A2 和 Vn2 = Vn.*Z2,并行计算比串行计算更快,使得 Y = Y0 - ( Un2 + Vn2)*dt?如果是这样,如何进行这种并行计算的一个很好的例子是什么?

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

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

4

4 回答 4

1

OpenMP应该是查看并行路由是否更快的一种快速简便的方法。

于 2011-03-24T20:06:31.843 回答
1

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

于 2012-08-05T02:40:00.373 回答
0

你的问题很小。您应该尝试使用诸如 Eigen 之类的东西(或您提到的 ATLAS)。我更喜欢 Eigen,因为它使用起来很快。

于 2011-03-24T20:16:49.050 回答
0

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

所以首先,你应该确保你使用的是一种缓存感知矩阵乘法算法(或者如果你想把它变得花哨的话,也可以使用缓存不经意的算法)。然后你可以并行化,但你想让你的并行化尽可能粗粒度,否则阿姆达尔定律会打击你。

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

于 2020-02-06T07:29:44.080 回答