C 所有omp任务都安排在同一线程中

C 所有omp任务都安排在同一线程中,c,task,openmp,C,Task,Openmp,我正在使用omp任务功能,遇到了一个问题。我有以下代码: void function1(int n, int j) { //Serial part #pragma omp parallel { #pragma omp single nowait { //execcute function1() for every n for (i=0; i<n; i++) {

我正在使用omp任务功能,遇到了一个问题。我有以下代码:

void function1(int n, int j)
{
    //Serial part
    #pragma omp parallel
    {
        #pragma omp single nowait
        {
            //execcute function1() for every n
            for (i=0; i<n; i++)
            {
                //create a task for computing only large numbers of n
                if (i <= 10)
                    //execute serial
                else
                    #pragma omp task
                    //call function again 
                    function1(n, j+1);
                    printf("task id:\n", omp_get_thread_num());
            }
        }
    }
}
现在代码将产生正确的结果,但性能比原始串行版本慢得多。经过一些调查,我发现所有任务都是在线程0中执行的,不管总共有4个线程在运行。有人知道这里发生了什么吗?提前谢谢

omp single nowait pragma表示以下块将由单个线程执行。在本例中,这意味着整个循环由一个线程执行。这将解决您的问题:

void function1(int n, int j)
{
    //Serial part
    #pragma omp parallel
    {
        //execcute function1() for every n
        for (i=0; i<n; i++)    //Notice this is outside the pragma
        {
            #pragma omp single nowait    //Notice this is inside the loop
            {
                //create a task for computing only large numbers of n
                if (i <= 10)
                    //execute serial
                else
                    #pragma omp task
                    //call function again 
                    function1(n, j+1);
                    printf("task id:\n", omp_get_thread_num());
            }
        }
    }
}

不。现在每个线程执行相同的循环,并创建一组相同的任务。使用单个指令使一个线程创建所有任务,然后由所有线程执行。