Anda di halaman 1dari 11

Metode Desain Foster

dan
Implementasinya dalam Mencari Nilai π

REZKY ANADRA
Software Engineering and Information System Laboratory
Department of Computer Science
Bogor Agricultural University, Indonesia

Ian Foster menemukan suatu metode desain sistem parallel yang dimulai dari pembagian
data/komputasi ke dalam beberapa bagian, menentukan komunikasi antar bagian,
mengelompokkan bagian yang memiliki komunikasi intensif dengan bagian lain, dan memetakan
kelompok tersebut ke sejumlah prosesor yang ada.

Menurut Foster, langkah-langakh untuk mendesain algoritma parallel adlah sebagai berikut:
a. Partisi(Partitioning)
b. Komunikasi(Communication)
c. Aglomerasi(Agglomeration)
d. Pemetaan(Mapping)

Problem Partisi Komunikasi

Pemetaan Aglomerasi

Figure 3.2 Metode Foster

1. Partisi (Partitioning)
Langkah pertama yang harus kita lakukan dalam merancang suatu proses paralellisme adalah
memilah dan mencari bagian-bagian yang mungkin dilakukan secara paralel. Partitioning adalah
suatu proses pembagian komputasi dan data ke dalam beberapa bagian. Partitioning yang baik
adalah yang mampu membagi data dan komputasi ke dalam bagian yang sangat kecil. Untuk
melakukan ini kita bisa menggunakan dua pendekatan yaitu pendekatan data centric dan

©Copyright 2008 | ANADRA 1


pendekatan computation-centric.

a. Domain decomposition yaitu pendekatan algoritme desain paralel dimana


pertama-tama kita harus membagi data ke dalam beberapa bagian kemudian
menentukan bagaimana hubungan yang terjadi antara komputasi dan data.
Intinya kita berfokus kepada data yang paling sering diakses di dalam
program.

b. Functional decomposition adalah lawan dari proses sebelumnya. Pada


proses ini kita membagi komputasi ke dalam bagian-bagian, kemudian
menentukan bagaimana hubungan data dengan komputasi yang ada. Sebagai
contoh sebuah sistem high-performance yang mendukung proses
pemotretan proses bedah otak. Sebelum pembedahan dimulai sistem
memasukkan hasil scan otak pasien dari mesin CT scan dan mendaftarkan
gambar tadi dan membuatkan model tiga dimensinya. Selama proses
pembedahan, sistem merekam posisi alat bedah, mengonversi koordinat
fisik ke koordinat gambar dan menampilkannya pada layar monitor. Ketika
suatu tugas mengonversi suatu gambar dari koordinat fisik ke koordiat
gambar, tugas kedua dapat menampilkan gambar sebelumnya, dan tugas
ketiga dapat merekam posisi alat untuk menghasilkan gambar berikutnya.

Apapun dekompisisi yang dipilih kita menyebutnya primitive task. Tujuan utamanya adalah
mengidentifikasi sebanyak mungkin primitive task karena primitive task adalah modal dasar dalam
melakukan proses paralelisme. Kita dapat menggunakan empat kriteria di bawah untuk
mengevaluasi kualitas suatu partisi yang dibuat. Partisi yang berkualitas baik mampu memenuhi
semua kriteria tersebut.

a. Minimal ada suatu primitive task terurut yang jauh lebih banyak
daripada prosesor pada komputer paralel target.
b. Redundansi pada komputasi dan redundansi pada struktur
penyimpanan data minimal.(Jika kondisi ini tak terenuhi maka desain tidak akan berjalan baik
ketika ukuran masalah meningkat).
c. Primitive task relatifberukuran sama. (Jika tidak maka sulit untuk
menyeimbangkan kerja antar prosesor).
d. Jumlah tugas adalah fungsi peningakatan dari ukuran masalah.
(Jika tidak maka sangat tidak mungkin menggunakan lebih banyak prosesor untuk
memecahkan masalah yang lebih besar).

Posisi alat
pengambil
gambar

Mengambil Mendaftarkan Mendefinisikan


gambar pasien gambar lokasi gambar

Menampilkan
gambar

Figure 3.4 Functional Decomposition pada


pengambilan gambar proses bedah otak

2. Komunikasi (Communication)

©Copyright 2008 | ANADRA 2


Setelah melakukan pembagian maka kita harus membuat suatu skema komunikasi antar bagian
tersebut. Ada dua jenis komunikasi yang digunakan yaitu global dan local. Ketika suatu tugas
(task) membutuhkan suatu nilai dari sejmlah kecil task yang lain, maka kita membuat channel dari
task yang menghasilkan data ke task yang menggunakan data. Komunikasi ini adalah contoh dari
Local Communication. Di lain hal Global Communication digunakan ketika sejumlah besar
primitive task harus menghasilkan data untuk menunjang suatu proses komputasi.

Contoh dari komunikasi global adalah kalkulasi penjumlahan nilai yang dilakukan oleh suatu prose
primitif. Selama komunikasi global dibutuhkan secara umum tidak diperlukan channel komunikasi
pada tahap desain algoritme.

Untuk mengevaluasi kualitas struktur komunikasi yang telah dibuat, ada empat kriteria yang bisa
diperhatikan yaitu :
a) Operasi komunikasi seimbang antara satu tugas dengan tugas yang lain.
b) Setiap modul komunikasi tugas hanya memiliki sejumlah kecil tetangga.
c) Task dapat menunjang komunikasi serempak.
d) Task mampu menunjang komputasi serempak.

3. Aglomerasi (Agglomeration)
Dua proses pertama berfokus pada identifikasi sebanyak mungkin paralelisme yang mungkin.
Sementara pada tahap ini kita tidak harus mendesain task yang mampu dieksekusi secara efisien
pada prosesor sebenarnya. Sebagai contoh jika jumlah task jauh melebihi jumlah prosesor dengan
mudah menjadikan task-task ini sebagai sumber overhead. Fokus utama pada dua tahap terakhir ini
adalah terbentuknya arsitektur task, baik multicomputer maupun multiprocessor. Kita harus
mengombinasikan primitive task kedalam task yang lebih besar kemudian memetakan kedalam
prosesor fisik untuk mengurangi jumlah overhead pada proses paralelisme tersebut.

Agglomeration adalah proses mengelompokkan task ke dalam task yang lebih besar guna
meningkatkan kinerja maupun menyederhanakan pemrograman. Terkadang kita menginginkan
jumlah task yang berhubungan lebih besar daripada jumlah prosesor dimana algoritma paralel akan
mengeksekusinya. Seringkalai ketika pengembangan pemrograman parallel dengan MPI, tahap
agglomerasi terlupakan pada tiap task per prosesor.

Tujuan pertama dari aglomerasi adalah mengurangi overhead pada komunikasi. Jika primitive task
yang berkomunikasi satu sama lain diaglomerasi, maka komunikasi akan terhenti karena nilai data
yang dikontrol oleh primitive task sekarang berada pada memori task yang tengah
dikonsolidasikan. Hal ini disebut peningkatan lokalitas algoritme paralel. Jika task tersebut tidak
mampu menunjang proses komputasi serempak dikarenakan task terakhir tengah menunggu data
dari task sebelumnya. Maka hal terbaik adalah melakukan aglomerasi pada proses tersebut.

Cara lain untuk mengurangi overhead komunikasi adalah mengombinasikan task pengiriman dan
penerimaan. Pada pengiriman lebih rendah, pesan panjang membutuhkan waktu lebih singkat
untuk sampai dibandingkan pengiriman banyak pesan pendek dengan panjang total sama, karena
adanya message latency yang terjadi setiap kali pesan dikirim dan waktu itu tergantung pada
panjang pesan.

(a)

(b)

©Copyright 2008 | ANADRA 3


Figure 3.5 Aglomerasi mampu mengeliminasi komunikasi atau
minimal mengurangi overhead. (a) Mengkombinasikan task yang
terhubun melalui suatu channel yang mengeliminasi komunikasi
tersebut, meningkatkan lokalitas algoritma paralel. (b)
Mengkombinasikan pengiriman dan penerimaan task yang
mengurangi jumlah transmisi pesan.

Tujuan kedua aglomerasi adalah mengatur skalabilitas desain paralel. Harus dipastikan bahwa
tidak terjadi pengkombinasian banyak task yang hampir tidak memungkin untuk diproses dalam
banyak prosesor. Sebagai contoh, kita mengembangkan suatu program paralel yang mengubah
matrix 3 dimensi berukuran 8x128x256. Kita menginginkan eksekusi program dilakukan secara
tersentralisasi pada 4 prosesor. Setiap task bertanggungjawab terhadap submatrix berukuran
2x128x256. Dalam kasus ini kita tidak bisa melakukan eksekusi program ini pada lebih dari 5
prosesor tanpa mengubah desainnya yang berakibat pada perubahan kode program tentunya. Maka
proses aglomerasi terhadap dimensi kedua dan ketiga matrix adalah hal terbaik yang bisa
dilakukan.

Tujuan ketiga dari aglomerasi adalah mengurangi biaya perekayasaan perangkat lunak. Jika kita
memparalelkan program sekuensial, satu proses aglomerasi memungkinkan kita untuk
menggunakan kode sekuensial yang telah ada, mengurangi waktu dan mahalnya pengembangan
program.

Beberapa kriteria Foster yang bisa digunakan untuk mengukur kualitas suatu aglomerasi adalah :
a. Aglomerasi telah meningkatkan lokalitas program paralel.
b. Replikasi komputasi membutuhkan waktu yang jauh lebih singkat daripada
komunikasi yang dihilangkan.
c. Jumlah replikasi data cukup kecil bagi algoritme.
d. Tugas-tugas aglomerasi memiliki biaya komunikasi dan komputasi yang hampir
sama.
e. Jumlah task yang ada adalah fungsi peningkatan dari jumlah masalah.
f. Jumlah task yang ada minimal sebanyak prosesor pada komputer target.
g. Trade off antara aglomerasi yang dipilih dan biaya modifikasi menjadi kode
sekuensial yang telah ada masih dalam batas wajar.

4. Pemetaan (Mapping)
Pemetaan adalah proses penandaan task ke prossor. Jika kita mengeksekusi program pada
multiprosesor tersentralisasi, sistem operasi secara otomatis memetakan proses ke prosesor. Pada
bahasan ini diasumsikan bahwa target sistem adalah komputer parallel dengan memori
terdistribusi.

Tujuan dari pemetaan adalah memaksimalkan kemampuan prosesor dan meminimalkan


komunikasi antar prosesor. Kemampuan prosesor adalah persentasi rata-rata waktu prosesor dalam
mengeksekusi suatu task untuk menyelesaikan suatu masalah dan memberi suatu solusi
penyelesaian. Kemampuan prosesor maksimal jika komputasi berjalan seimbang yang
memungkinkan semua prosesor memulai dan mengakhiri proses eksekusi pada waktu yang sama.
Di sisi lain, kemampuan prosesor minimal jika satu atau lebih prosesor mengalami idle (ditunda
bekerja) karena adanya peringatan sibuk.

Komunikasi antar prosesor meningkat ketika dua task atau lebih terhubung oleh suatu channel
yang dipetakan ke prosesor berbeda. Komunikasi antar prosesor menurun jika dua task terhubung
oleh suatu channel yang dipetakan pada prosesor yang sama.

Sebagai contoh proses pemetaan pada Figure 3.6. Delapan task dipetakan pada 3 prosesor.
Prosesor kiri dan kanan bertanggungjawab terhadap dua task sementara prosesor tengah
bertanggungjawab terhadap 4 prosesor. Jika semua prosesor punya kecepatan yang sama dan setiap

©Copyright 2008 | ANADRA 4


task membutuhkan jumlah waktu yang sama untuk bekerja, maka prosesor tengah akan
menghabiskan dua kali lebih banyak waktu eksekusi daripada dua prosesor lainnya. Jika setiap
channel mengkomunikasikan jumlah data yang sama, maka prosesor tengah juga akan
bertanggungjawab dua kali lebih banyak komunikasi antar prosesor dibanding dua prosesor yang
lain.

A A C

B C H
E
E F
D
B F
G
G H D

(a) (b)

Figure 3.6 Proses pemetaan. (a) Sebuah graf task/channel. (b) Pemetaan
task pada tiga prosesor. Beberapa channel merepresentasikan komunikasi
dalam prosesor sementara yang lain merepresentasikan komunikasi antar
prosesor.

Peningkatan kemampuan prosesor dan meminimalisir komunikasi antar prosesor sering memiliki
tujuan yang berseberangan. Sebagai contoh, misalkan tersedia sebanyak p prosesor. Pemetaan
setiap task ke prosesor yang sama mampu menurunkan komunikasi antar prosesor hingga 0,
namun mengurangi kemampuan prosesor sebesar 1/p. Tujuannya sekarang adalah bagaimana
memilih suatu pemetaan yang merepresentasikan suatu titik tengah diantara memaksialkan
kemampuan prosesor dan mengurangi komunikasi.

Sayangnya menemukan suatu solusi optimal dalam masalah pemetaan cukup sulit. Artinya tidak
ada algoritma polynomial-time untuk memetakan task ke prosesor untuk meminimalkan waktu
eksekusi.

Ketika suatu masalah dipartisi dengan domain decomposition , task setelah melalui proses
aglomerasi seringkali memiliki ukuran yang sama. Artinya komputasi yang dilakukan seimbang
antar task. Jika komunikasi antar task regular, strategi yang baik adalah membentuk p aglomerasi
yang meminimalkan komunikasi dan memetakan setiap task ke prosesornya masing-masing.

Beberapa permasalahan terkadang berupa sebuah mode komunikasi tak terstruktur antar task. Pada
kasus ini sangat penting pemetaan task ke prosesor untuk meminimalkan overhead komunikasi
pada program parallel. Sebuah algoritme static load-balancing yan dieksekusi sebelum program
mulai dijalankan, dapat mendefinisikan strategi pemetaan.

Pada kasus ini kita berfokus kepada desain sejumlah tetap task. Algoritme dynamic load-balancing
dibutuhkan ketika task dibuat dan dihapus pada suatu run-time atau komunikasi/komputasi

©Copyright 2008 | ANADRA 5


berskala sangat luas. Sebuah algoritma dynamic load-balancing dilibatkan dalam mengeksekusi
program parallel pada kasus ini. Task yang ada dianalisa dan hasilnya adalah suatu pemetaan task
yang baru pada prosesor.

Akhirnya, beberapa desain parallel mendukung pembentukan task jangka pendek guna menunjang
fungsi utama. Task yang ada tidak berkomunikasi satu dengan yang lainnya. Setiap task diberi sub
masalah untuk dipecahkan dan mengembalikan solusi permasalahan tersebut. Algoritma
penjadwalan task dapat tersentralisasi dan terdistribusi.

a) Algoritme Penjadwalan Task Tersentralisasi


Pada algoritme penjadawalan task tersentralisasi, prosesor dibagi menjadi satu manajer dan
banyak pekerja. Prosesor yang berperan sebagai manajer mengatur serangkaian tugas yang
hendak dilakukan. Ketika sebuah prosesor pekerja tidak melakukan apapun, maka prosesor
tersebut meminta tugas kepada prosesor manajer. Prosesor manajer memeberikan tugas.
Prosesor pekerja menyelesaikan tugas dan mengembalikan solusi masalah, kemudian meminta
tugas lainnya dan begitulah seterusnya. Masalah potensial pada penjadwalan kerja prosesor
manajer/pekerja adalah prosesor manajer bisa menjadi sumber masalah, semisal manajer
mengalokasikan multiple task pada satu waktu, ataupun membiarkan pekerja mengambil tugas
baru sementara dia sedang melakukan task sebelumnya.

b) Algritme Penjadwalan Task Terdistribusi


Pada algoritme penjadwalan task terdistribusi, setiap prosesor mengatur task-nya masing-
masing. Sebuah mekanisme dibutuhkan untuk mendistribusikan task yang ada ke prosesor
yang tersedia. Prosesor dengan task yang terlalu banyak akan mengirimkan sebagian task-nya
ke prosesor yang lain. Tantangan bagi algoritma jenis ini adalah bagaimana menentukan
kondisi akhir dari proses kerja tersebut. Task yang belum selesai dikerjakan akan diestafetkan
dari satu prosesor ke prosesor lain dan sangatlah sulit bagi suatu proses untuk mengetahui
apakah mereka sudah selesai dikerjakan atau belum. Di lain sisi, algoritma penjadwalan task
tersentralisasi akan mengetahui dengan pasti kapan suatu proses telah selesai dikerjakan.

c) Algoritma Penjadwalan Task Kombinasi

Jumlah task statis Jumlah task dinamis

Mode Mode
Komunikasi Komunikasi
Terstruktur tak terstruktur

Waktu komputasi Waktu komputasi Komunikasi Banyak task


Konstan per berbeda untuk berkala antar jangka pendek.
Task tiap regian task Tak ada komuni
si antar task

Aglomerasi task Pemetaan task Menggunakan Menggunakan Menggu-


Untuk meminimalkan ke prosesor ber- algoritme static algoritma dynamic nakan algo
Komunikasi. Mem- siklus untuk me- load balancing load balancing ritme pen-

©Copyright 2008 | ANADRA 6


Bentuk satu task per nyeimbangkan jadwalan
Prosesor komputasi task
runtime

Figure 3.7 Suatu decision tree untuk memilih strategi pemetaan. Strategi terbaik tergantung
pada karakter task yang dihasilkan sebagai akibat dari proses partisi, komunikasi dan
aglomerasi yang dipilih sebelumnya.

Jenis algoritme penjadwalan yang lain adalah algoritme yang menggabungkan algoritme
terdistribusi dan tersentralisasi. Sebagai contoh hierarki dua level strategi manajer/pekerja
memiliki dua level manajer. Manajer level lebih tinggi akan menyupervisi manajer di bawahnya.
Secara berkala manajer mengkomunikasikan satu sama lain untuk menyeimbangkan jumlah task
yang belum dikerjakan oleh setiap manajer di bawahnya.
Figure 3.7 menerangkan betapa berbeda algoritme parallel dengan strategi pemetaan. Karena
starategi pemetaan tergantung kepada keputusan yang dibuat pada proses desain algoritme parallel
sebelumnya.

Beberapa kriteria yang digunakan untuk melihat apakah suatu pemetaan memiliki kualitas baik
atau tidak.
a) Desain dengan satu task per prosesor dan multi task per prosesor telah
dipertimbangkan dengan matang.
b) Alokasi task dinamis dan statis per prosesor telah dievaluasi.
c) Jika alokasi task dinamis telah dipilih, prosesor manajer bukan menjadi
sumber masalah bagi kinerja program.
d) Jika alokasi task statis yang dipilih, rasio task per prosesor minimal 10 : 1.

©Copyright 2008 | ANADRA 7


Mencari Nilai π dengan Metode Foster

Untuk mendapatkan nilai π bisa dilakukan dengan cara


menjumlahkan luas di bawah kurva. Daerah di bawah
kurva dibagi-bagi menjadi banyak bagian. Semakin
banyak bagian yang terbentuk maka makin baik hasilnya.
Untuk pengerjaan menggunakan komputer, pengerjaan
dengan sigle processor akan memakan waktu lama. Oleh
sebab itu sigle processor diganti dengan multiprocessor
yang artinya menggunakan pemrograman parallel.

a) Partisi
Hal yang dilakukan adalah membagi
wilayah di bawah kurva menjadi
bagian-bagian yang lebih kecil.
Setiap interval memiliki panjang
yang relative sama. Untuk kasus ini
area di bawah kurva dipartisi
menjadi 20 bagian. Maka panjang
setiap interval adalah :

Interval = 1-0 = 0.05


20

b) Komunikasi
Komunikasi lokal terjadi ketika mencari luasan masing-masing partisi, sementara
komunikasi global terjadi pada saat masing-masing prosesor mengirimkan hasil
perhitungannya yang akhirnya dijumlahkan untuk mendapatkan nilai π.

c) Aglomerasi

Pada proses aglomerasi ini,


diambil masing-masing 5 partisi.
Sehingga terbentuk 4 bagian
aglomerasi yang siap diproses
oleh prosesor master.

©Copyright 2008 | ANADRA 8


d) Pemetaan

Setiap prosesor menghitung nilai local


masing-masing. Selanjutnya setiap
prosesor akan mengirimkan hasil
perhitungannya ke prosesor master
untuk dihitung nilai akhirnya.

Kesimpulan

Nilai π bisa dihitung dengan menggunakan rumus:

Langkah yang dilakukan adalah dengan membagi daerah di bawah kurva. Semakin banyak bagian
yang diperoleh dari hasil pembagian tersebut maka hasil yang diperoleh akan semakin mendekati
nilai π yang sebenarnya.

Referensi

Quinn, Michael J. 2003. Parallel Programming in C with MPI and OpenMP. Singapore : Mc
Graw Hill.
Sasono, Norman. Jurnal : Parallel Implementation of Simpson’s Rule for Numerical Integration
to Approximate The Value of π.

©Copyright 2008 | ANADRA 9


Implementasi dalam MPI

#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#define interval 10000

float phi(float x)
{
x=x*x;
return 4/(1+x);
}

int _tmain(int argc, char* argv[])


{
int numProcs, myRank, root=0;
float totalLokal=0, totalGlobal=0;
float senderBuffer[interval], *recvBuffer;
int i, senderSize;
float a=0, p;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);

if(myRank==root)
{
p=(float)1/interval;
a=p;
for(i=0; i<interval; i++)
{
senderBuffer[i]=a;
//printf("%f\n", a);
a+=p;
}
}

MPI_Bcast(&p, 1, MPI_FLOAT, root, MPI_COMM_WORLD);

senderSize=interval/numProcs;
recvBuffer=(float *)malloc(senderSize * sizeof(float));
MPI_Scatter(senderBuffer, senderSize, MPI_FLOAT, recvBuffer, senderSize,
MPI_FLOAT, root, MPI_COMM_WORLD);

/*for(i=0; i<senderSize; i++)


printf("myRank = %d, interval gwa = %f, nilai p = %f\n", myRank,
recvBuffer[i], p);*/

for(i=0; i<senderSize; i++)


{
totalLokal+=p*phi(recvBuffer[i]);
}

©Copyright 2008 | ANADRA 10


MPI_Barrier(MPI_COMM_WORLD);

MPI_Reduce(&totalLokal, &totalGlobal, 1, MPI_FLOAT, MPI_SUM, root,


MPI_COMM_WORLD);

if(myRank==0)
printf("Nilai phi adalah %f", totalGlobal);

MPI_Finalize();

return 0;
}

©Copyright 2008 | ANADRA 11

Anda mungkin juga menyukai