我只花了一段时间试图让这个循环openMPed,但对于2个线程,它使Wall时间翻倍!我错过重要的东西吗?为什么openMP需要这么久?
整体任务是并行读取一个大文件(〜1GB),一个ifstream被分成几个stringbuffer,并且这些用于将数据插入到结构Symbol中。到这里一切都很快。同时赋予循环私有变量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;
}
编辑:: 对不起,是unprecise,但文件的内容已经被读入sequencially在这一点上分为strbufs。该文件已关闭。在循环内没有文件访问。
不好意思,因为文件内容已经按顺序读取了,现在分成了strbufs。该文件已关闭。在循环内没有文件访问。 – niko
@niko为什么还打扰到streambufs?只需找到该文件的结尾,并在此时将其读入一个大缓冲区。它可能更快。复制操作可能会伤害你。 –