Я пытаюсь распараллелить внутренние циклы 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 операторов, но это сбивает с толку, когда у вас так много кода внутри параллельной области.