如何记忆地图巨大的矩阵?

Tra*_*s3r 15 c++ mmap d

假设您有一个巨大的(40+ GB)特征值(浮点)矩阵,行是不同的特征,列是样本/图像.

该表是按列预先计算的.然后,它被完全访问行和多线程(每个线程加载整行)几次.

处理这个矩阵的最佳方法是什么?我特别琢磨超过5分:

  1. 由于它是在x64 PC上运行的,我可以一次性映射整个矩阵,但这有意义吗?
  2. 多线程的影响怎么样(多线程初始计算?)?
  3. 如何布局矩阵:行或列主要?
  4. 在预计算完成后,将矩阵标记为只读是否有帮助?
  5. 是否可以使用类似http://www.kernel.org/doc/man-pages/online/pages/man2/madvise.2.html来加快速度?

Phi*_*ler 5

内存映射整个文件可以使过程更容易.

您希望布置数据以针对最常见的访问模式进行优化.听起来好像数据将被写入一次(逐列)并多次读取(逐行).这表明数据应按行主顺序存储.

一旦完成预计算就将矩阵标记为只读可能无助于性能(有一些可能的低级优化,但我认为没有任何实现它们),但它会防止错误意外写入数据你不打算.不妨.

madvise 一旦你的应用程序被编写和工作,最终可能会变得有用.

我的总体建议:以最简单的方式编写程序,首先按顺序编写,然后将计时器放在整个事物和各种主要操作上.确保主要操作时间总和为总时间,因此您可以确定您没有遗漏任何东西.然后将您的性能改进工作定位到实际花费最多时间的组件上.

根据JimR在评论中提到的4MB页面,您可能最终想要查看hugetlbfs或使用具有透明大页面支持的Linux内核版本(合并为2.6.38,可能可以修补到早期版本).这可能会为您节省大量TLB未命中,并说服内核以足够大的块来执行磁盘IO以分摊任何搜索开销.