Параллельное программирование(OMP). Не создаются потоки. C++

Рейтинг: 0Ответов: 0Опубликовано: 31.03.2023

подскажите пожалуйста. Стоит учебная задача, распараллелить процесс поиска подстроки в файлах. Написал функцию void Parallel_OMP_algorithm(std::vector<std::string>& filenames, std::string& substring, const int& num_threads_generate) , которая принимает вектор с именами файлов, подстроку, которую собственно и надо искать, а так же из заранее сгенерированного контейнера количество потоков, на которое нужно распараллелить. Суть ее в том, что бы, например, нужно найти в 10 файлах подстроку, количество потоков, которое необходимо создать 5, соответственно каждый должен обработать по 2 файла, если, например, в 14 файлах в 3 потока, то первый обработает четыре файла, а остальные по 5. Но как бы не пытался переделать эту функцию получается одно и тоже, пробовал и задержку внутри цикла for сделать, и выносил в #pragma omp critical вывод, не получается. Уважаемые форумчане, подскажите в чем ошибка и как ее исправить. Заранее благодарен. Простите за сумбурное изложение вопроса. Листинг функции:

 void Parallel_OMP_algorithm(std::vector<std::string>& filenames, std::string& substring, const int& num_threads_generate)
{
    int total_files = filenames.size();
    std::cout << "num_threads_generate=" << num_threads_generate << std::endl; 
    omp_set_num_threads(num_threads_generate);
//#pragma omp parallel num_threads(num_threads_generate)
#pragma omp parallel 
    {
        int thread_id = omp_get_thread_num();
        int files_per_thread = total_files / num_threads_generate;
        int extra_files = total_files % num_threads_generate;
        int start_file_index = thread_id * files_per_thread + std::min(thread_id, extra_files);
        int end_file_index = start_file_index + files_per_thread + (thread_id < extra_files ? 1 : 0);
        std::cout << "thread_id=" << thread_id << " start_file_index" << start_file_index << "  end_file_index" << end_file_index << std::endl;

        for (int i = start_file_index; i < end_file_index; ++i)
        {
            if (search_substring(filenames.at(i), substring))
            {
#pragma omp critical
                std::cout << "OpenMP: Substring found in " << filenames[i] << std::endl;
            }
            else {
#pragma omp critical
                std::cout << "OpenMP: Substring not found in " << filenames[i] << std::endl;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
        std::cout << "End of " << thread_id << " thread" << std::endl;
    }
} 

Вывод: введите сюда описание изображения

Ответы

Ответов пока нет.