繁体   English   中英

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

[英]Performance question: Inverting an array of pointers in-place vs array of values

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

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

测试,测试,测试。

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

需要考虑的一些影响:

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

不能替代测试。

这里有一些评论:

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

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

  • 组成矩阵A的系数不再可以与矩阵求逆异步计算。
  • 要么必须为每次迭代重新计算所有系数(当您使用就地求逆时,这意味着求逆矩阵使用与输入矩阵相同的内存),或者仍然必须使用N x N值的矩阵来保存结果。反转。

您在这里得到了很好的答案。 我唯一要添加的是性能方面的一般经验。

您正在考虑先验性能。 这是合理的,但真正的收益是后验的。 换句话说,直到运行的代码告诉您时,您才能确定真正的优化机会在哪里。

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

这是我的意思的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM