【问题标题】:How to add two very large matrices efficiently? [closed]如何有效地添加两个非常大的矩阵? [关闭]
【发布时间】:2013-10-23 13:33:52
【问题描述】:

我有两个非常大的矩阵。问题是使用for 循环添加它们需要时间。我开始知道我们可以在 C++ 中使用运算符重载来添加矩阵。这样做会减少执行时间吗?

【问题讨论】:

  • 太糟糕了,这不是“StatementOverflow” 你能把你的陈述改写成一个问题吗? stackoverflow.com/questions/how-to-ask
  • 使用按位运算符或查找表或量子计算机添加它们也需要时间。首先也是最重要的:问问自己所做的任何事情的好处;如果它使您的执行时间缩短了 1%,但代码的可读性降低了 30%,请不要这样做。先看看其他热点。如果它花费您 1% 的执行时间,但产生 20% 更好的可读性代码,请考虑一下。始终考虑收益与成本,不要猜测,而是使用事实,或者只是尝试并衡量(尽管尝试会花费你一点)。 /哲学的
  • @phresnel:你没有做过很多性能关键的线性代数,比如 3D 渲染,是吗?这些可能是相当昂贵的操作......一般来说,这是某些项目中的前期设计原则。它不需要花费测量时间来获得显而易见的证据。
  • @LaszloPapp:哦,碰巧我有:ABCD。但是,我认为您错过了我的帖子的重点。你写It is generally speaking, an up-front design principle in certain projects:但是什么你声称我想念的前期设计原则是什么?证明什么显而易见?还是我只是您评论的错误收件人?
  • @phresnel:嗯,上下文是关于性能优化的……某些项目有一些指导方针,尤其是 3D 做什么和不做什么。不需要为相同的性能问题获得第 1000 次证明。那将是一个如此总的时间浪费。 ;-)

标签: c++ arrays matrix


【解决方案1】:

将循环移动到重载的运算符中没有任何区别。

提高性能的一种方法是为此使用专门的库,例如BLAS。高质量的 BLAS 实现(例如,Intel's MKL)将比您可能手动编写的任何代码快得多。

有关 BLAS 的 C++ 包装器的一些指示,请参阅LAPACK wrappers for C/C++(问题是关于 Windows,但答案比这更广泛)。

【讨论】:

  • 你知道它的表现如何与例如特征?
  • @LaszloPapp:没有使用 eigen 的经验,但看起来 OP 应该检查一下。
【解决方案2】:

运算符与 C++ 中的所有其他函数一样被处理,因此仅将添加函数更改为运算符而不更改逻辑将无济于事。

您可能需要使用某种 SIMD 计算。

【讨论】:

    【解决方案3】:

    一种方法是使用 x86 扩展中可用的向量运算符。检查此以获取示例http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example

    如果您使用 gnu 或 Visual Studio,它们可能具有内置的内在函数,您可以将其作为函数调用,而不是在汇编中编码。

    【讨论】:

      【解决方案4】:

      将您的矩阵放入 valarray 或为此使用专门的库,例如 eigen。 Blas 很丑陋,如果您无法访问商业实现,那么性能就不会特别好。

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        相关资源
        最近更新 更多