2013-05-30 2 views
-1

Я просто потратил довольно много времени, пытаясь получить этот цикл 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 в этой точке. Файл закрыт. Внутри цикла нет доступа к файлу.

ответ

1

Гораздо лучше выполнять последовательный ввод-вывод в файле, а не ввод-вывод в разных разделах файла. Это, по сути, сводится к тому, чтобы вызвать много искажений на базовом устройстве (я беру здесь диск). Это также увеличивает количество базовых системных вызовов, необходимых для чтения файла в упомянутых буферах. Вам лучше использовать 1 поток, чтобы прочитать файл в его совокупности последовательно (возможно, mmap() с MAP_POPULATE) и назначить обработку различным потокам.

Другой вариант - использовать вызовы, такие как aio_read(), для обработки чтения в разных разделах, если по какой-то причине вы действительно не хотите читать файл все сразу.

Без всего кода я не могу быть полностью уверен, но помню, что простое открытие файла не гарантирует, что его содержимое будет в памяти, а чтение из файла приведет к ошибкам страницы, которые затем вызовут чтение фактического содержимого файла даже если вы явно не пытаетесь читать из файла, используя чтение/запись, OS позаботится об этом для вас.

+0

Извините за неточность, но содержимое файла уже читается секвенциально и делится на strbufs на этом этапе. Файл закрыт. Внутри цикла нет доступа к файлу. – niko

+0

@niko Зачем даже беспокоиться о перерыве в streambufs? Просто найдите конец файла и прочитайте его в один большой буфер в этот момент. Скорее всего, это быстрее. Скопировать операции, вероятно, то, что причиняет вам боль. –

Смежные вопросы