Мне нужно знать общее количество потоков, созданных моим приложением через 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
(потому что каждая команда потока будет содержать не более двух потоков) и, следовательно, код всегда будет порождать два новых потока, независимо от того, сколько потоковуже работает на более высоком уровне.
Я ищу независимый от платформы способ определения общего количества потоков, которые в данный моментв моем приложении.