startegi partisi divide conquer

11. STRATEGI PARTISI DAN DIVIDE & CONQUER
11.1 Partisi
Strategi
Divide & Conquer
Divide & Conquer M-ary

11.2 Contoh Divide & Conquer
Sortir dengan Bucket Sort
Referensi : Wilkinson, Barry & Allen, M, “Parallel Programming”,
Prentice Hall, New Jersey, 1999; Chapter 4; hal. 107 - 122
Pengolahan Paralel/KK021239

11/1/26

11.1.1 Strategi Partisi
Contoh - Menambah Sederetan Angka
Deretan dipartisi ke dalam m bagian dan ditambahkan secara
bebas untuk membuat penjumlahan parsial

Gambar 4.1 Deretan dipartisi menjadi m bagian dan ditambahkan.
Pengolahan Paralel/KK021239


11/2/26

Menggunakan send( ) s dan recv( ) s
Master
s = n/m;
/* number of numbers for slaves*/
for (i = 0, x = 0; i < m; i++, x = x + s)
send(&numbers[x], s, Pi);
/* send s numbers to slave */
sum = 0;
for (i = 0; i < m; i++) {
recv(&part_sum, PANY);
sum = sum + part_sum;
}
Slave
recv(numbers, s, Pmaster);

/* wait for results from slaves */
/* accumulate partial sums */


/* receive s numbers from master */

part_sum = 0;
for (i = 0; i < s; i++)
/* add numbers */
part_sum = part_sum + numbers[i];
send(&part_sum, Pmaster);
/* send sum to master */
Pengolahan Paralel/KK021239

11/3/26

Menggunakan rutin Broadcast/ Multicast
Master
s = n/m;
bcast(numbers, s, Pslave_group);
sum = 0;
for (i = 0; i < m; i++){
recv(&part_sum, PANY);

sum = sum + part_sum;
}
Slave
bcast(numbers, s, Pmaster);

/* number of numbers for slaves */
/* send all numbers to slaves */
/* wait for results from slaves */
/* accumulate partial sums */

/* receive all numbers from master*/

start = slave_number * s;
/* slave number obtained earlier */
end = start + s;
part_sum = 0;
for (i = start; i < end; i++)
/* add numbers */
part_sum = part_sum + numbers[i];
send(&part_sum, Pmaster);

/* send sum to master */
Pengolahan Paralel/KK021239

11/4/26

Menggunakan rutin Scatter dan Reduce
Master
s = n/m;
/* number of numbers */
scatter(numbers,&s,Pgroup,root=master);
/* send numbers to slaves */
reduce_add(&sum,&s,Pgroup,root=master);
/* results from slaves */
Slave
scatter(numbers,&s,Pgroup,root=master);
/* receive s numbers */
.
/* add numbers */
reduce_add(&part_sum,&s,Pgroup,root=master);
/* send sum to master */

Pengolahan Paralel/KK021239

11/5/26

Analisis
Komputasi sekuensial membutuhkan n-1 penambahan dengan
kompleksitas waktu O(n)
Paralel : Dengan rutin send dan receive
Fase 1 - Komunikasi
tcomm1 = m(tstartup + (n/m)tdata)
Fase 2 - Komputasi
tcomp1 = n/m - 1
Fase 3 - Komunikasi : mengembalikan hasil parsial dengan rutin
send/ recv
tcomm2 = m(tstartup + tdata)
Fase 4 - Komputasi : Akumulasi akhir
tcomp2 = m - 1
Jadi

tp = (tcomm1 + tcomm2) + (tcomp1 + tcomp2)

= 2mtstartup + (n + m)tdata + m + n/m -2 = O(n + m)
Waktu kompleksitas paralel lebih buruk dari sekuensial

Pengolahan Paralel/KK021239

11/6/26

11.1.2 Divide & Conquer
Karakteristiknya adalah membagi masalah ke dalam sub-sub
masalah yang sama bentuknya dengan masalah yang lebih besar.
Pembagian selanjutnya ke dalam sub problem yang lebih kecil
biasanya dilakukan melalui rekursi.
Definisi rekursi sekuensial untuk menambah sederetan angka :
int add(int *s)
/* add list of numbers, s */
{
if (number(s) =< 2) return (n1 + n2);
/* see explanation */
else {
Divide (s, s1, s2);

/* divide s into two parts, s1 and s2 */
part_sum1 = add(s1);
/*recursive calls to add sub lists */
part_sum2 = add(s2);
return (part_sum1 + part_sum2);
}
}
Pengolahan Paralel/KK021239

11/7/26

Masalah Awal

Pembagian
masalah

Hasil akhir
Gambar 4.2 Konstruksi Pohon.
Pengolahan Paralel/KK021239


11/8/26

Implementasi Paralel
Deretan awal

Gambar 4.3 Membagi deretan ke dalam beberapa bagian.
Pengolahan Paralel/KK021239

11/9/26

Jumlah Akhir

Gambar 4.3 Penjumlahan Parsial.
Pengolahan Paralel/KK021239

11/10/26

Kode Paralel
Misal dibuat ada 8 prosesor untuk menambah
sederetan angka.

Proses P0
divide(s1, s1, s2);
send(s2, P4);

/* division phase */
/* divide s1 into two, s1 and s2 */
/* send one part to another process */

divide(s1, s1, s2);
send(s2, P2);
divide(s1, s1, s2);
send(s2, P1};
part_sum = *s1;
recv(&part_sum1, P1);

/* combining phase */

part_sum = part_sum + part_sum1;
recv(&part_sum1, P2);
part_sum = part_sum + part_sum1;

recv(&part_sum1, P4);
part_sum = part_sum + part_sum1;

Pengolahan Paralel/KK021239

11/11/26

Kode untuk proses P4
Proses P4
recv(s1, P0);

/* division phase */

divide(s1, s1, s2);
send(s2, P6);
divide(s1, s1, s2);
send(s2, P5);
part_sum = *s1;
recv(&part_sum1, P5);


/* combining phase */

part_sum = part_sum + part_sum1;
recv(&part_sum1, P6);
part_sum = part_sum + part_sum1;
send(&part_sum, P0);

Kode yang serupa digunakan untuk proses-proses lainnya.
Pengolahan Paralel/KK021239

11/12/26

Analisis
Diasumsikan n adalah pangkat dari 2. Waktu set up komunikasi,
tstartup tidak diperhitungkan.
Komunikasi
Fase Pembagian

Fase Penggabungan
Total waktu komunikasi

Komputasi
Total waktu eksekusi paralel
Pengolahan Paralel/KK021239

11/13/26

Gambar 4.5 Bagian dari pohon pencarian
Pengolahan Paralel/KK021239

11/14/26

11.1.3 Divide & Conquer M-ary
Tugas (task) dibagi ke dalam lebih dari 2 bagian setiap tahapannya.
Contoh : Tugas dibagi menjadi 4 bagian. Definisi rekursif
sekuensialnya :
int add(int *s)
/* add list of numbers, s */
{
if (number(s) =< 4) return(n1 + n2 + n3 + n4);
else {
Divide (s,s1,s2,s3,s4);
/* divide s into s1,s2,s3,s4*/
part_sum1 = add(s1);
/*recursive calls to add sublists */
part_sum2 = add(s2);
part_sum3 = add(s3);
part_sum4 = add(s4);
return (part_sum1 + part_sum2 + part_sum3 + part_sum4);
}
}
Pengolahan Paralel/KK021239

11/15/26

Gambar 4.6 Pohon kuarternair (quadtree)
Pengolahan Paralel/KK021239

11/16/26

Daerah citra

Pembagian pertama
ke dalam 4 bagian
Pembagian
kedua

Gambar 4.7 Membagi sebuah citra
Pengolahan Paralel/KK021239

11/17/26

11.2 Contoh Divide & Conquer





Sortir dengan Bucket Sort
Sederetan angka dibagi ke dalam m area yang sama,
0 .. a/m - 1, a/m .. 2a/m - 1, 2a/m .. 3a/m - 1, …
Sebuah “bucket” ditugaskan untuk menampung angka
dalam setiap area
Angka-angka tersebut dimasukkan ke bucket yang
sesuai
Angka-angka
tersebut
akan
disortir
dengan
menggunakan algoritma sortir sekuensial setiap bucket.
Sortir ini akan baik jika angka-angka awalnya
didistribusikan ke interval yang sudah diketahui,
misalnya 0 .. a - 1.

Pengolahan Paralel/KK021239

11/18/26

Angka yang belum disortir

Bucket

Merge List
Angka yang disortir
Gambar 4.8 Bucket sort
Pengolahan Paralel/KK021239

11/19/26

Waktu Sekuensial

Algoritma Paralel

Bucket sort dapat diparalelkan dengan menugaskan
satu prosesor untuk setiap bucket - mengurangi suku ke
dua (second term) dari persamaan sebelumnya menjadi
(n/p)log(n/p) untuk p prosesor (dimana p = m).

Pengolahan Paralel/KK021239

11/20/26

Angka yang belum disortir

p prosesor

Bucket
Merge List
Angka yang disortir
Gambar 4.9 Satu versi Paralel dari Bucket sort
Pengolahan Paralel/KK021239

11/21/26

Paralelisasi Selanjutnya
• Membagi deretan ke dalam m area, satu area untuk
setiap prosesor
• Setiap prosesor mengatur p “bucket” yang kecil dan
memisahkan angka-angka dalam areanya ke dalam
bucket-bucket tersebut
• Bucket-bucket kecil ini kemudian dikosongkan ke
dalam p bucket akhir untuk sortir, yang membutuhkan
masing-masing prosesornya untuk mengirimkan satu
bucket kecil ke masing-masing prosesor yang lain
(bucket i ke prosesor i).
Pengolahan Paralel/KK021239

11/22/26

n/m angka

Angka yang belum disortir

p prosesor
Bucket
kecil

Bucket kecil dikosongkan

Bucket
besar

Merge List
Angka yang disortir
Gambar 4.10 Versi Paralel dari Bucket sort
Pengolahan Paralel/KK021239

11/23/26

Analisis
Fase 1 - Komputasi dan komunikasi (membagi angka)

tcomp1 = n ; tcomm1 = tstartup + tdatan
Fase 2 - Komputasi (sortir ke bucket kecil)

tcomp2 = n/p
Fase 3 - Komunikasi (kirim ke bucket besar)
Jika seluruh komunikasi tumpang tindih :

tcomm3 = (p - 1)(tstartup + (n/p2)tdata)
Fase 4 - Komputasi (sortir bucket besar)

tcomp4 = (n/p)log(n/p)
Jadi

tp = tstartup + tdatan + n/p + (p - 1)(tstartup + (n/p2)tdata) +
(n/p)log(n/p)

Diasumsikan angka-angka tersebut didistribusikan untuk mencapai
formula ini. Skenario kasus terburuk (worse-case) terjadi ketika semua
angka berada dalam satu bucket !
Pengolahan Paralel/KK021239

11/24/26

Rutin “all-to-all”
Dapat digunakan untuk fase 3 - mengirimkan data dari setiap
proses ke setiap proses yang lain

Gambar 4.11 Broadcast “all-to-all”
Pengolahan Paralel/KK021239

11/25/26

Rutin “all-to-all” sebenarnya mengubah baris
sebuah array menjadi kolom

Gambar 4.12 Efek “all-to-all” dari sebuah array
Pengolahan Paralel/KK021239

11/26/26