我正在通过this code并让mmap
现在正在工作,但我想知道我是否可以并行使用mmap
,如果可以,那么如何实现它。假设我在并行文件系统(GPFS
,RAID0
,无论如何)上有我的数据,我想用n
进程读取它。
例如,我怎样才能让每个处理器将1/nth
个连续的数据块读入内存?或者,或者,将每个nth
内存块(1 B,1 MB,100 MB,1 GB,无论我选择哪种优化)读入内存?
我在这里假设一个posix
文件系统。
答案 0 :(得分:0)
这是我的mpi
并行读取功能。它会根据n
将文件切换为pagesize
个连续的部分,并让每个进程通过mmap
读取单独的部分。最后需要做一些额外的技巧,因为进程i
将(可能)获得一行的前半部分,因为它的最后一行和进程i+1
将获得后半部分与第一行相同的行。
ikind nchars_orig; // how many characters were in the original file
int pagesize = getpagesize();
off_t offset;
struct stat file_stat;
int finp = open(inpfile, O_RDONLY);
int status = fstat(finp, &file_stat);
nchars_orig = file_stat.st_size;
// find out hwich pieces of the file each process should read
ikind nchars_per_proc[nprocs];
for(int ii = 0; ii < nprocs; ii++) {
nchars_per_proc[ii] = 0;
}
// start at the second to last proc, so the last proc will get hit first
// we will decrement him at the end, so this will distribute the work more evenly
int jproc = nprocs-2;
ikind nchars_tot = 0;
ikind nchardiff = 0;
for(ikind ic = 0; ic < nchars_orig; ic+= pagesize) {
jproc += 1;
nchars_tot += pagesize;
if(jproc == nprocs) jproc = 0;
if(nchars_tot > nchars_orig) nchardiff = nchars_tot - nchars_orig;
nchars_per_proc[jproc] += pagesize;
}
nchars = nchars_per_proc[iproc];
if( iproc == nprocs-1 ) nchars = nchars - nchardiff;
offset = 0;
for(int ii = 0; ii < nprocs; ii++) {
if( ii < iproc ) offset += nchars_per_proc[ii];
}
cs = (char*)mmap(0, nchars, PROT_READ, MAP_PRIVATE, finp, offset);