3.1 Kebutuhan Program Hitung
Dalam bab ini akan dibahas tentang perancangan algoritma yang dibagi menjadi perancangan tampilan dan perancangan program yang terdiri dari perancangan input dan output.
3.2 Perancangan Tampilan Masukan (Input) Program
Dalam program ini hanya menggunakan 2 macam tampilan. Tampilan pertama yaitu tampilan input, tampilan yang kedua adalah tampilan output. Rancangan tampilan pertama adalah tampilan input yang ditunjukkan pada gambar 3.1.
Gambar 3.1 Rancangan Tampilan input program
Gambar 3.1 Rancangan tampilan input program
Gambar 3.1 Rancangan tampilan program
Masukan nilai adalah nilai dari ordo matriks persegi. Nilai ini digunakan untuk mencari hasil perhitungan matriks. Contoh:
Gambar 3.2 Contoh tampilan input program
Gambar 3.2 Tampilan input program
3.3 Perancangan Tampilan Keluaran (Output) Program
Rancangan tampilan kedua adalah tampilan output. Tampilan ini menampilkan nilai input dan nilai output dari proses penghitungan. Nilai output terdiri dari bilangan matriks, ordo matriks, menampilkan hasil perkalian matriks, processor yang mengerjakan serta waktu yang dibutuhkan untuk melakukan perkalian matriks. Kordinat hasil adalah hasil perhitungan bilangan matriks dari 1 ordo dengan ordo yang lainnya. Memerlukan waktu adalah waktu yang dibutuhkan untuk melakukan penghitungan pada program matriks. Tampilan ketiga seperti yang ditunjukkan pada gambar 3.3
Gambar 3.3 Rancangan Tampilan output pada program
3.4 Alur Program
Pada program ini yang pertama kali dijalankan adalah id = 0 memeriksa id prosesor yang digunakan. Kondisi ini digunakan untuk meminta masukan, melakukan proses perhitungan, dan menampilkan hasil penghitungan. Kondisi id = 0 hanya dimiliki oleh prosesor yang memulai menjalankan program hitung. Kondisi id = 0 tidak harus terjadi pada prosesor 1 atau prosesor yang memiliki id terkecil. Hal ini dapat terjadi pada prosesor manapun. Nilai yang dimasukan tadi adalah variabel m ( nilai ordo matriks) setelah itu maka dilakukan perhitungan terhadap variabel m dimana terjadi perkalian bilangan m dengan bilangan m itu sendiri karena melakukan perhitungan matriks persegi selanjutnya menuju proses MPI_Broadcast.
Kemudian proses selanjutnya adalah melakukan proses random elemen-elemen matriks pada id = 0, kemudian dilakukan proses MPI_REDUCE mengumpulkan hasil penghitungan random dari tiap-tiap prosesor, mereduksi data-data tersebut ke sebuah nilai dan menyimpan hasil reduksi tersebut ke prosesor induk untuk dilakukan perhitungan matriks. Kemudian melakukan proses random elemen-elemen matriks pada masing–masing id, setelah proses tersebut dilaksanakan selanjutnya proses memasukan array random kedalam array elemen matriks pada masing-masing id dan selanjutnya proses perulangan kordinat elemen-elemen matriks pada masing-masing id.
Setelah itu terjadi proses perulangan untuk perkalian elemen-elemen matriks ordo pertama dan ordo ke dua kemudian dilakukan proses MPI_REDUCE. Proses selanjutnya adalah tampilan akhir program dimana masing-masing prosesor menampilkan hasil perkalian elemen-elemen matriks serta waktu yang dibutuhkan untuk melakukan proses tersebut.
3.5 Rangkaian Komputer Kluster
Untuk membuat komputer kluster pada tugas akhir ini menggunakan PC yang heterogen yang mempunyai kapasitas memori dan RAM yang berbeda-beda. Alasan menggunakan PC yang heterogen bila dibandingkan dengan PC yang homogen adalah berikut kekurangan dan kelebihannya:
1. PC Homogen: Kelebihan:
- waktu pemprosesan untuk komunikasi antar prosesor pada jaringan komputer homogen lebih stabil karena mempunyai kecepatan prosesor yang sama. - waktu eksekusi untuk menyelesaikan program cenderung lebih stabil karena memiliki kapasitas memori dan RAM yang sama.
Kekurangan:
- jaringan komputer homogen memungkinkan waktu pemrosesan yang tidak lebih cepat atau stabil dari pada heterogen dikarenakan pada jaringan komputer homogen mempunyai spesifikasi prosesor yang sama pada masing-masing komputernya.
2. PC Heterogen: Kekurangan :
- Memiliki kapasitas RAM dan memori yang berbeda sehingga kecepatan dalam pemrosesan data cenderung tidak stabil.
- Waktu pemrosesan untuk mengeksekusi program yang cenderung tidak stabil terkadang menghasilkan waktu yang tidak lebih cepat dibandingkan homogen karena waktu komunikasi antar prosesor yang berbeda dalam membuat komunikasi antara prosesor yang lebih cepat berkomunikasi ke prosesor yang lebih lambat, perbedaan ini yang terkadang menimbulkan waktu yang tidak lebih cepat.
Kelebihan :
- Pada jaringan komputer heterogen dengan spesifikasi prosesor yang berbeda memungkinkan prosesor yang lebih tinggi mengcover proses perhitungan yang lebih besar yang menghasilkan kecepatan yang lebih tinggi dibandingkan dengan prosesor yang spesifikasi prosesornya sama karena akan diperhitungkan dengan memilih metode yang menyeimbangkan beban komputasi pada seluruh komputer yang tersedia dalam kluster (load balancing) yang digunakan untuk mendistribusikan komputasi kesemua prosesor guna mencapai kecepatan eksekusi setinggi mungkin
Secara garis besar alur programnya sebagai berikut: mulai Masukan nilai (m) MPI_BROADCAST n=m+1 & zz=m*n For c=1 to zz step c First[c]=-1 Second[c]=-1 Firstbuf[c]=-1 Secondbuf[c]=-1 for c=1 to zzstep c first [c] = rand%5 + 1 second[c]= rand%5 + 1 firstbuf [c] = first[c] secondbuf [c] = second[c] If w ==2 MPI_REDUCE FIRST Tidak If w ==3 Tidak MPI_REDUCE SECOND MPI_REDUCE SECOND MPI_REDUCE FIRST MPI_REDUCE FIRST MPI_REDUCE SECOND 1 Ya Ya If id = 0 Ya Tidak If id = 0 Ya Tidak
Selesai
Gambar 3.4 Flowchart program matriks
3.6 Pseudo Code
Dari diagram alur atau yang disebut flowchart, dapat dibuat pseudo code sebagai berikut:
IF id=0
Input : Nilai ordo matriks ENDIF
MPI_Init()
Waktu_awal : waktu dimulainya perhitungan MPI_Bcast : mengirim data keseluruh prosesor n=m+1 zz=m*n FOR c=1 first [c]=-1 second[c]=-1 firstbuf[c]=-1 secondbuf[c]=-1 6 durasi=waktu_akhir-waktu_awal Tampilan Hasil If id = 0 Ya Tidak
IF id==0
FOR c=1 :Melakukan proses random elemen matriks first[c]=rand()%5+1 second[c]=rand()%5+1 firstbuf[c]=first[c] secondbuf[c]=second[c] ENDFOR ENDIF IF (w==2) THEN
MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor ENDIF
IF (w==3) THEN
MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor ENDIF
IF id=0 THEN PRINT id 0 first
FOR c=1 : Melakukan proses perulangan untuk id 0 PRINT id = 0 kordinat first
ENDFOR ENDIF
IF id=0 THEN PRINT id 0 second
FOR c=1 : Melakukan proses perulangan untuk id 0 PRINT id = 0 kordinat second
ENDFOR ENDIF
IF id=1 THEN PRINT id 1 first
FOR c=1 : Melakukan proses perulangan untuk id 1 PRINT id = 1 kordinat first
ENDFOR ENDIF
IF id=1 THEN PRINT id 1 second
FOR c=1 : Melakukan proses perulangan untuk id 1 PRINT id = 1 kordinat second
ENDFOR ENDIF
IF id=2 THEN PRINT id 2 first
FOR c=1 : Melakukan proses perulangan untuk id 2 PRINT id = 2 kordinat first
ENDFOR ENDIF
IF id=2 THEN PRINT id 2 second
FOR c=1 : Melakukan proses perulangan untuk id 2 PRINT id = 2 kordinat second
ENDFOR ENDIF
IF id=0 THEN
FOR c=1 : Melakukan proses perulangan untuk id 0 FOR d=1 : Melakukan proses perulangan untuk id 0 rr=rr + 1 PRINT rr id 0 satu[c][d]=first[rr] dua[c][d]=second[rr] ENDFOR ENDFOR ENDIF
IF id=1 THEN
FOR c=1 :Melakukan proses perulangan untuk id 1 FOR d=1 : Melakukan proses perulangan untuk id 1 rr=rr+1 PRINT rr id 1 satu[c][d]=first[rr] dua[c][d]=second[rr] ENDFOR ENDFOR ENDIF IF id=2 THEN
FOR c=1 :Melakukan proses perulangan untuk id 2 FOR d=1 : Melakukan proses perulangan untuk id 2 rr=rr+1 PRINT rr id 2 satu[c][d]=first[rr] dua[c][d]=second[rr] ENDFOR ENDFOR ENDIF IF id=0 THEN
FOR c=1 : Melakukan proses perulangan untuk id 0 FOR d=1 : Melakukan proses perulangan untuk id 0 print kordinat satu
print kordinat dua ENDFOR
ENDFOR ENDIF
IF id=1 THEN
FOR c=1 : Melakukan proses perulangan untuk id 1 FOR d=1 : Melakukan proses perulangan untuk id 1 print kordinat satu
print kordinat dua ENDFOR
ENDFOR ENDIF
IF id=2 THEN
FOR c=1 : Melakukan proses perulangan untuk id 2 FOR d=1 : Melakukan proses perulangan untuk id 2 print kordinat satu
print kordinat dua ENDFOR
ENDFOR ENDIF
FOR c=1 : Melakukan proses perulangan untuk perkalian matriks FOR d=1 : Melakukan proses perulangan untuk perkalian matriks FOR k=1 : Melakukan proses perulangan untuk perkalian matriks Sum =sum+satu[c][k]*dua[k][d]: Menghitung nilai variabel sum
ENDFOR
Multiplay[c][d]=sum : Mengisi variabel multiplay [c][d] dengan variabel sum
Multiplaybuf[c][d]=sum : Mengisi variabel multiplaybuf [c][d] dengan variabel sum
Sum = 0 : Mengisi variabel sum =0 ENDFOR
ENDFOR IF w=2 THEN
MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor ENDIF
IF w=3 THEN
MPI_Reduce : Mengumpulkan hasil dari tiap-tiap prosesor ENDIF
FOR c=1 : Melakukan proses perulangan FOR d=id+1 : Melakukan proses perulangan
print kordinat hasil ENDFOR
print nama prosesor
Waktu_akhir : waktu akhir perhitungan IF id=0 THEN
durasi = waktu_akhir – waktu_awal print lama waktu yang dibutuhkan ENDIF
MPI_Finalize ();
3.7 Kode Program
Pada kode program ini, program melakukan proses random, perulangan, dan melakukan penghitungan matriks ordo 3 x 3, dan waktu yang diperlukan untuk menyelesaikan proses penghitungan, serta nama prosesor yang mengerjakan.
3.7.1 Proses utama MPI
#include <mpi.h> /*Definisi header MPI*/
#include <stdio.h> /*Definisi printf, scanf*/
#include <stdlib.h> /*Standar library*/
#include <math.h>
#include <time.h> /*Definisi waktu*/
int main ( int argc, char *argv[] ) /*Program utama*/
{
int id, m, n, w, rr = 0, c, d, k; /*Deklarasi variabel integer*/
int first[300], second[300], firstbuf[300], secondbuf[300], satu[300][300], dua[300][300], multiplay[300][300], multiplaybuf[300][300], sum = 0, zz;
/*Deklarasi variabel integer*/
int np;
/*Deklarasi variabel integer*/
int namelen;
/*Deklarasi variabel integer*/
double waktu_awal = 0, waktu_akhir, durasi; /*Deklarasi variabel waktu*/
char processor_name[MPI_MAX_PROCESSOR_NAME]; /*Dekalarasi variabel string*/
MPI_Init ( &argc, &argv ); /*Inisialisasi MPI*/
MPI_Comm_size ( MPI_COMM_WORLD, &w ); /*Mengambil nilai jumlah prosessor*/
MPI_Comm_rank ( MPI_COMM_WORLD, &id ); /*Mengambil nilai id prosessor*/
MPI_Get_processor_name(processor_name, &namelen); /*Mengambil panjang nama node*/
3.7.2 Proses random pada id 0
if (id==0)
/*Memeriksa id prosesor*/ {
printf("masukan nilai \n"); /*Mencetak masukan nilai*/
scanf("%d", &m);
/*Menyimpan masukan kedalam variabel m*/
}
waktu_awal=MPI_Wtime(); /*Waktu dimulainya perhitungan*/
MPI_Bcast (&m, 1, MPI_INT, 0, MPI_COMM_WORLD);
/*Mengirim data ke seluruh prosesor ( data yang akan dikirim, jumlah data, tipe data buffer, rank dari broadcast, communicator yang digunakan)*/
n = m+1;
zz = m*n ;
/*Menghitung variabel zz = variabel m + variabel n*/
srand (time(NULL));
/* Agar diperoleh nilai acak*/
for ( c = 1 ; c <= zz ; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
{
first[c]= -1;
/*Mengisi variabel first[c] = -1*/
second[c]= -1;
/*Mengisi variabel second[c] = -1*/
firstbuf[c]= -1;
/*Mengisi variabel firstbuf[c] = -1*/
secondbuf[c]= -1;
/*Mengisi variabel secondbuf[c] = -1*/
}
if (id==0)
/*Memeriksa id prosesor*/
{
/*Melakukan perulangan dari 1 sampai variabel zz*/
{
first[c] = rand()%5 + 1; ;
/*Mengisi variabel first [c] = rand()%5 + 1*/
second [c] = rand()%5 + 1;
/*Mengisi variabel second [c] = rand()%5 + 1*/
firstbuf[c] = first[c];
/*Mengisi variabel firstbuf [c] = variabel first [c]*/
secondbuf[c] = second[c];
/*Mengisi variabel secondbuf [c] = variabel second [c]*/
}
}
3.7.3 Proses reduksi jika jumlah node yang digunakan 2
if ( w == 2)
/*Memeriksa variabel w*/ {
MPI_Reduce(&firstbuf, &first, zz, MPI_INT, MPI_MAX, 1, MPI_COMM_WORLD);
/*Mengumpulkan hasil dari tiap-tiap prosesor (buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer,
tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan) */
MPI_Reduce(&secondbuf, &second, zz, MPI_INT, MPI_MAX, 1, MPI_COMM_WORLD);
/*Mengumpulkan hasil dari tiap-tiap prosesor(buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer, tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan) */
}
3.7.4 Proses reduksi jika jumlah node yang digunakan 3
if (w == 3)
/*Memeriksa variabel w*/
{
MPI_Reduce(&firstbuf, &first, zz, MPI_INT, MPI_MAX, 1, MPI_COMM_WORLD);
/*Mengumpulkan asil dari tiap-tiap prosesor(buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer, tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan) */
MPI_Reduce(&secondbuf, &second, zz, MPI_INT, MPI_MAX, 1, MPI_COMM_WORLD);
/*Mengumpulkan hasil dari tiap-tiap prosesor(buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer, tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan)*/
MPI_Reduce(&firstbuf, &first, zz, MPI_INT, MPI_MAX, 2, MPI_COMM_WORLD);
/*Mengumpulkan hasil dari tiap-tiap prosesor(buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer, tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan) */
MPI_Reduce(&secondbuf, &second, zz, MPI_INT, MPI_MAX, 2, MPI_COMM_WORLD);
/*Mengumpulkan hasil dari tiap-tiap prosesor(buffer yang akan dikirim, buffer untuk menerima, jumlah data buffer, tipe data buffer, operasi MPI, rank atau proses yang menerima data, communicator yang digunakan) */
}
3.7.5 Proses random pada id 0
if (id==0) /*Memeriksa id prosesor*/ { printf("id 0 first \n"); /*Mencetak id 0*/ for ( c = 1 ; c <= zz ; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 0 kordinat first %d, ,adalah %d \n", c, first[c]); /*Mencetak id = 0 kordinat first*/
} if (id==0) /*Memeriksa id prosesor*/ { printf("id 0 second \n"); /*Mencetak id 0*/ for ( c = 1 ; c <= zz; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 0 kordinat second %d, ,adalah %d \n", c, second[c]);
/*Mencetak id = 0 kordinat second*/
}
Output program: masukan nilai id 0 first
id = 0 kordinat first 1, ,adalah 5 id = 0 kordinat first 2, ,adalah 3 id = 0 kordinat first 3, ,adalah 1 id = 0 kordinat first 4, ,adalah 3 id = 0 kordinat first 5, ,adalah 4 id = 0 kordinat first 6, ,adalah 4 id = 0 kordinat first 7, ,adalah 1
id = 0 kordinat first 8, ,adalah 2 id = 0 kordinat first 9, ,adalah 2 id = 0 kordinat first 10, ,adalah 2 id = 0 kordinat first 11, ,adalah 4 id = 0 kordinat first 12, ,adalah 5 id 0 second
id = 0 kordinat second 1, ,adalah 2 id = 0 kordinat second 2, ,adalah 3 id = 0 kordinat second 3, ,adalah 1 id = 0 kordinat second 4, ,adalah 3 id = 0 kordinat second 5, ,adalah 4 id = 0 kordinat second 6, ,adalah 5 id = 0 kordinat second 7, ,adalah 1 id = 0 kordinat second 8, ,adalah 5 id = 0 kordinat second 9, ,adalah 3 id = 0 kordinat second 10, ,adalah 3 id = 0 kordinat second 11, ,adalah 4 id = 0 kordinat second 12, ,adalah 4
3.7.6 Proses random pada id 1
if (id==1)
/*Memeriksa id prosesor*/
{
printf("id 1 first \n"); /*Mencetak id 1*/
for ( c = 1 ; c <= zz ; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 1 kordinat first %d, ,adalah %d \n", c, first[c]); /*Mencetak id = 1 kordinat first*/
} if (id==1) /*Memeriksa id prosesor*/ { printf("id 1 second \n"); /*Mencetak id 1*/ for ( c = 1 ; c <= zz; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 1 kordinat second %d, ,adalah %d \n", c, second[c]);
/*Mencetak id = 1 kordinat second*/
}
Output program: id 1 first
id = 1 kordinat first 1, ,adalah 5 id = 1 kordinat first 2, ,adalah 3 id = 1 kordinat first 3, ,adalah 1 id = 1 kordinat first 4, ,adalah 3 id = 1 kordinat first 5, ,adalah 4 id = 1 kordinat first 6, ,adalah 4
id = 1 kordinat first 7, ,adalah 1 id = 1 kordinat first 8, ,adalah 2 id = 1 kordinat first 9, ,adalah 2 id = 1 kordinat first 10, ,adalah 2 id = 1 kordinat first 11, ,adalah 4 id = 1 kordinat first 12, ,adalah -1 id 1 second
id = 1 kordinat second 1, ,adalah 2 id = 1 kordinat second 2, ,adalah 3 id = 1 kordinat second 3, ,adalah 1 id = 1 kordinat second 4, ,adalah 3 id = 1 kordinat second 5, ,adalah 4 id = 1 kordinat second 6, ,adalah 5 id = 1 kordinat second 7, ,adalah 1 id = 1 kordinat second 8, ,adalah 5 id = 1 kordinat second 9, ,adalah 3 id = 1 kordinat second 10, ,adalah 3 id = 1 kordinat second 11, ,adalah 4 id = 1 kordinat second 12, ,adalah -1
3.7.7 Proses random pada id 2
if (id==2)
/*Memeriksa id prosesor*/
{
printf("id 2 first \n"); /*Mencetak id 2*/
for ( c = 1 ; c <= zz ; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 2 kordinat first %d, ,adalah %d \n", c, first[c]); /*Mencetak id = 2 kordinat first*/
} if (id==2) /*Memeriksa id prosesor*/ { printf("id 2 second \n"); /*Mencetak id 2*/ for ( c = 1 ; c <= zz; c++ )
/*Melakukan perulangan dari 1 sampai variabel zz*/
printf("id = 2 kordinat second %d, ,adalah %d \n", c, second[c]);
/*Mencetak id = 2 kordinat second*/
}
Output program: id 2 first
id = 2 kordinat first 1, ,adalah 5 id = 2 kordinat first 2, ,adalah 3 id = 2 kordinat first 3, ,adalah 1 id = 2 kordinat first 4, ,adalah 3 id = 2 kordinat first 5, ,adalah 4 id = 2 kordinat first 6, ,adalah 4
id = 2 kordinat first 7, ,adalah 1 id = 2 kordinat first 8, ,adalah 2 id = 2 kordinat first 9, ,adalah 2 id = 2 kordinat first 10, ,adalah 2 id = 2 kordinat first 11, ,adalah 4 id = 2 kordinat first 12, ,adalah -1 id 2 second
id = 2 kordinat second 1, ,adalah 2 id = 2 kordinat second 2, ,adalah 3 id = 2 kordinat second 3, ,adalah 1 id = 2 kordinat second 4, ,adalah 3 id = 2 kordinat second 5, ,adalah 4 id = 2 kordinat second 6, ,adalah 5 id = 2 kordinat second 7, ,adalah 1 id = 2 kordinat second 8, ,adalah 5 id = 2 kordinat second 9, ,adalah 3 id = 2 kordinat second 10, ,adalah 3 id = 2 kordinat second 11, ,adalah 4 id = 2 kordinat second 12, ,adalah -1
3.7.8 Proses memasukan array random kedalam array elemen matriks pada id 0
if (id == 0)
/*Memeriksa id prosesor*/
{
for ( c = 1 ; c <= m ; c++ )
{
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
rr = rr + 1;
/*Menghitung variabel rr = variabel rr + 1*/
printf("rr id 0 = %d \n", rr); /*Mencetak variabel rr pada id 0*/
satu[c][d] = first[rr];
/*Mengisi variabel array satu [c][d] = variabel array first[rr]*/
dua[c][d] = second[rr];
/*Mengisi variabel array dua [c][d] = variabel array second[rr]*/ } } } Output program: rr id 0 = 1 rr id 0 = 2 rr id 0 = 3 rr id 0 = 4
rr id 0 = 5 rr id 0 = 6 rr id 0 = 7 rr id 0 = 8 rr id 0 = 9
3.7.9 Proses memasukan array random kedalam array elemen matriks pada id 1
if (id == 1)
/*Memeriksa id prosesor*/
{
for ( c = 1 ; c <= m ; c++ )
/*Melakukan perulangan dari 1 sampai variabel m*/ {
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
rr = rr + 1;
/*Menghitung variabel rr = variabel rr + 1*/
printf("rr id 1 = %d \n", rr); /*Mencetak variabel rr pada id 1*/
satu[c][d] = first[rr];
/*Mengisi variabel array satu [c][d] = variabel array first[rr]*/
dua[c][d] = second[rr];
/*Mengisi variabel array dua [c][d] = variabel array second[rr]*/ } } } Output program: rr id 1 = 1 rr id 1 = 2 rr id 1 = 3 rr id 1 = 4 rr id 1 = 5 rr id 1 = 6 rr id 1 = 7 rr id 1 = 8 rr id 1 = 9
3.7.10 Proses memasukan array random kedalam array elemen matriks pada id 2
if (id == 2)
/*Memeriksa id prosesor*/
{
/*Melakukan perulangan dari 1 sampai variabel m*/
{
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
rr = rr + 1;
/*Menghitung variabel rr = variabel rr + 1*/
printf("rr id 2 = %d \n", rr); /*Mencetak variabel rr pada id 2*/
satu[c][d] = first[rr];
/*Mengisi variabel satu [c][d] = variabel first[rr]*/
dua[c][d] = second[rr];
/*Mengisi variabel dua [c][d] = variabel second[rr]*/
} } } Output program: rr id 2 = 1 rr id 2 = 2 rr id 2 = 3 rr id 2 = 4 rr id 2 = 5 rr id 2 = 6 rr id 2 = 7
rr id 2 = 8 rr id 2 = 9
3.7.11 Proses perulangan elemen-elemen matriks pada id 0
if (id == 0)
/*Memeriksa id prosesor*/
{
for ( c = 1 ; c <= m ; c++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
printf("kordinat satu %d,%d ,adalah %d \n", c, d, satu[c][d]); /*Mencetak informasi kordinat satu dan nilai variabel array satu [c][d]*/
printf("kordinat dua %d,%d ,adalah %d \n", c, d,dua[c][d]);
/*Mencetak informasi kordinat dua dan nilai variabel array dua [c][d]*/
} }
Output program:
kordinat satu 1,1 ,adalah 5 kordinat dua 1,1 ,adalah 2
kordinat satu 1,2 ,adalah 3 kordinat dua 1,2 ,adalah 3 kordinat satu 1,3 ,adalah 1 kordinat dua 1,3 ,adalah 1 kordinat satu 2,1 ,adalah 3 kordinat dua 2,1 ,adalah 3 kordinat satu 2,2 ,adalah 4 kordinat dua 2,2 ,adalah 4 kordinat satu 2,3 ,adalah 4 kordinat dua 2,3 ,adalah 5 kordinat satu 3,1 ,adalah 1 kordinat dua 3,1 ,adalah 1 kordinat satu 3,2 ,adalah 2 kordinat dua 3,2 ,adalah 5 kordinat satu 3,3 ,adalah 2 kordinat dua 3,3 ,adalah 3
3.7.12 Proses perulangan elemen-elemen matriks pada id 1
if (id == 1)
/*Memeriksa id prosesor*/
{
for ( c = 1 ; c <= m ; c++ )
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
printf("kordinat satu %d,%d ,adalah %d \n", c, d, satu[c][d]); /*Mencetak informasi kordinat satu dan nilai variabel array satu[c][d]*/
printf("kordinat dua %d,%d ,adalah %d \n", c, d, dua[c][d]);
/*Mencetak informasi kordinat dua dan nilai variabel array dua [c][d]*/
} }
Output program:
kordinat satu 1,1 ,adalah 5 kordinat dua 1,1 ,adalah 2 kordinat satu 1,2 ,adalah 3 kordinat dua 1,2 ,adalah 3 kordinat satu 1,3 ,adalah 1 kordinat dua 1,3 ,adalah 1 kordinat satu 2,1 ,adalah 3 kordinat dua 2,1 ,adalah 3 kordinat satu 2,2 ,adalah 4 kordinat dua 2,2 ,adalah 4 kordinat satu 2,3 ,adalah 4 kordinat dua 2,3 ,adalah 5 kordinat satu 3,1 ,adalah 1 kordinat dua 3,1 ,adalah 1 kordinat satu 3,2 ,adalah 2 kordinat dua 3,2 ,adalah 5 kordinat satu 3,3 ,adalah 2
kordinat dua 3,3 ,adalah 3
3.7.13 Proses perulangan elemen-elemen matriks pada id 2
if (id == 2)
/*Memeriksa id prosesor*/
{
for ( c = 1 ; c <= m ; c++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
for ( d = 1 ; d <= m ; d++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
printf("kordinat satu %d,%d ,adalah %d \n", c, d, satu[c][d]); /*Mencetak informasi kordinat satu dan nilai variabel array satu[c][d]*/
printf("kordinat dua %d,%d ,adalah %d \n", c, d,dua[c][d]);
/*Mencetak informasi kordinat dua dan nilai variabel array dua [c][d]*/
} }
Output program:
kordinat satu 1,1 ,adalah 5 kordinat dua 1,1 ,adalah 2 kordinat satu 1,2 ,adalah 3
kordinat dua 1,2 ,adalah 3 kordinat satu 1,3 ,adalah 1 kordinat dua 1,3 ,adalah 1 kordinat satu 2,1 ,adalah 3 kordinat dua 2,1 ,adalah 3 kordinat satu 2,2 ,adalah 4 kordinat dua 2,2 ,adalah 4 kordinat satu 2,3 ,adalah 4 kordinat dua 2,3 ,adalah 5 kordinat satu 3,1 ,adalah 1 kordinat dua 3,1 ,adalah 1 kordinat satu 3,2 ,adalah 2 kordinat dua 3,2 ,adalah 5 kordinat satu 3,3 ,adalah 2 kordinat dua 3,3 ,adalah 3
3.7.14 Proses perulangan untuk perkalian elemen-elemen matriks
for (c = 1 ; c <= m ; c++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
for (d = id + 1 ; d <= m ; d+=w )
/*Melakukan perulangan dari id + 1 sampai variabel m dengan penambahan sebanyak variabel w*/
{
for (k = 1 ; k <= m ; k++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
sum = sum + satu[c][k]*dua[k][d];
/*Menghitung nilai variabel sum = variabel sum + variabel array satu[c][k] * variabel array dua [k][d]*/
}
multiplay [c][d] = sum ;
/*Mengisi variabel array multiplay [c][d] = variabel sum*/
multiplaybuf [c][d] = sum ;
/*Mengisi variabel array multiplaybuf [c][d]= variabel sum*/
sum = 0 ;
/*Mengisi variabel sum = 0*/
}
}
3.7.15 Proses reduksi jika jumlah node 2
/*Memeriksa variabel w*/
{
MPI_Reduce(&multiplaybuf, &multiplay, zz, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
/*Mengumpulkan data dari tiap – tiap prosesor*/
}
3.7.16 Proses reduksi jika jumlah node 3
if (w == 3)
/*Memeriksa variabel w*/
{
MPI_Reduce(&multiplaybuf, &multiplay, zz, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
/*Mengumpulkan data dari tiap –tiap prosesor*/
}
3.7.17 Proses perulangan dengan tampilan akhir program
printf("=======================================\n"); /*Mencetak garis === */
for ( c = 1 ; c <= m ; c++ )
/*Melakukan perulangan dari 1 sampai variabel m*/
{
for ( d = id + 1 ; d <= m ; d+=w )
/*Melakukan perulangan dari 1 sampai variabel m dengan penambahan sebanyak variabel w*/
printf("kordinat hasil %d,%d ,adalah %d \n", c, d, multiplay[c][d]);
/*Mencetak informasi kordinat hasil dan nilai variabel multiplay [c][d]*/
}
printf("nama processor adalah %s\r\n", processor_name); /*Mencetak informasi nama prosesor dan node yang mengerjakannya*/
waktu_akhir = MPI_Wtime(); /*waktu akhir perhitungan*/ printf("=======================================\n"); /*Mencetak garis ===*/ if ( id == 0) /*Memeriksa id prosesor*/ {
/*Mengukur kecepatan hitung dengan mengurangi nilai variabel waktu_akhir – variabel waktu_awal*/
printf("lama waktu yang dibutuhkan adalah %.20f\n", durasi); /*Mencetak lama waktu yang dibutuhkan dan nilai dari variabel durasi*/
}
MPI_Finalize ( );
/*keluar dari MPI atau membatalkan proses yang masih berjalan*/
}
Output program:
================================================ kordinat hasil 1,3 ,adalah 23
kordinat hasil 2,3 ,adalah 35 kordinat hasil 3,3 ,adalah 17 nama processor adalah fitria-PC
================================================ kordinat hasil 1,1 ,adalah 20
kordinat hasil 2,1 ,adalah 22 kordinat hasil 3,1 ,adalah 10 nama processor adalah acer-PC
================================================ lama waktu yang dibutuhkan adalah 0.03112172845703753400 ================================================ kordinat hasil 1,2 ,adalah 32
kordinat hasil 2,2 ,adalah 45 kordinat hasil 3,2 ,adalah 21 nama processor adalah ningrum-PC
3.8 Structured Chart
3.9 Pengujian Program Secara Manual
Untuk pengujian, dapat digunakan rumus matriks persegi dimana jumlah barisnya sama dengan jumlah kolomnya.
Matriks A Matriks B 1 2 3 1 2 3 1 2 3 2 2 1
Contoh perhitungan manual : ((1*1)+(2*2)+(3*2)) ((1*2)+(2*2)+(3*3)) ((1*3)+(2*1)+(3*3)) Matriks A*B= ((1*1)+(2*2)+(3*2)) ((1*2)+(2*2)+(3*3)) ((1*3)+(2*1)+(3*3)) ((2*1)+(2*2)+(1*2)) ((2*2)+(2*2)+(1*3)) ((2*3)+(2*1)+(1*3)) 11 15 14 Matriks A*B = 11 15 14 8 11 11
Dari hasil penghitungan di atas maka didapat nilai matriks . Pada PC Cluster apabila menggunakan 2 node atau lebih dan memiliki task lebih dari satu maka PC Cluster secara otomatis akan membagi tasks tersebut ke node yang lain.