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)
Pemetaan Aglomerasi
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
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
Menampilkan
gambar
2. Komunikasi (Communication)
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)
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.
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
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
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.
Mode Mode
Komunikasi Komunikasi
Terstruktur tak terstruktur
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.
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 :
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
Kesimpulan
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 π.
#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#define interval 10000
float phi(float x)
{
x=x*x;
return 4/(1+x);
}
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;
}
}
senderSize=interval/numProcs;
recvBuffer=(float *)malloc(senderSize * sizeof(float));
MPI_Scatter(senderBuffer, senderSize, MPI_FLOAT, recvBuffer, senderSize,
MPI_FLOAT, root, MPI_COMM_WORLD);
if(myRank==0)
printf("Nilai phi adalah %f", totalGlobal);
MPI_Finalize();
return 0;
}