Как правильно распараллелить внутренний l oop в параллельной области? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь распараллелить внутренние циклы for внутри параллельной области:

    int num_threads, num_procs,max_row;
    double start_time;
    int i,h;
    # pragma omp parallel default(none) \
      shared(A,x,b,n,num_threads,num_procs,start_time,max_row)
    {
        int id = omp_get_thread_num();
        if (id == 0)
        {
            num_threads = omp_get_num_threads();
            num_procs = omp_get_num_procs();
            printf("Number of processors: %d\n", num_procs);
            printf("Actual number of threads: %d\n", num_threads);
            start_time = omp_get_wtime();
        }

        for (int i = 0; i < n-1; i++)   // for col 0 ... n-2
        {
            // partial pivoting    
            max_row = find_max(A,n,i);
            if (i != max_row)
            {
                swap_rows(A,n,b,i,max_row);
            }

            # pragma omp for 
            for (int j = i+1; j < n; j++)  // for each elt under pivot
            {
                double scalar = A[j*n+i] / A[i*n+i];
                for (int k = 0; k < n; k++) // update values across row
                {
                    A[j*n+k] -= (scalar * A[i*n+k]);
                }
                b[j] -= (scalar * b[i]);
            }
            // implicit barrier
        }

        for (int h = n-1; h >= 0; h--)
        {
            x[h] = b[h] / A[h*n+h];
            #pragma omp for 
            for (int l = h-1; l >= 0; l--)
            {
                b[l] -= A[l*n+h] * x[h];
            }
        // implicit barrier
        }
    } // end parallel region

Я не понимаю, как я могу управлять потоками, чтобы только один поток вычислял внешний заголовок для l oop и не все темы. Разве не было бы неэффективно, если бы все потоки выполняли внешний заголовок l oop? В моей книге рекомендуется иметь одну параллельную область, а не два #pragma omp parallel for операторов, но это сбивает с толку, когда у вас так много кода внутри параллельной области.

1 Ответ

0 голосов
/ 07 мая 2020

Я не понимаю, как я могу управлять потоками, чтобы только один поток вычислял внешний заголовок l oop, а не все потоки.

Удалите:

#pragma omp parallel ...

из верхней части блока кода.

...