Dalam pemprosesan parallel dimana data di pecah-pecah menjadi beberapa bagian untuk dilakukannya pemprosesan di masing-masing core. karena proses dikerjakan secara terpisah maka harus ada variabel tersendiri unutk setiap proses pada setiap corenya, dalam openmp sering disebut private variabel. ketika variabel yang digunakan dalam masing-masing core tidak di private, maka proses tidak akan dapat berjalan. agar lebih memahaminya mari kita lihat contoh di bawah.
contoh code sequensial:
#include <stdio.h>
#include <omp.h>
#define N 16
#define T 4
int main() {
int max = 0;
int A[N] = {1,2,3,4,57,6,7,8,9,10,11,12,13,14,15,16};
int i, max_loc = 0;
#pragma omp parallel num_threads(T)
{
int id = omp_get_thread_num();
int start = id*N/T;
int stop = (id+1)*N/T;
for (i = start; i < stop; i++)
if (A[i] > max_loc)
max_loc = A[i];
#pragma omp critical
if (max_loc > max)
max = max_loc;
}
printf("%d\n", max);
return 0;
}
dapat dilihat didalam #pragma ...... terdapat beberapa variabel didalamnya, variabel-variabel yang digunakan haruslah dibuat menjadi private sehingga masing masing proses memiliki memiliki variabel yang tidak saling terkait.
sehingga kode dapat diubah menjadi seperti ini.
#include <stdio.h>
#include <omp.h>
#define N 16
#define T 4
int main() {
int max = 0;
int A[N] = {1,2,3,4,57,6,7,8,9,10,11,12,13,14,15,16};
int i, max_loc = 0;
#pragma omp parallel num_threads(T) private(max_loc, i)
{
int id = omp_get_thread_num();
int start = id*N/T;
int stop = (id+1)*N/T;
for (i = start; i < stop; i++)
if (A[i] > max_loc)
max_loc = A[i];
#pragma omp critical
if (max_loc > max)
max = max_loc;
}
printf("%d\n", max);
return 0;
}
atau bisa juga dengan cara kedua, yaitu meletakkan variabel di dalam pragma:
#include <stdio.h>
#include <omp.h>
#define N 16
#define T 4
int main() {
int max = 0;
int A[N] = {1,2,3,4,57,6,7,8,9,10,11,12,13,14,15,16};
#pragma omp parallel num_threads(T)
{
int i;
int max_loc = 0;
int id = omp_get_thread_num();
int start = id*N/T;
int stop = (id+1)*N/T;
for (i = start; i < stop; i++)
if (A[i] > max_loc)
max_loc = A[i];
#pragma omp critical
if (max_loc > max)
max = max_loc;
}
printf("%d\n", max);
return 0;
}
No comments:
Post a Comment