我有一个C应用程序(VStudio 2010,win7 64位)在具有双xeon芯片的机器上运行,这意味着12个物理核心和24个逻辑核心,以及192 gig的ram.
编辑:操作系统是win7(即 Windows 7,64位).
编辑:操作系统是win7(即 Windows 7,64位).
该应用程序有24个线程(每个线程都有自己的逻辑核心)进行计算并填充大规模C结构的不同部分.当所有线程都完成(并且线程完全平衡以便它们同时完成)时,结构大约为60千兆字节.
(我可以控制硬件设置,因此我将使用运行RAID 0的6个2tb驱动器,这意味着写入的物理限制大约是平均顺序写入速度的6倍,或大约2千兆位/秒.)
将此问题转移到磁盘的最有效方法是什么?显然,i / o时间会使计算时间相形见绌.从我对这个主题的研究来看,似乎是write()(而不是fwrite())是要走的路.但是,在设置缓冲区大小等方面,我可以在软件方面进行哪些其他优化?mmap会更有效吗?
解决方法
很难根据你的情况来判断最好的事情.
要做的第一个优化是预分配文件.这样,您的文件系统不需要继续扩展其大小.这应该优化一些磁盘操作.但是,请避免将实际零写入磁盘.只需设定长度即可.
然后你可以在mmap和write之间做出选择.这还取决于您使用的操作系统.在Unix上我会尝试mmap和pwrite. pwrite很有用,因为你的每个线程都可以在所需的文件位置写入文件,而不会争夺文件偏移量.
mmap可能很好,因为您的线程不是将副本复制到文件缓存中,而是直接写入文件缓存. 60 GB可能太大而无法对整个文件进行mmap,因此每个线程可能需要将自己的mmap窗口放在可以移动的文件上.
在Windows中,您可能希望尝试使用重叠的异步IO.这只能通过Win32 API调用来完成.