使用 mmap 时性能下降
Performance degradation when using mmap
我必须计算一个巨大的nxn矩阵(n>100000),并以某种方式将其存储在内存中以供进一步使用。单个元素的计算非常昂贵(一些 1000 次翻牌和内存访问),所以我无法即时计算它。但是我只需要计算一次,以后不需要修改它。我也不能假设系统上有足够的交换空间。这就是为什么我决定创建一个缓存文件并使用 mmap 将其映射到内存:
int createCacheFile(std::size_t filesize, std::string const& filename){
//create empty file
int fileDescriptor = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
//stretch to desired size
lseek(fileDescriptor, filesize-1, SEEK_SET);
return fileDescriptor;
}
//...
std::size_t n = 100000;
std::size_t fileSize = n*n*sizeof(float);
int fileDescriptor = createCacheFile(filesize,"matrix.cache");
float* memory = (float*) mmap(0, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
//and now fill it...
我想比较性能并尝试了一个小的 n=10000,并将 malloc、mmap 与 MAP_ANONYMOUS 和上述实现进行比较。为此,矩阵完全适合RAM。虽然 malloc 和 MAP_ANONYMOUS 给出了非常相似的结果,但在计算我的矩阵时,当它由文件支持时,我会得到大约 10 倍的惩罚。似乎该程序被内核定期停止,以便它可以安全地将内容写入文件。我试图在我已经计算的矩阵部分上使用 msync 和 mprotect 来解决这个问题,以给内核一个提示,即它可以在不停止程序的情况下编写这些部分,但没有任何帮助。
有没有办法解决这个问题?
你也可以使用 madvise(2) syscall 来通知内核不太有用的页面(也许是 MADV_SEQUENTIAL
或 MADV_DONTNEED
...)。也许 posix_fadvise(2) 系统调用可能对文件段有所帮助。最终 readahead(2) (在另一个线程中,因为它是阻塞的)也可能有所帮助。
该文件可能位于快速文件系统中,也许是tmpfs
文件系统。
也许在快速磁盘 (SSD) 上交换也可能很有用。 swapon(2) syscall(和 swapon
command)。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 如何将PERF_AMPLE_READ与mmap一起使用
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 从结构寻址时,MMAP变量的行为很奇怪
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 使用 mmap 时性能下降