Professional Documents
Culture Documents
Latar Belakang
Perkalian dua matrix yang masing-masing berukuran n x n dari matrix persegi A dan
B untuk menghasilkan matrix C (C = AxB) secara parallel dengan menggunakan prosesor
sebanyak m, dimana m ≤ n pada dasarnya mirip dengan perkalian matrix dengan
metode konvensional (algoritma sekuensial).
Dengan mengasumsikan bahwa:
1. n sel matrix adalah hasil pangkat 2.
2. Jumlah processor yang digunakan adalah m = n^3 sehingga n > m
3. processor di disusun dalam array tiga dimensi. Processor Pi,j,k masing-masing
dengan index (i,j,k)
4. digunakan 3 dimensi array C[1..n,1..n,1..n] dalam shared memory sebagai
tempat kerja
5. Hasil matrix akan disimpan dalam lokasi C[i,j,n], dimana 1≤ i,j ≤ n
Algoritma sekuensial-nya adalah
Algoritma 1
1. procedure MAT_MULT (A, B, C)
2. begin
3. for i := 0 to n - 1 do
4. for j := 0 to n - 1 do
5. begin
6. C[i, j] := 0;
7. for k := 0 to n - 1 do
8. C[i, j] := C[i, j] + A[i, k] x B[k, j];
9. endfor;
10. end MAT_MULT
Sekilas dapat diketahui bahwa waktu terburuk yang dibutuhkan oleh algoritma diatas
adalah sebanyak n3 atau θ(n3).
Proses parallelisasi algoritma diatas dapat dilakukan dengan menggunakan
pendekatan block matrix operations, dimana matrix asal yang relatif berukuran besar
dipecah menjadi blok kecil, misal matrix dengan ukuran nxn dapat dibagi menjadi
beberapa matrix kecil dengan ukuran qxq dimana Ai,j (0 ≤ i, j < q)). Sedemikian sehingga
setiap block akan berukuran (n/q) x (n/q). Dengan demikian algoritma diatas dapat
dimodifikasi menjadi:
Algoritma 2
Pada algoritma 2, terlihat pada baris 8 dilakukan operasi penjumlahan dan perkalian
sekaligus. Berbeda dengan algoritma 1, pada algoritma 2 terjadi perkalian matrix
sebanyak q3 yang melibatkan matrix (n/q) x (n/q) dan memerlukan sebanyak (n/q)3
1
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
penjumlahan serta perkalian. Proses ini dapat kita bagi kedalam p prosesor secara
parallel dengan memilih q p dan melakukan komputasi blok kecil Ci,j ke setiap
ptosesor.
Algoritma Cannon
Algoritma cannon merupakan salah satu algoritma yang dapat digunakan untuk
melakukan perkalian matrix dengan pemakaian memori yang efisien. Berikut merupakan
detail dari algoritma Cannon:
1. inisialisasi prosesor Pi,j dengan elemen ai,j dan bi,j (0≤ i < n; 0 ≤ j < n).
2. elemen dipindahkan dari posisi awal sebagai berikut: matrix A beris ke-i diputar
satu putaran ke kiri dan matrix B kolom ke-j diputar satu putaran keatas sehingga
akan dihasilkan matrix baru dengan elemen ai,j+i dan bi+j,j .
j
i
A
Pi,j Gambar 1. perputaran elemen matrix A
dan B.
2
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
6. langkah 4 dan 5 dilakukan secara berulang sampai dengan seluruh elemen baris
dan kolom diputar (n-1 putaran baris dan kolom).
x =
A B C
2a
x =
A B C
2b
3
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
3
Setiap blok/proses akan melakukan komputasi sebanyak 2n , dimana
p
setiap blok akan mengakses sebanyak 2n n elemen. Rasio antara komputasi
p
3
2n
p n
dan komunikasi yang terjadi adalah 2
.
2n p
p
4
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
/*********************************************************/
/*putar blok & isikan nilai perhitungan*/
MPI_Cart_shift(GRID_COMM,1,-1,&source,&dest);
MPI_Sendrecv_replace(TA,S2,MPI_INT,dest,0,source,
0,GRID_COMM,&status);
MPI_Cart_shift(GRID_COMM,0,-1,&source,&dest);
MPI_Sendrecv_replace(TB,S2,MPI_INT,dest,0,source,
0,GRID_COMM,&status);
/*********************************************************/
Cuplikan kode berikut merupakan topologi virtual yang digunakan pada algoritma
cannon ini:
/*********************************************************/
/*untuk buat topologi*/
M=(int)sqrt(nproc);
S=N/M; /*dimensi blok*/
S2=S*S; /*dimensi blok*/
dims[0]=dims[1]=M; /*dimensi topologi*/
periods[0]=periods[1]=1;
//membuat comm baru
MPI_Cart_create(MPI_COMM_WORLD,2,dims,periods,0,&GRID_COMM);
MPI_Comm_rank(GRID_COMM,&grid_rank);
MPI_Cart_coords(GRID_COMM,grid_rank,2,coords);
myid=grid_rank;
source=coords[0];
dest=coords[1];
/*********************************************************/
Detail lengkap kode program dapat dilihat pada lampiran 1.
Algoritma Fox
Mirip dengan algoritma Cannon, algoritma Fox juga melakukan rotasi elemen,
tetapi rotasi elemen yang terjadi melibatkan broadcast elemen baris matrix A dan
perputaran kolom matrix B pada setiap tahap komputasinya. Berikut merupakan langkah
yang dilakukan pada algoritma Fox:
1. dilakukan perkalian elemen matrix ai,j x bi,j, ci,j ai,j x bi,j
2. tahap berikutnya (tahap ke k, 1 ≤ k < n) dilakukan: ci,j ci,j + ai,k x bk,j
dimana k = (i+k)mod n, n = merupakan ukuran matrix tersebut.
Pada tahap 1, ci,j dihitung sebagai hasil perkalian dari ai,j dan bi,j, dan pada tahap ke-k,
ci,j dihitung sebagai hasil perkalian antara ai,k dengan bk,j.
Algoritma sekuensial diatas dapat diparallelkan kedalam sejumlah prosesor (p<n).
n
Ukuran setiap blok matrix adalah q x q dimana q p dan n . Pada setiap langkah
q
ke-k>0, proses pi,j (0 ≤ i, j ≤ q) akan menghitung sub-blok ci,j sebagai hasil perkalian dari
sub-blok ai,k yang di-broadcast oleh proses pi,k (pada baris yang sama) dan bi,k dari pi,j
proses dari atas kebawah dari pk ,j.
5
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
set C = 0
for (stage = 0 ∶ p − 1) do
o Tiap baris prosesor i, mem-broadcast sub-blok Ai ,( j i ) mod p
ke prosesor lain pada
baris yang sama, setiap prosesor menyimpan subblok broadcast dalam sebuah
array T
o Kalikan sub-matriks temporer T pada tiap prosesor dengan sub-blok B sekarang dan
tambahkan hasilnya ke C
o Setiap prosesor mengirimkan sub-blok B sekarang ke prosesor di atasnya dan
menerima sub-blok dari prosesor di bawahnya dan dijadikan sebagai sub-blok
sekarang yang baru. Wrap around dari atas ke bawah.
end
broadcast pada sub-grup khusus dari prosesor. Roll dilakukan sebagai varian dari
operasi MPI_Sendrecv dengan kondisi batas melingkar (wrapped). Berikut
merupakan ilustrasi proses komunikasi yang terjadi pada algoritma Fox:
5a.
7
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
5c.
Algoritma Cannon
Input dan output untuk program ini adalah berupa file text yang berisi data. File
yang dibaca terdiri dari file matrix A dan file matrix B (contoh file terlampir pada
softcopy). Berikut adalah hasil run dari program yang dibuat:
Output tampilan layar dari program ini adalah berupa informasi prosesor yang bekerja
dan waktu yang butuhkan untuk melakukan komputasi. Sebagai input digunakan matrix
berukuran 100 x 100 dan disimpan didalam file text. Hasil tidak ditampilkan pada console.
8
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Algoritma Fox
Berikut merupakan contoh tampilan layar dari program Fox yang dibut.
3
2
1
0
0 20 40 60 80
ordo matrix
9
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
jumlah prosesor
0.7
0.6
0.5
ms 0.4
0.3
0.2
0.1
0
0 5 10 15 20 25 30
#prosesor
Algoritma Cannon
Seperti terlihat pada gambar 3, terjadi perputaran baris dan kolom dimana, jarak
maksimum yang ditempuh oleh satu blok shift adalah p 1 . Operasi untuk dua putaran
2
tersebut memerlukan waktu total sebanyak 2 t s t w n . Setiap langkah dari p proses
p
2
memerlukan waktu sebesar t s t w n . Sehingga total waktu komunikasi yang diperlukan
p
2
adalah 2 t s t w n p.
p
Sedangkan untuk proses komputasinya sendiri memerlukan waktu sebagai berikut,
n
setiap proses akan melakukan sebanyak p perkalian dari sub-blok n x
.
p p
Dengan mengasumsikan bahwa setiap proses perkalian dan penjumlahan menggunakan
satu satuan waktu, maka total waktu yang diperlukan untuk setiap proses untuk
3
melakukan komputasi adalah sebesar n . Dengan demikian total waktu parallel yang
p
n3 n2
dibutuhkan oleh algoritma cannon adalah: Tp 2 p t s 2t w .
p p
10
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Ts n3
SN 3
Tp n n2
2 pt s 2t w
p p
o Efisiensinya adalah
Ts n3
E ff
pT p n3 n 2
p 2 pt s 2t w
p p
o Isoefisiensi, dengan memperhatikan waktu proses dari algoritma ini yaitu
n3 n 2
p 2 p t s 2t w dan cost optimum untuk algoritma parallel ini adalah
p p
3 3
p=O(n2). Sehingga fungsi isoefisiensi untuk ts dan tw adalah 2 p 2 t s dan 8t w p
3 2
,
dengan demikian isoefisiensi sebagai akibat adanya overhead komunikasi adalah
3
p 2 Dengan melihat nilai pangkat dari fungsi isoefisiensi tersebut diketahui
bahwa untuk mendapatkan efisiensi yang sama dengan ketika jumlah prosesor p
x3
2
maka ukuran masalah juga harus bertambah sebesar
p . Dengan kata lain,
3
2
p
apabila misalnya jumlah masalah semula adalah n3 dengan prosesor semula
adalah 4 (22) kemudian ditingkatkan menjadi 16(24) maka jumlah masalah harus
bertambah menjadi (2n)3.
Algoritma Fox
Berikut merupakan analisa kinerja algoritm Fox:
ada tiga komponen waktu yang harus dihitung untuk menentukan waktu parallel yang
diperlukan oleh algoritma Fox ini, antara lain:
waktu untuk broadcast (tbroad):
2
t broad log p t s t w n n log p t s n t w
p p p
11
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Dengan demikian total waktu yang dibutuhkan untuk seluruh proses yaitu sebanyak p
iterasi adalah
Tp Tp p
3 2
Tp p n log 4 p t s n t w
p
p p
3 2
n p log 4 p t s n t w
p p
3 2
n log 4 pt s n log 4 pt w
p p
o Speed up, dengan demikian speed up algoritma ini dapat ditentukan sebagai
berikut:
Ts n3
SN
Tp n3 log 4 p t s n
2
log 4 pt w
p p
o Efisiensinya adalah
Ts n3
E ff
pT p 3 2
p n log 4 pt s n log 4 pt w
p p
o Isoefisiensi, dengan memperhatikan waktu proses dari algoritma ini yaitu
3 2
p n log 4 p ts n log 4 pt w dan cost optimum untuk algoritma parallel ini
p p
adalah p=O(n2). Sehingga fungsi isoefisiensi untuk ts dan tw adalah
3 1 1 1
p 2
log(4 p) 2 t s dan n 2 p 2
log( 4 p) 2 t w , dengan demikian isoefisiensi sebagai akibat
adanya overhead komunikasi logaritmik dari fungsi broadcast adalah
3 1
p 2
log 3 (4 p ) 2
Perbandingan
Dengan melihat nilai speed up, effisiensi dan isoefisiensi diatas, dapat disimpulkan
bahwa algoritma cannon memiliki kinerja yang lebih baik daripada algoritma Fox.
Dimana algoritma cannon memiliki skalabilitas yang lebih baik daripada algoritma Fox
(koefisien isoefisiensi Fox > isoefisiensi Cannon).
Sebuah ekperimen yang dilakukan oleh Alqadi et.al (2008) menunjukkan bawah
algoritma Cannon memang memiliki kinerja yang lebih baik daripada algoritm Fox
(cuplikan tabel berikut)
12
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Eksperimen tersebut menunjukkan bahwa faktor Speed up (SP) dan efisiensi (E) yang
dihasilkan oleh algoritma Cannon lebih baik dari pada Fox. Ulasan lebih lengkap
mengenai eksperimen ini dapat merujuk pada referensi terlampir.
Kesimpulan
Algoritma Cannon dan Fox merupakan algoritma perkalian matrix yang dapat
diimplementasikan dengan menggunakan teknik virtual topologi. Kedua algoritma
menggunakan beberapa tahapan untuk menghitung hasil perkalian dua buah matrix
persegi. Pada algoritma Cannon, pendekatan yang digunakan dengan orientasi
putaran blok matrix berdasarkan baris dan kolom, sedangkan algoritma Fox
menggunakan pendekatan broadcast baris matrix A dan putaran keatas kolom matrix B.
Algoritma ini memiliki kesamaan yaitu sangat efisien dalam pemakaian
memori,tetapi jika dibandingkan dengan lebih detail algoritma Cannon memiliki efisiensi
dan skalabilitas yang lebih daripada algoritma Fox.
Referensi
Akpan, O.H. ____. Efficient Parallel Implementation of The Fox Algorithm. Computer
Science Dept. Bowie State Univ.
Alqadi, Z.A.A; Aqel,M; Emary, I.M.M.E. 2008. Performance Analysis and Evaluation of
Parallel Matrix Multiplication Algorithms. World Applied Sciences Journal 5 (2):
211-214, 2008. IDOSI Publications
Grama, A; Gupta, A; Karypis, George; dan Kumar, V. 2003. Introduction to Parallel
Computing, Second Edition – Chapter 8. Dense Matrix Algorithms. Addison
Wesley. USA
Quinn, M.J. 2004. Parallel Programming in C with MPI and OpenMP. McGrawHill. USA.
Wilkinson, B; Allen, M. 2005. Parallel Programming: Techniques and Applications Using
Networked Workstations and Parallel Computers, 2nd edition. Prentice Hall.
USA.
13
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
int A[N][N],B[N][N],C[N][N];
int main(int argc, char **argv){
int myid, S, M, nproc,source,dest;
int i,j,k,m,l,repeat,temp,S2;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
double t1, t2,t3,t4;
int *T,*TA,*TB,*t,*TC;
MPI_Comm GRID_COMM;
int ndims,dims[2];
int periods[2],coords[2],grid_rank;
if(myid==0) {
/* baca data dari files: "A_file", "B_file"*/
if (readmat("A_file.txt", (int *) A,N) < 0)
exit( 1 + printf("file problem\n") );
if (readmat("B_file.txt", (int *) B, N) < 0)
exit( 1 + printf("file problem\n") );
/*catat waktu*/
t1=MPI_Wtime();
}
/*untuk buat topologi*/
M=(int)sqrt(nproc);
S=N/M; /*dimensi blok*/
S2=S*S; /*dimensi blok*/
dims[0]=dims[1]=M; /*dimensi topologi*/
periods[0]=periods[1]=1;
MPI_Cart_create(MPI_COMM_WORLD,2,dims,periods,0,&GRID_COMM);
MPI_Comm_rank(GRID_COMM,&grid_rank);
MPI_Cart_coords(GRID_COMM,grid_rank,2,coords);
myid=grid_rank;
source=coords[0];
dest=coords[1];
14
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
}
}
else{
t=T;
for(i=coords[0]*S; i<(coords[0]+1)*S; i++)
for(j=coords[1]*S; j<(coords[1]+1)*S; j++){
*t=A[i][j];
t++;
}
MPI_Send(T,S2,MPI_INT,k,0,GRID_COMM);
}
}
coords[0]=source;
coords[1]=dest;
t4= MPI_Wtime();
/*perkalian matrix*/
for(repeat=0; repeat<N/S; repeat++){
for(i=0; i<S; i++){
for(j=0; j<S; j++){
for(k=0; k<S; k++){
TC[i*S+j]+=TA[i*S+k]*TB[j+k*S];
}
}
}
/*putar blok & isikan nilai perhitungan*/
MPI_Cart_shift(GRID_COMM,1,-1,&source,&dest);
MPI_Sendrecv_replace(TA,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
MPI_Cart_shift(GRID_COMM,0,-1,&source,&dest);
MPI_Sendrecv_replace(TB,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
}
MPI_Recv(T,S2,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,GRID_COMM,&status);
MPI_Cart_coords(GRID_COMM,status.MPI_TAG,2,coords);
15
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
t2= MPI_Wtime();
printf("Total Time: %lf msecs \n",(t2 - t1) / 0.001);
//printf("Transmit Time: %lf msecs \n",(t4 - t3) / 0.001);
writemat("C_file_par", (int *) C, N);
free(T);
free(TA);
free(TB);
free(TC);
}
else
{
MPI_Recv(TA,S2,MPI_INT,0,0,GRID_COMM,&status);
MPI_Recv(TB,S2,MPI_INT,0,1,GRID_COMM,&status);
MPI_Cart_shift(GRID_COMM,1,-coords[0],&source,&dest);
MPI_Sendrecv_replace(TA,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
MPI_Cart_shift(GRID_COMM,0,-coords[1],&source,&dest);
MPI_Sendrecv_replace(TB,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
for(repeat=0; repeat<N/S; repeat++){
for(i=0; i<S; i++){
for(j=0; j<S; j++){
for(k=0; k<S; k++){
TC[i*S+j]+=TA[i*S+k]*TB[j+k*S];
}
}
}
MPI_Cart_shift(GRID_COMM,1,-1,&source,&dest);
MPI_Sendrecv_replace(TA,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
MPI_Cart_shift(GRID_COMM,0,-1,&source,&dest);
MPI_Sendrecv_replace(TB,S2,MPI_INT,dest,0,source,0,GRID_COMM,&status);
}
MPI_Send(TC,S2,MPI_INT,0,myid,GRID_COMM);
free(TA);
free(TB);
free(TC);
}
MPI_Finalize();
return(0);
}
/*Fungsi untuk baca input dan tulis output kedalam file*/
#define _mat(i,j) (mat[(i)*n + (j)])
readmat(char *fname, int *mat, int n){
FILE *fp;
int i, j;
if ((fp = fopen(fname, "r")) == NULL)
return (-1);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (fscanf(fp, "%d", &_mat(i,j)) == EOF){
fclose(fp);
return (-1);
};
fclose(fp);
return (0);
}
writemat(char *fname, int *mat, int n){
FILE *fp;
int i, j;
16
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
printf("\n");
}
}
Algoritma Fox
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <mpi.h>
typedef struct{
int p; //#prosesor
int mypid; //procesor id
int oldpid; //id prosesor yg lama
int myrow; //jumlah baris
int mycol; //jumlah kolom
int q; //ukuran blok
MPI_Comm comm; //communicator utk seluruh blok
MPI_Comm r_comm;//communicator utk blok baris
MPI_Comm c_comm;//communicator utk blok kolom
}GRID_TOP_TYPE;
/*fungsi utama*/
main(int argc,char **argv){
int n1,step,k;
int source,dest;
int tag=22;
double **A,**B,**C;
double **localA,**localB,**localC,**temp_A;
double t1,t2;
MPI_Status status;
GRID_TOP_TYPE *grid;
/*start MPI*/
MPI_Init(&argc,&argv);
/*buat blok*/
grid=(GRID_TOP_TYPE *)malloc(sizeof(GRID_TOP_TYPE));
create_grid(grid);
printf("jum prosesor:%d, ukuran grid: %d\n",grid->p,grid->q);
17
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
printf("\n");
printf("hasilnya:\n");
Mprint(grid->myrow,grid->mycol,n1,C);
printf("\n");
printf("\n\nWaktu yang diperlukan %d processes = %lf msecs\n",grid->p,(t2-t1)/0.001);
MPI_Finalize();
}
/*fungsi untuk inisialisasi matrix*/
double **inMatrix(int i,int j,int n,double r){
int a,b;
double **p;
double *pp;
for(a=0;a<n;a++)
for(b=0;b<n;b++){
if(a==b)p[a][b]=r;
else if(a<b) p[a][b]=r+j;
else p[a][b]=r+i;
}
return p;
} //inisialisasi matrix
/*untuk penjumlahan matrix*/
void Pmatrix(int n,double **A,double **B,double **C){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
C[i][j]=A[i][j]+B[i][j];
}
/*untuk mengkalikan matrix*/
void Tmatrix(int n,double **A,double **B,double **C){
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
C[i][j]=0.0;
for(k=0;k<n;k++)
C[i][j]+=A[i][k]*B[k][j];
}
}
/*inisialisasi satu matrix dengan yang lain*/
void MinMatrix(double **A,double **B,int n){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=B[i][j];
}
/*print matrix ke layar*/
void Mprint(int i,int j,int n,double **A){
int a,b;
//printf("M[%d,%d]=\n",i,j);
for(a=0;a<n;a++)
for(b=0;b<n;b++){
printf("%8.0f ",A[a][b]);
18
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
if(b==n-1)printf("\n");
}
}
grid->q=(int)sqrt((double)grid->p);
dim[0]=dim[1]=grid->q;
period[0]=period[1]=1;
MPI_Cart_create(MPI_COMM_WORLD,2,dim,period,1,&(grid->comm));
MPI_Comm_rank(grid->comm,&(grid->mypid));
MPI_Cart_coords(grid->comm,grid->mypid,2,coord);
grid->myrow=coord[0];
grid->mycol=coord[1];
19