我正在处理这段代码,现在已经使
例如,如何让每个处理器将数据的
我假设这里是一个
mmap
起作用了,但我想知道是否可以并行使用mmap
,如果可以,如何实现。假设我的数据存储在并行文件系统(GPFS
, RAID0
, 等等)中,并且我想使用n
个进程来读取它。例如,如何让每个处理器将数据的
1/nth
连续块读入内存?或者,将每个nth
内存块(1 B, 1 MB, 100 MB, 1 GB,任意优化选择)读入内存?我假设这里是一个
posix
文件系统。
mmap()
会让你受制于内核的虚拟内存管理器。而且,由于创建物理到虚拟映射需要是线程安全的,所以在负载下它往往会变成单线程。请查看lio_listio()
来执行多个异步IO操作。http://man7.org/linux/man-pages/man3/lio_listio.3.html如果您正在流式传输大量数据(只读一次,不寻址),请使用直接IO http://www-01.ibm.com/support/knowledgecenter/SSFKCN_3.5.0/com.ibm.cluster.gpfs.v3r5.gpfs100.doc/bl1adm_direct.htm。 - Andrew Henlemmap()
可能有效,但我见过一些非常快的文件系统可以比虚拟到物理映射更快地传递数据。如果您的磁盘速度很快,mmap()
将无法很好地工作。如果您没有任何局部性并且最终不得不在集群中传递文件数据,则这可能比快速文件系统慢得多。这完全取决于您的处理需求-要实现真正的快速,您必须调整所有内容以协同工作,并且不能抽象出物理设计。 - Andrew Henlemmap()
可以将任意数量的字节从任意偏移量映射到文件中。void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
length
是要映射的字节数,offset
是开始映射的文件偏移量。http://linux.die.net/man/2/mmap - Andrew Henle