Professional Documents
Culture Documents
OLEH:
b. Output
2. PROGRAM PERKALIAN MATRIKS
a. source code
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#include<time.h>
void MMulT(int n);
void MMul(int n);
int main(){
int nList[] = {500,1000,2000,4000};
for(int i = 0; i < 4; i++){
MMul(nList[i]);
}
for(int i = 0; i < 4; i++){
MMulT(nList[i]);
}
}
void MMul(int n){
clock_t start, finish;
start = clock();
int checkParallel = 0;
double *arrayA = malloc(sizeof(double) * n * n);
double *arrayB = malloc(sizeof(double) * n * n);
double *result = malloc(sizeof(double) * n * n);
double *arrayTemp = malloc(sizeof(double) * n * n);
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int sum = 0;
for(int k = 0; k < n; k++){
sum += arrayA[(n*i)+k] * arrayB[(n*k)+j];
}
result[(n*i)+j] = sum;
}
}
#pragma omp atomic
checkParallel++;
}
finish = clock();
printf("processing time B not transposed, n = %d", n);
if(checkParallel == 1)
printf("(serial) : %.7lf\n", ((double)(finish-start) /
CLOCKS_PER_SEC));
else
printf("(parallel) : %.7lf\n", ((double)(finish-
start) / CLOCKS_PER_SEC));
}
void MMulT(int n){
clock_t start, finish;
start = clock();
int checkParallel = 0;
double *arrayA = malloc(sizeof(double) * n * n);
double *arrayB = malloc(sizeof(double) * n * n);
double *result = malloc(sizeof(double) * n * n);
double *arrayTemp = malloc(sizeof(double) * n * n);
#pragma omp parallel
{
//transpose matrix B
#pragma omp for
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
arrayTemp[(n*i)+j] = arrayB[(n*j)+i];
}
}
#pragma omp single
{
free(arrayB);
arrayB = arrayTemp;
}
#pragma omp for
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int sum = 0;
for(int k = 0; k < n; k++){
sum += arrayA[(n*i)+k] * arrayB[(n*j)+k];
}
result[(n*i)+j] = sum;
}
}
#pragma omp atomic
checkParallel++;
}
finish = clock();
printf("processing time B transposed, n = %d", n);
if(checkParallel == 1)
printf("(serial) : %.7lf\n", ((double)(finish-start) /
CLOCKS_PER_SEC));
else
printf("(parallel) : %.7lf\n", ((double)(finish-start) /
CLOCKS_PER_SEC));
}
b. output
3. PROGRAM FIBONACCI
a. Source code
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
int fib(int n);
int main(){
clock_t s, f;
int n=40;
long a;
s=clock();
#pragma omp parallel num_threads(4)
{
#pragma omp single
a=fib(n);
}
f=clock();
printf("nilai fibonacci %ld \n", a);
printf("waktu eksekusi : %.7lf\n", ((double)(f-
s)/CLOCKS_PER_SEC));
}
int fib(int n){
long x, y;
if(n<2){
return n;
} else{
#pragma omp task shared(x)
x=fib(n-1);
#pragma omp task shared(y)
y=fib(n-2);
#pragma omp taskwait
return x+y;
}
}
b. Output