Search what you want

Tuesday, December 22, 2015

Privat Variabel in openMP [Parallel Computing]

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