如何计算openMP程序创建的任务数?

时间:2019-07-02 23:15:32

标签: task openmp

我正在寻找任务数量。如何获取由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 个答案:

答案 0 :(得分:1)

如果您想了解OpenMP程序的运行状况,则应使用可感知OpenMP任务的性能分析工具。例如,Score-P可以将所有任务操作记录在具有完整计时信息的跟踪或摘要概要文件中。然后,还有其他一些工具可以对记录的信息进行分析和可视化。

请参阅本文以获取有关performance analysis of task-based OpenMP applications的更多信息。

答案 1 :(得分:-1)

没有一种很好的方法来计算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 5.0的新OpenMP工具界面,则可以编写一个小型工具,该工具可以挂接到OpenMP事件中以进行任务创建。然后,您可以在工具中进行计数,并通过OpenMP工具机制将其附加到我们的执行中。