【发布时间】:2016-07-20 18:31:30
【问题描述】:
我曾经取对称(Hermitian)矩阵的总和(该矩阵在std::vector 中),这是一个巨大的浪费,因为虚部总是会加到零(我说的是巨大的矩阵n>1000 的边长,所以我认为这会有所不同。
所以现在我只添加矩阵的上三角部分。但我想进一步优化这一点,避免添加复杂的部分,因为我不需要它。
我目前使用的是:
std::real(std::accumulate(myMatrix.begin(), myMatrix.end(), std::complex<Real>(0,0)));
这会将myMatrix 的所有元素添加到std::complex<Real>(0,0),得到我需要的总和。
但这会添加我的向量的实部和虚部,这是一种浪费!如何编写仅添加此矩阵的实部的最优化版本?
更新:
虽然我接受了有效的答案,但我发现它比对矩阵的实部和虚部求和要慢。对于边长为 128 的矩阵,它慢了 5%-10%。这令人惊讶。任何其他更快的建议都将受到高度赞赏。
如果您需要更多信息,请询问。
【问题讨论】:
-
如果你
-1这个帖子请解释一下。我将不胜感激。 -
您是否考虑过基于 std::thread 的并行或 cuda?另外,对于一个对称矩阵,你只需要访问 n(n-1)/2 个元素,而不是 n*n 个元素来进行累加。
-
@FengWang 实际上我正在使用 OpenMP 进行并行化,并且我已经访问了 n(n-1)/2 个元素 :)
-
对于大型数组的简单聚合,性能瓶颈确实在于内存带宽。
Real是多少字节?如果Real定义为 4 字节浮点数,则 64 位机器加载 8 个对齐字节的速度可能与其前 4 个字节一样快。您可以通过将 myMatrix 分成实部和虚部来测试这一点,两者都由std::vector<float>表示,然后只聚合实部,但如果您不必在不同的表示之间进行大量转换,这将是有益的。跨度>
标签: c++ c++11 matrix vector complex-numbers