Я просто потратил довольно много времени, пытаясь получить этот цикл openMPed, но для 2 потоков он удваивает время на стене! Я пропустил что-то важное?Почему openMP требуется так долго?
Общая задача состоит в том, чтобы читать в большом файле (~ 1 ГБ) параллельно, поток if разделен на несколько буферов строк, и они используются для вставки данных в символ структуры. Здесь все быстро. Кроме того, предоставление частным переменным цикла 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 :: Извините за unprecise, но содержимое файла уже читать sequencially и разделить на strbufs в этой точке. Файл закрыт. Внутри цикла нет доступа к файлу.
Извините за неточность, но содержимое файла уже читается секвенциально и делится на strbufs на этом этапе. Файл закрыт. Внутри цикла нет доступа к файлу. – niko
@niko Зачем даже беспокоиться о перерыве в streambufs? Просто найдите конец файла и прочитайте его в один большой буфер в этот момент. Скорее всего, это быстрее. Скопировать операции, вероятно, то, что причиняет вам боль. –