【发布时间】: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
在“表 3:实现数据结构的程序的相对内存使用情况”中:
std::vector
此外,在论文的第 7 页,还有以下内容 声明:
“尽管 std::vector 的内存性能令人印象深刻,但其糟糕的时间性能使其无法在大规模应用程序中使用。”
在结论中:
“我们已经证明 boost::dynamic_bitset 在执行速度方面比大多数其他实现要高效得多,而使用 std::vector
的实现在内存效率方面优于其他实现。”
现在,就我而言,我的目标机器是 XEON PHI。
我的目标应用程序是Game Of Life。
我已经将二进制矩阵表示为 ROWS x COLS 单元的二进制数组。
我已经尝试了 3 种不同配置的代码,使用带有 -O3 优化标志的 -the icpc 编译器构建它们:
- 布尔数组
- 布尔数组 + 矢量化,即使用 Array Notation 更改代码,如 here 所述
-
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 的两倍。
最后,我有以下问题要问:
- 一般来说,存储/使用 HUGE MATRIX 最有效的数据结构是什么?
- 知道我的目标机器是 XEON PHI,我能否做得比 “answer 1” 更好?
- 是否可以将 vectorization 应用于 vector
或 boost::dynamic_bitsets ?
感谢您对特定目标应用程序的回答:生命游戏。
但是,在其他环境中使用巨大的二进制矩阵呢?
【问题讨论】:
-
您忘记了最重要的信息——您是否在构建程序时启用了优化?如果没有,那么整个帖子就没有实际意义了。
-
Bill Gosper 的* 论文 Exploiting regularities in large cellular spaces 您可能会感兴趣。
-
*是的,这就是滑翔机枪声名远播的老话。
标签: c++ matrix boost xeon-phi binary-matrix