Нет хорошего способа подсчета количества задач OpenMP, так как OpenMP не предлагает никакого способа фактически запросить, сколько задач было создано до сих пор. Система времени выполнения OpenMP может отслеживать или не отслеживать этот номер, поэтому было бы несправедливо (и это повлияло бы на производительность), если бы такой номер оставался во время выполнения, который в противном случае не заинтересован в этом числе.
Следующий ужасный хак! Убедитесь, что вы абсолютно хотите это сделать!
Сказав выше, вы можете сделать подсчет вручную. Предполагая, что ваш код детерминистически создает одинаковое количество задач для каждого выполнения, вы можете сделать это:
int tasks_created;
void quicksort(int* A,int left,int right)
{
int i,last;
if(left>=right)
return;
swap(A,left,(left+right)/2);
last=left;
for(i=left+1;i<=right;i++)
if(A[i] < A[left])
swap(A,++last,i);
swap(A,left,last);
#pragma omp task
{
#pragma omp atomic
tasks_created++
quicksort(A,left,last-1);
}
quicksort(A,last+1,right);
#pragma omp taskwait
}
Я говорю, что это ужасный взлом, потому что
- требуется, чтобы вы нашли все операторы создания задачи, чтобы изменить их с помощью конструкции
atomic
и приращения
- он не работает для некоторых директив, генерирующих задачи, например,
taskloop
- это может ужасно замедлить выполнение, так что вы не можете оставить модификацию для производства (это часть детерминизма, вам нужно запустить один раз с счетчиком, а затем убрать счет для производства)
Другой способ ...
Если вы используете достаточно новую реализацию OpenMP, которая уже поддерживает новые интерфейсы инструментов OpenMP из OpenMP 5.0, вы можете написать небольшой инструмент, который подключается к событиям OpenMP для создания задач. Затем вы можете выполнить подсчет в инструменте и присоединить его к нашему выполнению с помощью механизма инструментов OpenMP.