我只是花了一些时间试图让这个循环openMPed,但对于2个线程,它加倍Wall时间!我错过了一些重要的事情吗?
总体任务是并行读取一个大文件(~1GB),将一个ifstream分成几个stringbuffer,这些用于将数据插入到结构符号中。到目前为止一切都很快。同时给循环私有变量str和locVec进行操作不会改变某些东西。
vector<string> strbuf; // filled from ifstream
vector< vector <Symbol> > symVec; // to be filled
#pragma omp parallel for num_threads(2) default(none) shared(strbuf, symVec)
for (int i=0; i<2; i++)
{
string str = strbuf[i];
std::stringstream ss(str);
// no problem until here
// this is where it slows down:
vector<Symbol> locVec;
std::copy(std::istream_iterator<Symbol>(ss), std::istream_iterator<Symbol>(), std::back_inserter(locVec));
symVec[i] = locVec;
}
EDIT :: 很抱歉没有准确,但是文件内容已经按顺序读取并且此时分为strbuf。该文件已关闭。在循环内没有文件访问权。
答案 0 :(得分:1)
在文件的不同部分对文件而不是I / O执行顺序I / O要好得多。这基本上归结为在底层设备上引起了大量的搜索(我在这里假设一个磁盘)。这也增加了将文件读入所述缓冲区所需的底层系统调用量。你最好使用1个线程按顺序读取整个文件(可能是mmap()
MAP_POPULATE
)并将处理分配给不同的线程。
另一种选择是使用aio_read()
之类的调用来处理不同部分的读取,如果由于某种原因你真的不想一次读取文件。
如果没有所有代码,我无法完全确定,但请记住,只是打开一个文件并不能保证它的内容在内存中,从文件中读取会导致页面错误,从而导致实际文件内容被读取甚至如果您没有明确尝试使用读/写来读取文件,操作系统将为您处理。