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
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