Как распараллелить цикл while с помощью PPL

Мне нужно распараллелить цикл while с помощью PPL. У меня есть следующий код в Visual C++ в MS VS 2013.

int WordCount::CountWordsInTextFiles(basic_string<char> p_FolderPath, vector<basic_string<char>>& p_TextFilesNames)
{
    // Word counter in all files.
    atomic<unsigned> wordsInFilesTotally = 0;
    // Critical section.
    critical_section cs;

    // Set specified folder as current folder.
    ::SetCurrentDirectory(p_FolderPath.c_str());

    // Concurrent iteration through p_TextFilesNames vector.
    parallel_for(size_t(0), p_TextFilesNames.size(), [&](size_t i)
    {
        // Create a stream to read from file.
        ifstream fileStream(p_TextFilesNames[i]);
        // Check if the file is opened
        if (fileStream.is_open())
        {
            // Word counter in a particular file.
            unsigned wordsInFile = 0;

            // Read from file.
            while (fileStream.good())
            {
                string word;
                fileStream >> word;
                // Count total number of words in all files.
                wordsInFilesTotally++;
                // Count total number of words in a particular file.
                wordsInFile++;
            }

            // Verify the values.
            cs.lock();
            cout << endl << "In file " << p_TextFilesNames[i] << " there are " << wordsInFile << " words" << endl;
            cs.unlock();
        }
    });
    // Destroy critical section.
    cs.~critical_section();

    // Return total number of words in all files in the folder.
    return wordsInFilesTotally;
}

Этот код выполняет параллельную итерацию через std::vector во внешнем цикле. Параллелизм обеспечивается алгоритмом concurrency::parallel_for(). Но этот код также имеет вложенный цикл while, выполняющий чтение из файла. Мне нужно распараллелить этот вложенный цикл while. Как можно распараллелить этот вложенный цикл while с помощью PPL. Пожалуйста помоги.


person user3769902    schedule 15.12.2014    source источник
comment
Прежде чем тратить много времени на распараллеливание цикла while, спросите себя, как ваше оборудование поддерживает параллельное чтение из одного файла.   -  person High Performance Mark    schedule 15.12.2014
comment
Мне нужно читать из текстового файла параллельно. Помощь!   -  person user3769902    schedule 15.12.2014


Ответы (1)


Как намекает пользователь Высокая производительность в своем комментарии, параллельное чтение из одного и того же экземпляра ifstream вызовет неопределенные и неправильные поведение. (Дополнительное обсуждение см. в вопросе "Is std::ifstream thread-safe & lock- бесплатно?".) Вы в основном на пределе распараллеливания здесь с этим конкретным алгоритмом.

В качестве примечания, даже параллельное чтение нескольких разных файловых потоков не ускорит работу, если все они читаются с одного физического тома. Дисковое оборудование может фактически поддерживать только определенное количество параллельных запросов (обычно не более одного за раз, ставя в очередь любые запросы, поступающие, пока он занят). Для получения дополнительных сведений вы можете ознакомиться с Шесть наиболее часто задаваемых вопросов о производительности диска в Windows 2000; счетчики производительности специфичны для Windows, но большая часть информации носит общий характер.

person bobbymcr    schedule 24.01.2015