7

我有一个 C 应用程序(VStudio 2010,win7 64 位)在具有双至强芯片的机器上运行,这意味着 12 个物理内核和 24 个逻辑内核,以及 192 gig 的内存。编辑:操作系统是 win7(即 Windows 7、64 位)。

该应用程序有 24 个线程(每个线程都有自己的逻辑核心)进行计算并填充大量 C 结构的不同部分。当所有线程都完成时(并且线程都完全平衡,因此它们同时完成),该结构约为 60 GB。

(我可以控制硬件设置,因此我将使用 6 个运行 RAID 0 的 2tb 驱动器,这意味着写入的物理限制大约是平均顺序写入速度的 6 倍,或大约 2 gig/秒。)

将其写入磁盘的最有效方法是什么?显然,I/O 时间将使计算时间相形见绌。从我对这个主题的研究来看,似乎 write() (而不是 fwrite() )是要走的路。但是在设置缓冲区大小等方面,我可以在软件方面进行哪些其他优化。 mmap 会更有效吗?

4

2 回答 2

8

mmap() 或boost mmap几乎总是最好的方法。操作系统比你聪明,让它担心缓存什么!

您没有说什么操作系统,但在 Linux 上madvise或等效的提升提示可以真正提高性能。

于 2011-12-09T19:01:24.817 回答
6

很难判断最适合您的情况的事情。

要进行的第一个优化是预分配文件。这样,您的文件系统就不需要不断扩展其大小。那应该优化一些磁盘操作。但是,请避免将实际零写入磁盘。只需设置长度。

然后你可以在 mmap 和 write 之间进行选择。这也取决于您使用的操作系统。在 Unix 上,我会同时尝试 mmap 和 pwrite。pwrite 很有用,因为您的每个线程都可以在所需的文件位置写入文件,而无需争夺文件偏移量。

mmap 可能很好,因为您的线程不会将副本复制到文件缓存中,而是直接写入文件缓存。60 GB 可能太大而无法映射整个文件,因此每个线程可能需要自己的 mmap 窗口到它可以移动的文件上。

在 Windows 中,您可能想尝试使用重叠的异步 IO。这只能通过 Win32 API 调用来完成。

于 2011-12-09T19:06:28.167 回答