このループを openMPed にするのにかなりの時間を費やしましたが、2 つのスレッドの場合、Wall 時間は 2 倍になります! 私は何か重要なものを見逃していますか?
全体的なタスクは、大きなファイル (~ 1GB) を並行して読み取ることです。ifstream はいくつかの文字列バッファに分割され、これらはデータを構造体 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;
}
編集::不正確で申し訳ありませんが、ファイルの内容はすでに順次読み込まれており、この時点で strbufs に分割されています。ファイルは閉じられています。ループ内ではファイル アクセスはありません。