使用HUGE二进制矩阵的最有效方法是什么?

时间:2015-12-30 17:55:04

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

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

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

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

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

此外,在论文第7页,有以下内容 语句:

  

"尽管std :: vector具有令人印象深刻的内存性能,但其令人沮丧的时间性能使其无法在大规模应用程序中使用。"

在结论中:

  

"我们已经证明,就执行速度而言,boost :: dynamic_bitset比大多数其他实现更有效,而使用std :: vector< char>的实现则更高效。在内存效率方面优于其他实现。"

现在在我的情况下,我的目标机器是 XEON PHI 我的目标应用是Game Of Life 我已将二进制矩阵视为ROWS x COLS单元格的二进制数组。

我尝试了3种不同配置的代码,使用 icpc 编译器将其强化为 -O3 优化标记:

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

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

    使用 std :: vector< bool> 时出现同样的错误。

  4. 考虑到游戏主循环的一次迭代对于100000 x 100000大小的矩阵的性能,我发现:解决方案2 的工作速度几乎是解决方案1的六倍,但意外解决方案1 ​​的工作速度比解决方案3 快两倍。

    总之,我有以下问题要做:

    1. 一般来说,使用 HUGE MATRIX 存储/使用最有效的数据结构是什么?
    2. 我能否做到比"回答1" 更好,因为我知道我的目标机器是 XEON PHI
    3. 是否可以将矢量化应用于 vector< bool> boost :: dynamic_bitsets
    4. 感谢有关特定目标应用的答案:生命游戏 但是在其他环境中使用巨大的二进制矩阵呢?

1 个答案:

答案 0 :(得分:1)

如果你真的关心Conway生命游戏中的表现,你应该切换到纯粹的并行布尔数学设计。计算8个邻居的简单任务作为并行布尔运算非常困难,但值得一试。单向的64路直接并行性可以回报按位成本的倍数。

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

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

当我几十年前在汇编程序中这样做时,我发现一个重要的优化是在连续行之间共享信息。这样做时,更容易看到九个单元格而不是八个邻居的总数。因此,可以帮助实现规则可以兼容重述:
当它的9组中有3个时,一个单元格打开(无论它之前是否打开) 如果9组中有4个,则单元格不变 否则它会关闭。

跨行共享信息的方式在很大程度上取决于几十年前该机器的asm语言和寄存器集。所以你可能会或者可能不会看到完整的9(而不是8个邻居)帮助你。

相关问题