2

我是并行计算和寻找选项和技巧的新手。

我现在的问题是找到 2 32 个B = AX 类型的独立线性方程;其中 A[8x8]、B[8x1] 和 X[8x1] 的尺寸;A 是密集矩阵。

我在 Intel core 7i 处理器、4 核、8 线程和 Mac 机器上按顺序使用 CLAPACK - zgelss 函数。

此外,我的矩阵大小似乎足够小,可以使用内部优化。

我想在这个循环上应用并行性:

for (n = 0; n < 2^32; n++)
{...}

我想问我有什么选择来做到这一点。

一些人建议使用OpenMP,但在阅读了 OpenMP 之后,我发现我们无法将 OpenMP 指令应用于预编译的代码部分。

如果我们这样做,它可以工作,但它可能不安全,因为您不能将预编译函数中的临时变量私有化。{请评论对/错/其他}

所以我想问一下,如果可能的话,怎么做。一些技巧......任何东西......

4

2 回答 2

1

确实,除非您知道要调用的库是线程安全的,否则您不能只对它进行线程调用。但是,从 Lapack 3.3 开始,所有lapack 调用都是线程安全的(尽管如果您使用不同的底层 BLAS 包来支持 lapack 例程,则必须确保它们也是线程安全的)。Clapack 只是 lapack 调用的一层薄薄的包装器;它们应该是线程安全的[编辑:这是错误的,正如下面的 janneb 指出的那样;Clapack 是对旧版本 Lapack 的直接自动 C 翻译,因此它可能不是线程安全的] ,但如果您在文档中找不到任何关于它的内容可以确定,那么调用直接使用 Fortran 例程。

另一种方法是在不同的进程而不是线程中进行各种函数调用。这需要做更多的事情,但这很容易。规范的方法是使用 MPI——它具有一定的优势,但在这种情况下可能有点矫枉过正。

于 2011-08-23T15:12:55.580 回答
0

在 Jonathan 和 janneb 提供的信息的帮助下,我能够使用 openMP 成功地并行化函数 zgelss。

我使用 LAPACK 3.3 并创建了自己的 FORTRAN 到 C 接口。

于 2011-08-29T08:58:55.433 回答