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 Pengolahan Paralel/KK /1/26
Strategi Partisi 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/KK Contoh - Menambah Sederetan Angka Pengolahan Paralel/KK /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, P i ); /* send s numbers to slave */ sum = 0; for (i = 0; i < m; i++) { /* wait for results from slaves */ recv(&part_sum, P ANY ); sum = sum + part_sum; /* accumulate partial sums */ } Slave recv(numbers, s, P master ); /* 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, P master ); /* send sum to master */ Pengolahan Paralel/KK /3/26
Menggunakan rutin Broadcast/ Multicast Master s = n/m; /* number of numbers for slaves */ bcast(numbers, s, P slave_group) ; /* send all numbers to slaves */ sum = 0; for (i = 0; i < m; i++){ /* wait for results from slaves */ recv(&part_sum, P ANY ); sum = sum + part_sum; /* accumulate partial sums */ } Slave bcast(numbers, s, P master ); /* 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, P master ); /* send sum to master */ Pengolahan Paralel/KK /4/26
Menggunakan rutin Scatter dan Reduce Master s = n/m; /* number of numbers */ scatter(numbers,&s,P group,root=master); /* send numbers to slaves */ reduce_add(&sum,&s,P group,root=master); /* results from slaves */ Slave scatter(numbers,&s,P group,root=master); /* receive s numbers */. /* add numbers */ reduce_add(&part_sum,&s,P group,root=master); /* send sum to master */ Pengolahan Paralel/KK /5/26
Analisis Komputasi sekuensial membutuhkan n-1 penambahan dengan kompleksitas waktu O(n) Paralel : Dengan rutin send dan receive Fase 1 - Komunikasi t comm1 = m(t startup + (n/m)t data ) Fase 2 - Komputasi t comp1 = n/m - 1 Fase 3 - Komunikasi : mengembalikan hasil parsial dengan rutin send/ recv t comm2 = m(t startup + t data ) Fase 4 - Komputasi : Akumulasi akhir t comp2 = m - 1 Jadi t p = (t comm1 + t comm2 ) + (t comp1 + t comp2 ) = 2mt startup + (n + m)t data + m + n/m -2 = O(n + m) Waktu kompleksitas paralel lebih buruk dari sekuensial Pengolahan Paralel/KK /6/26
Divide & Conquer 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/KK 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 : Pengolahan Paralel/KK /7/26
Pengolahan Paralel/KK Hasil akhir Masalah Awal Pembagian masalah Gambar 4.2 Konstruksi Pohon. Pengolahan Paralel/KK /8/26
Pengolahan Paralel/KK Implementasi Paralel Gambar 4.3 Membagi deretan ke dalam beberapa bagian. Deretan awal Pengolahan Paralel/KK /9/26
Pengolahan Paralel/KK Gambar 4.3 Penjumlahan Parsial. Jumlah Akhir Pengolahan Paralel/KK /10/26
Kode Paralel /* division phase */ divide(s1, s1, s2); /* divide s1 into two, s1 and s2 */ send(s2, P 4 ); /* send one part to another process */ divide(s1, s1, s2); send(s2, P 2 ); divide(s1, s1, s2); send(s2, P 1 }; part_sum = *s1; /* combining phase */ recv(&part_sum1, P 1 ); part_sum = part_sum + part_sum1; recv(&part_sum1, P 2 ); part_sum = part_sum + part_sum1; recv(&part_sum1, P 4 ); part_sum = part_sum + part_sum1; Pengolahan Paralel/KK Misal dibuat ada 8 prosesor untuk menambah sederetan angka. Proses P 0 Pengolahan Paralel/KK /11/26
Kode yang serupa digunakan untuk proses-proses lainnya. recv(s1, P 0 ); /* division phase */ divide(s1, s1, s2); send(s2, P 6 ); divide(s1, s1, s2); send(s2, P 5 ); part_sum = *s1; /* combining phase */ recv(&part_sum1, P 5 ); part_sum = part_sum + part_sum1; recv(&part_sum1, P 6 ); part_sum = part_sum + part_sum1; send(&part_sum, P 0 ); Pengolahan Paralel/KK Kode untuk proses P 4 Proses P 4 Pengolahan Paralel/KK /12/26
Analisis Diasumsikan n adalah pangkat dari 2. Waktu set up komunikasi, t startup tidak diperhitungkan. Komunikasi Fase Pembagian Fase Penggabungan Total waktu komunikasi Komputasi Total waktu eksekusi paralel Pengolahan Paralel/KK /13/26
Gambar 4.5 Bagian dari pohon pencarian Pengolahan Paralel/KK /14/26
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/KK /15/26
Gambar 4.6 Pohon kuarternair (quadtree) Pengolahan Paralel/KK /16/26
Gambar 4.7 Membagi sebuah citra Pengolahan Paralel/KK Daerah citra Pembagian pertama ke dalam 4 bagian Pembagian kedua Pengolahan Paralel/KK /17/26
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/KK Contoh Divide & Conquer Pengolahan Paralel/KK /18/26
Pengolahan Paralel/KK Angka yang disortir Angka yang belum disortir Bucket Gambar 4.8 Bucket sort Merge List Pengolahan Paralel/KK /19/26
Waktu Sekuensial Pengolahan Paralel/KK 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/KK /20/26
Pengolahan Paralel/KK Angka yang disortir Angka yang belum disortir Bucket Gambar 4.9 Satu versi Paralel dari Bucket sort Merge List p prosesor Pengolahan Paralel/KK /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/KK /22/26
Pengolahan Paralel/KK Angka yang disortir Angka yang belum disortir Bucket besar Gambar 4.10 Versi Paralel dari Bucket sort Merge List p prosesor Bucket kecil Bucket kecil dikosongkan n/m angka Pengolahan Paralel/KK /23/26
Analisis Fase 1 - Komputasi dan komunikasi (membagi angka) t comp1 = n ; t comm1 = t startup + t data n Fase 2 - Komputasi (sortir ke bucket kecil) t comp2 = n/p Fase 3 - Komunikasi (kirim ke bucket besar) Jika seluruh komunikasi tumpang tindih : t comm3 = (p - 1)(t startup + (n/p 2 )t data ) Fase 4 - Komputasi (sortir bucket besar) t comp4 = (n/p)log(n/p) Jadi t p = t startup + t data n + n/p + (p - 1)(t startup + (n/p 2 )t data ) +(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/KK /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/KK /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/KK /26/26