性能问题:就地指针数组与值数组反转

时间:2011-01-11 10:29:03

标签: c++ performance pointers matrix inversion

提出这个问题的背景是我正在求解线性化方程系统(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]等旁边。

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

3 个答案:

答案 0 :(得分:2)

测试,测试,测试。

特别是在数值线性代数领域。游戏中有许多效果,这就是为什么有许多优化的库可以解决你的负担。

需要考虑的一些影响:

  • 内存位置和缓存效果
  • 多线程效果(某些算法在运行单核时最佳,在使用多个核心时导致内存冲突/缓存逐出)。

没有替代测试。

答案 1 :(得分:1)

以下是一些评论:

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

因此,当您选择指针解决方案时,您将获得以下一组权衡:

  • 构成矩阵A的系数不能再与矩阵求逆异步计算。
  • 每次迭代都必须重新计算所有系数(当使用原位反转时,意味着反转矩阵使用与输入矩阵相同的内存),或者您仍然需要使用矩阵N x N值用于保持反演结果。

答案 2 :(得分:0)

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

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

您不知道大部分时间是用于矩阵求逆,乘法,复制矩阵,解除引用还是什么。人们可以猜到。如果我不得不猜测,它将是矩阵求逆,因为它是100x100。 然而,我猜不出的其他东西可能更大。 猜测的记录非常糟糕,特别是当你可以找出时。

Here's an example of what I mean.