I have written code for parallel matrix processing using OpenMP that should output information about the number of iterations for each thread.
However, the output contains information for only one thread. I just started learning OpenMP and I haven't been able to figure out what the problem is.
int main() {
int n;
cout << "Enter matrix range: ";
cin >> n;
int** A = new int* [n];
int** B = new int* [n];
int* C = new int[n];
int* D = new int[n];
for (int i = 0; i < n; i++) {
A[i] = new int[n];
B[i] = new int[n];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = rand() % 100;
B[i][j] = rand() % 100;
}
}
int thread_num;
int it_num;
#pragma omp parallel for schedule(static, 4) num_threads(4)
{
auto start_time = chrono::high_resolution_clock::now();
for (int i = 0; i < n; i++) {
int it_num = 0;
int minA = A[i][0];
it_num++;
for (int j = 1; j < n; j++) {
if (A[i][j] < minA) {
minA = A[i][j];
++it_num;
}
}
printf("thread %d processed %d iterations\n", omp_get_thread_num(), it_num);
C[i] = minA;
}
auto end_time = chrono::high_resolution_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(end_time - start_time).count();
cout << "Time taken for schedule(static, 4): " << duration << " microseconds" << endl;
}
}
Can you help me understand why the output only contains information for one thread, and how to fix it?
Two solutions.
omp parallel for
into a omp parallel
and omp for
int itcount[nthreads]; # pragma omp parallel { int thread_num = omp_get_thread_num(); # pragma omp for schedule(guided) for (int n = 0; n < N; n++) { itcount[thread_num]++; // rest of the loop
Second solution: use threadprivate
data.