【问题标题】:Most efficient way to work with HUGE binary matrix?使用 HUGE 二元矩阵的最有效方法?
【发布时间】:2016-04-04 17:28:18
【问题描述】:

我有一个巨大的二进制矩阵,例如 100000 x 100000

阅读这篇文章http://www.cs.up.ac.za/cs/vpieterse/pub/PieterseEtAl_SAICSIT2010.pdf,我似乎明白记忆和使用二进制矩阵的最佳权衡是使用boost::dynamic_bitsets

因为在“表2:实现数据结构的程序的相对时间性能”std::vector 位于最后,而 boost::dynamic_bitset 位于第一位。

“表 3:实现数据结构的程序的相对内存使用情况”中std::vector 位于第一位,但 boost::dynamic_bitset 位于第二位。

此外,在论文的第 7 页,还有以下内容 声明:

“尽管 std::vector 的内存性能令人印象深刻,但其糟糕的时间性能使其无法在大规模应用程序中使用。”

在结论中:

“我们已经证明 boost::dynamic_bitset 在执行速度方面比大多数其他实现要高效得多,而使用 std::vector 的实现在内存效率方面优于其他实现。”

现在,就我而言,我的目标机器是 XEON PHI
我的目标应用程序是Game Of Life
我已经将二进制矩阵表示为 ROWS x COLS 单元的二进制数组。

我已经尝试了 3 种不同配置的代码,使用带有 -O3 优化标志的 -the icpc 编译器构建它们:

  1. 布尔数组
  2. 布尔数组 + 矢量化,即使用 Array Notation 更改代码,如 here 所述
  3. boost::dynamic_bitsets。在这种情况下,我无法使用数组表示法更改代码,因为当我尝试时,我收到以下错误:

    error: base of array section must be pointer or array type
    

    使用 std::vector 时同样的错误。

对于 100000 x 100000 大小的矩阵,仅查看游戏主循环的一次迭代的性能,我发现:解决方案 2 的工作速度几乎是 解决方案 1 的六倍,但出乎意料的是,solution 1 的运行速度是 solution 3 的两倍。

最后,我有以下问题要问:

  1. 一般来说,存储/使用 HUGE MATRIX 最有效的数据结构是什么?
  2. 知道我的目标机器是 XEON PHI,我能否做得比 “answer 1” 更好?
  3. 是否可以将 vectorization 应用于 vectorboost::dynamic_bitsets

感谢您对特定目标应用程序的回答:生命游戏。
但是,在其他环境中使用巨大的二进制矩阵呢?

【问题讨论】:

  • 您忘记了最重要的信息——您是否在构建程序时启用了优化?如果没有,那么整个帖子就没有实际意义了。
  • Bill Gosper 的* 论文 Exploiting regularities in large cellular spaces 您可能会感兴趣。
  • *是的,这就是滑翔机枪声名远播的老话。

标签: c++ matrix boost xeon-phi binary-matrix


【解决方案1】:

如果您真的关心康威生活游戏中的性能,您应该改用纯粹的并行布尔数学设计。计算 8 个邻居的简单任务作为并行布尔运算非常困难,但值得一试。仅 64 路直接并行就可以支付数倍的按位成本。

在具有相同基本设计的某些 CPU 上,您可能具有一些 128 位或更高的直接并行性。

一旦您使用 64 位或更大的整数而不是布尔值,所有有效存储布尔值的问题都变得无关紧要。

几十年前我在汇编程序中这样做时,我发现一个重要的优化是在连续行之间共享信息。这样做时,查看总共九个单元的块而不是八个相邻单元变得更容易。所以它可能有助于实现规则可以兼容地重述:
当 9 个单元中有 3 个时,一个单元会打开(无论之前是否打开)。
当它的 9 个集合中有 4 个时,一个单元格保持不变。
否则它会关闭。

跨行共享信息的方式在很大程度上取决于几十年前该机器的 asm 语言和寄存器集。因此,您可能会也可能不会发现查看完整的 9 个(而不是 8 个邻居)对您有帮助。

【讨论】:

  • 我认为使用记忆/预先计算的单元配置可以更快地优化康威的生活游戏。
  • 如果你关心生活的表现,你可能想要这样做。但是,如果您关心“真的”全大写粗体,您可能会想跳过微优化并使用 Gosper 的 HashLife 算法,这可能会使这种微优化毫无意义。 HashLife 在这里的规模完全不同。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多