-1

我只是花了一些时间试图让这个循环 openMPed,但是对于 2 个线程,它加倍了 Wall time!我错过了什么重要的东西吗?

总体任务是并行读取一个大文件(~ 1GB),一个 ifstream 被分成几个字符串缓冲区,这些用于将数据插入到结构符号中。到这里为止,一切都很快。同样给循环私有变量 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;
}

编辑:: 抱歉不精确,但文件内容已经按顺序读取并在此时分为 strbufs。文件已关闭。在循环内没有文件访问。

4

1 回答 1

1

对文件执行顺序 I/O 比在文件的不同部分执行 I/O 要好得多。这本质上归结为在底层设备上引起大量搜索(我假设这里有一个磁盘)。这也增加了将文件读入所述缓冲区所需的底层系统调用的数量。您最好使用 1 个线程顺序读取文件(可能mmap()使用MAP_POPULATE)并将处理分配给不同的线程。

aio_read()如果由于某种原因您真的不想一次读取所有文件,则另一种选择是使用诸如处理不同部分的读取之类的调用。

如果没有所有代码,我无法完全确定,但请记住,简单地打开文件并不能保证其内容在内存中,从文件中读取会导致页面错误,从而导致实际文件内容被读取,所以即使你没有明确地尝试使用读/写从文件中读取,操作系统会为您处理。

于 2013-05-30T22:43:58.183 回答