Мне нужно знать общее количество потоков, которые было создано моим приложением через OpenMP. К сожалению, функция omp_get_num_threads()
работает здесь не, поскольку она дает только количество потоков в текущей команде.
Тем не менее, мой код работает рекурсивно (делятся и соглашаются, в основном), и я хочу создавать новые потоки, если есть еще неработающие процессоры, но не более.
Есть ли способ обойти ограничения omp_get_num_threads
и получить общее количество запущенных потоков?
Если требуется более подробная информация, рассмотрим следующий псевдокод, который довольно точно моделирует мой рабочий процесс:
function divide_and_conquer(Job job, int total_num_threads):
if job.is_leaf(): # Recurrence base case.
job.process()
return
left, right = job.divide()
current_num_threads = omp_get_num_threads()
if current_num_threads < total_num_threads: # (1)
#pragma omp parallel num_threads(2)
#pragma omp section
divide_and_conquer(left, total_num_threads)
#pragma omp section
divide_and_conquer(right, total_num_threads)
else:
divide_and_conquer(left, total_num_threads)
divide_and_conquer(right, total_num_threads)
job = merge(left, right)
Если я вызываю этот код с total_num_threads
значением 4, условный аннотированный с помощью (1)
всегда будет оцениваться как true
(поскольку каждая команда потока будет содержать не более двух потоков), и, следовательно, код всегда будет появляться два новых потока, независимо от того, сколько потоков уже выполняется на более высоком уровне.
Я ищу платформенно-независимый способ определения общего количества потоков, которые в настоящее время работают в моем приложении.