Параллельное программирование(OMP). Не создаются потоки. C++
подскажите пожалуйста. Стоит учебная задача, распараллелить процесс поиска подстроки в файлах.
Написал функцию
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;
}
}