如何并行mmap以便更快地读取文件?

时间:2015-08-14 01:38:43

标签: c linux multithreading parallel-processing mmap

我正在通过this code并让mmap现在正在工作,但我想知道我是否可以并行使用mmap,如果可以,那么如何实现它。假设我在并行文件系统(GPFSRAID0,无论如何)上有我的数据,我想用n进程读取它。

例如,我怎样才能让每个处理器将1/nth个连续的数据块读入内存?或者,或者,将每个nth内存块(1 B,1 MB,100 MB,1 GB,无论我选择哪种优化)读入内存?

我在这里假设一个posix文件系统。

1 个答案:

答案 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);