Как рассчитать количество задач, созданных программой openMP.? - PullRequest
0 голосов
/ 03 июля 2019

Я ищу, чтобы найти количество задач. Как узнать количество задач, созданных программой openMP?

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
    quicksort(A,left,last-1);

    quicksort(A,last+1,right);

    #pragma omp taskwait

}

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Если вы хотите получить представление о том, что делает ваша OpenMP-программа, вам следует использовать инструмент анализа производительности с учетом задач OpenMP.Например, Score-P может записывать все операции задачи либо в трассировке с полной информацией о синхронизации, либо в сводном профиле.Затем есть несколько других инструментов для анализа и визуализации записанной информации.

Взгляните на этот документ для получения дополнительной информации для анализа производительности приложений OpenMP на основе задач .

0 голосов
/ 03 июля 2019

Нет хорошего способа подсчета количества задач 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.

...