1

问这个问题的背景是我正在求解一个线性化方程组(Ax=b),其中 A 是一个矩阵(通常尺寸小于 100x100),x 和 b 是向量。我使用的是直接方法,这意味着我首先反转 A,然后通过 x=A^(-1)b 找到解决方案。该步骤在迭代过程中重复,直到收敛。

我现在使用矩阵库(MTL4)的方式:
对于每次迭代,我将 A(值)的所有系数复制到矩阵对象中,然后反转。这是最简单和最安全的选择。

改为使用指针数组:
对于我的特殊情况, A 的系数恰好在每次迭代之间更新。这些系数存储在不同的变量中(有些是数组,有些不是)。如果我将 A 设置为包含指向这些系数变量的指针的数组,然后将 A 就地反转,是否有可能提高性能?

最后一个选项的好处是,一旦我在第一次迭代之前在 A 中设置了指针,我就不需要在连续迭代之间复制任何值。在 A 中指向的值将在迭代之间自动更新。

所以性能问题归结为这一点,正如我所看到
的: - 矩阵求逆过程花费大致相同的时间,假设取消引用指针是不昂贵的。
- 指针数组不需要包含值的矩阵 A 的额外内存。
- 指针数组选项不必在每次迭代之间复制 A 的所有 NxN 值。
- 指向指针数组选项的值通常不在内存中排序。希望所有值在内存中都相对接近,但 *A[0][1] 通常不在 *A[0][0] 等旁边。

对此有何评论?最后一句话是否会对绩效产生负面影响,从而权衡积极的绩效影响?

4

3 回答 3

2

测试,测试,测试。

特别是在数值线性代数领域。有许多效果在起作用,这就是为什么有许多优化的库可以为您解决这个负担的原因。

需要考虑的一些影响:

  • 内存局部性和缓存效果
  • 多线程效果(一些在单核运行时最佳的算法,在使用多个内核时会导致内存冲突/缓存驱逐)。

没有什么可以替代测试。

于 2011-01-11T10:44:34.070 回答
1

以下是一些评论:

  • 您用于求逆的函数是否能够处理指针矩阵而不是值?如果它没有意识到它必须做一个间接的,各种奇怪的效果可能会发生。
  • 当进行就地矩阵求逆时(意味着求逆矩阵覆盖输入矩阵),所有输入系数都将被新值覆盖,因为矩阵求逆不能通过对矩阵元素重新排序来完成。
  • 在反演过程中,任何输入系数都不能被外部过程改变。所有此类更新都必须在迭代之间执行。

因此,当您选择指针解决方案时,您会得到以下权衡:

  • 构成矩阵 A 的系数不能再与矩阵求逆异步计算。
  • 每次迭代都必须重新计算所有系数(当您使用就地求逆时,意味着反矩阵使用与输入矩阵相同的内存),或者您仍然必须使用 N x N 值的矩阵来保存结果倒置。
于 2011-01-11T12:50:41.543 回答
0

你在这里得到了很好的答案。我唯一要补充的是一些有关性能的一般经验。

您正在考虑先验性能。这是合理的,但真正的回报是后验的。换句话说,在运行代码告诉您之前,您无法确定真正的优化机会在哪里。

您不知道大部分时间是否会花在矩阵求逆、乘法、复制矩阵、取消引用或什么上。人们可以猜测。如果我不得不猜测,那将是矩阵求逆,因为它是 100x100。但是,我无法猜测的其他事情可能更大。Guessing 的记录很差,尤其是当你能找出答案的时候。

这是我的意思的一个例子。

于 2011-01-11T13:38:05.387 回答