Anda di halaman 1dari 6

Multithreading untuk Algoritma Divide and Conquer

Novan Parmonangan Simanjuntak(13509034)


Program Studi Teknik Informatika
Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung, Jl. Ganesha 10 Bandung 40132, Indonesia
impulse.impulse0@gmail.com; mathprince@ymail.com

Abstract—Biasanya algoritma divide and conquer masalah fibonacci sebagai dasar dari pemodelan
dilakukan dieksekusi dengan satu buah prosesor saja. multithread serta algoritma quicksort untuk
Setiap subrutin dieksekusi satu per satu, sehingga permasalahan divide and conquer.Akan diperlihatkan tes
kompleksitas waktu dihitung berdasarkan jumlah waktu
setiap subrutin. Pada makalah ini akan dibahas
untuk mengetahui kelebihan dan kekurangan dalam
penggunaan multithread untuk algoritma divide and menggunakan multithread untuk algoritma divide and
conquer. Dengan penggunaan multithread, maka setiap conquer.
subrutin dieksekusi secara konkurensi(bersamaan)
sehingga kompleksitas waktu totalnya bisa jauh berkurang. II. ALGORITMA MULTITHREAD
Pada makalah ini akan dibahas cara pemodelan untuk
multithread untuk algoritma divide and conquer. Selain itu A. Definisi
juga akan dibahas kelemahan dalam penggunaan Multithread artinya kemampuan CPU untuk
multithread ini serta parameter yang harus mngeksekusi satu atau lebih instruksi(penjumlahan,
dipertimbangkan dalam menentukan kompleksitas baik perkalian dan lainnya) pada waktu yang bersamaan.
ruang maupun waktu dari algoritma divide and conquer.
Pembaca makalah diharapkan pernah memahami hal-hal
Thread itu sendiri merupakan bagian terkecil yang bisa
mengenai konkurensi dan dasar-dasar dari sistem operasi dieksekusi oleh sistem operasi dan ini bisa dijalankan
dalam alokasi dan eksekusi program. Pada makalah ini secara konkurensi atau bersamaan dengan thread lain
juga akan dijelaskan sedikit mengenai alokasi resource dan yang sedang berjalan. Hal ini dimungkinkan karena
multithread itu sendiri. adanya proses multiprogramming(pergantian eksekusi)
oleh sistem operasi. Sistem operasi sekarang(berbasis
Kata kunci – Divide and Concquer, multithread, sistem linux dan NT atau windows sudah bisa melakukan
operasi, kompleksitas, performansi multiprogramming). Dengan adanya jumlah prosesor
lebih dari satu, multithread bisa dilakukan dengan lebih
efektif lagi(bisa saja satu thread memakai satu core untuk
I. PENDAHULUAN melakukan eksekusinya). Seperti yang sudah dijelaskan
Banyak algoritma yang diterapkan merupakan pada pendahuluan, komputer multiprosesor sudah
algoritma serial. Salah satunya adalah algoritma Divide banyak beredar di kalangan informatikawan,
and Concuqer. Algoritma serial artinya algoritma pengembang perangkat lunak bahkan di kalangan
tersebut dijalankan secara serial pada komputer masyarakat sendiri(mulai dari dua core sampai tujuh
uniprocesor(atau oleh satu prosesor), di mana pada core). Meskipun demikian, sampai sekarang tidak ada
algoritma serial hanya satu instruksi dieksekusi pada satupun model yang diterima secara luas. Alasan
suatu waktu. Di zaman yang modern ini, komputer utamanya adalah karena vendor tidak menyetujui pada
kebanyakan sudah multiprosesor(mulai dari dualcore, sebuah model untuk komputer pararel. Berikut dijelaskan
core to duo, core i3, core i5 dan corei7). Dengan adanya beberapa paradigman pemodelan multithread :
lebih dari satu prosesor, kita bisa memaksimumkan 1. Shared memory, artinya masing-masing prosesor
semua prosesor ini untuk memperbaiki performansi dari dapat secara langsung mengakses lokasi memory thread
algoritma yang ada. Oleh karena itulah penulis tertarik manapun.
untuk membahas mengenai penggunaan multithread 2, Distributed memory, di mana di pemodelan ini
terutama untuk algoritma divide and conquer. setiap prosesor memiliki memori sendiri yang bersifat
Algoritma yang akan dipilih di sini adalah algoritma privat(tidak bisa diakses oleh prosesor lain). Agar
divide and conquer. Karena kebanyakan masalah divide antarprosesor bisa saling mengakses memori, harus ada
and conquer secara natural paling mudah diselesaikan pesan yang secara eksplisit disampaikan antarprosesor.
dan dimodelkan dengan multithread programming. Hal
ini karena algoritma divide and conquer sendiri membagi Dengan adanya teknologi multicore di setiap laptop
masalah menjadi subrutin yang bisa dikerjakan secara ataupun komputer. Pemodelan shared memory lebih
konkuren atau bersamaan. Meskipun demikian akan banyak digunakan. Perlu diperhatikan bahwa digunakan
diberikan satu contoh yang bukan merupakan algoritma static thread untuk pemodelan ini, ini dikarenakan cost
divide and conquer untuk memudahkan pemodelan yang digunakan setiap kali menciptakan dan
multithread untuk algoritma divide and conquer. menghancurkan thread mahal, sehingga thread tersebut
Untuk contoh pemecahan masalah akan dibahas harus hidup selama program berjalan, sehingga disebut

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011


static thread. Meskipun dengan adanya shared memory algoritma tersebut hanya menggunakana satu core
yang bisa mengimplementasikan static thread, prosesor sehingga eksekusi haruslah sekuensial.
melakukan implementasi static thread sangat sulit dan
kemungkinan bug program besar. Oleh karena itulah Pemodelan dinamis multithreading untuk permasalah
diciptakan dan digunakan platform khusus untuk fibonacci adalah sebagai berikut :
pemrograman multithread, ini semacam interface dalam
menggunakan thread sehingga tidak perlu menggunakan Program fibonaccithreading(n)
komunikasi protokol yang kompleks serta memikirkan
hal-hal lain seperti pembagian kerja antarthread. Hal ini if (n≤1)
secara otomatis dilakukan oleh platform. Platform yang return n
konkurensi yang akan digunakan untuk pemodelan else
multithread ini adalah multithreading dinamis. x = spawn fibonaccithreading(n-1)
y = fibonaccithreading(n-2)
Multithreading dinamis adalah model yang akan sync
digunakan disini. Multithreading dinamis merupakan return x+y
model di mana programmer tidak harus khawatir
mengenai masalah komunikasi protokol, pmebagian Perhatikan bahwa pseudo-code diatas berbeda dengan
kerja thread dan hal-hal lainnya. Terdapat dua fitur dari program serial, yaitu :
multithreading dinamis, antara lain : 1. Keyword spawn menandakan bahwa saat pencarian
1. Nested parallelism, di mana setiap subrutin x digunakan sebuah thread static, sehingga nilai y
dieksekusi dengan thread baru, jadi fungsi yang langsung ikut dihitung, perhatikan bahwa terdapat dua
memanggil bisa mengerjakan hal lain selama subrutin ini thread, satu thread untuk menghitung nilai x dan thread
sedang dikerjakan. lain yang memanggil(bisa disebut thread utama yang
2. Parallel loop, di mana pada setiap loop iterasi dari merupakan thread awal saat program dijalankan).
loop bisa dilakukan secara konkuren atau bersamaan. Perhitungan nilai x dan y dilakukan secara bersamaan,
hal ini dimungkinkan karena perhitungan nilai x dan y
Pemodelan multuthreading dinamis mempunyai dua tidak berhubungan atau saling lepas, jadi thread untuk
keyword atau istilah yang digunakan untuk menghitung nilai x tidak berkaitan dengan thread untuk
mendeskripsikan multithreading dinamis, yaitu spawn, menghitung nilai y.
dan sync. Spawn digunakan untuk menyatakan 2. Keyword sync menandakan bahwa kedua thread
dipakainya thread baru untuk mengeksekusi instuksi, harus saling sinkronisasi atau telah selesai keduanya. Hal
sedangkan sync berfungsi untuk sinkronisasi ini dikarenakan nilai x dan y dibutuhkan untuk
antarthread(contohnya seperti thread saling menuggu menghitung nilai x+y. Oleh karena itu, nilai x dan y
agar thread lain selesai karena data dari thread tersebut harus diketahui keduanya.
dibutuhkan untuk proses selanjutnya). Jika keyword ini
dihapus, maka algoritma akan menjadi serial dan C. Penggunaan
berjalan seperti biasa.
Dinamis multithread sangat banyak diaplikasikan
B. Contoh terutama untuk sistem yang menginginkan performansi
yang bagus dengan mengerahkan seluruh resource yang
Contoh 1 : Algoritma rekursif perhitungan fibonacci. ada, contoh penggunaannya antara lain adalah di
Untuk contoh dasar akan digunakan problem fibonacci, bidang :
adapun algoritma yang digunakan adalah rekursif, 1. Basis data, di mana tranksaksi menyatakan thread
contoh ini ditujukan agar pembaca lebih memahami hal dan data menyatakan resource. Agar performansi bagus,
mengenai pemodelan dinamis multithreading. maka harus ada mekanisme pararel. Di sini salah satunya
digunakan pemodelan multithread.
Algoritma rekursif serial(tanpa multithreading) 2. Program-program kompleks seperti Word editor
dijelaskan dengan pseudo-code berikut ini : menggunakan mekanisme multithread. Thread baru
tersebut bisa berupa background thread atau thread yang
Program fibonacciserial(n) berjalan dibelakang menjalankan tugas semestinya.
Contohnya pada Word editor adalah adanya thread
if (n≤1) khusus untuk selalu mengupdate kata, sedangkan ada
return n thread lain untuk menerima input dari user.
else 3. Pada web-server, terdapat mekanisme thread disebut
x = fibonacciserial(n-1) threadworker.Threadworker bekerja sebagai thread yang
y = fibonacciserial(n-2) melayani satu permintaan, sedangkan terdapat thread
return x+y utama yang mengatur permintaan mana dijalankan oleh
thread mana.
Perhatikan pada pseudo-code di atas, hanya satu
prosesor saja digunakan, nilai y dihitung jika nilai x
sudah dihitung terlebih dahulu, ini dikarenakan

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011


III. ALGORITMA MULTITHREAD DIVIDE Sedangkan untuk komplesitas ruang dari algoritma
AND CONQUER divide and conquer dengan dinamis
multithread(asumsikan jumlah core prosesor mencukupi
A. Definisi semua thread static yang dibutuhkan) :
Skema umum dari algoritma divide and conquer bisa
ditulis sebagai berikut : 1. T(n) = O(1), n ≤ n0.
2. T(n) = max( Ti(n/k) ) + C(n)
1. Misalkan ukuran masalah sebesar n, maka jika jika dengan 1≤i≤r dan C(n) menyatakan kompleksitas
ukuran masalah n ≤ n0 , dimana n0 menyatakan waktu untuk partisi dan kombinasi solusi.
batasan masalah yang cukup kecil yang bisa
diselesaikan, maka masalah tersebut langsung Perhatikan bahwa T i(n/k) menyatakan kompleksitas
diselesaikan. dari subrutin ke-i, bisa dilihat pada point 2 bahwa ini
2. Jika n > n0 , maka bagi n menjadi r subrutin, tergantung dari subrutin dengan kompleksitas waktu
masing-masing berukuran n/k. Untuk setiap subrutin terbesar. Agar minimum, maka setiap subrutin harus
ini panggil lagi prosedur divide and conquer(ulangi dari dibagi secara rata, sehingga tidak ada subrutin yang
langkah satu). cepat selesai dibandingkan subrutin lain. Hal ini bisa
3. Dari r subrutin yang sudah diselesaikan, solusi dari dilakukan dengan membagi rata ukuran masalah untuk
masing-masing subrutin dikombinasikan menjadi solusi setiap subrutin. Untuk mempermudah kita asumsikan
dari masalah semula. waktu untuk setiap subrutin sama, sehingga bisa ditulis :

B. Aplikasi dinamis multithread untuk algoritma T(n) = T(n/k) + C(n).


divide and conquer
Perhatikan bahwa komplesitas waktu algoritma divide
Perhatikan pada psudo-code algoritma divide and and conquer berkurang jauh. Untuk lebih memperjelas,
conquer di atas, dengan mengapliklasikan dinamis akan dijelaskan dengan contoh yaitu algoritma quicksort.
multithread skemanya bisa diubah menjadi :
Contoh 2 : Algoritma quicksort untuk masalah
pengurutan bilangan.
1. Misalkan ukuran masalah sebesar n, maka jika jika Akan dihitung kompleksitas waktu dari algoritma
ukuran masalah n ≤ n0 , dimana n0 menyatakan quicksort(asumsi bahwa pivot yang terpilih selalu
batasan masalah yang cukup kecil yang bisa membagi total elemen menjadi dua bagian sama besar).
diselesaikan, maka masalah tersebut langsung
diselesaikan. Kompleksitas waktu algoritma quicksort tanpa
2. Jika n > n0 , maka bagi n menjadi r subrutin, multithread :
masing-masing berukuran n/k. Untuk setiap subrutin
panggil spawn (jika masih ada core prosesor 1. T(n) = O(1), n ≤ 1.
idle),untuk menggunakan thread static untuk 2. T(n) = 2T(n/2) + O(n).
memanggil kembali prosedur divide and conquer.
Dengan demikian semua subrutin bisa berjalan Dengan master method didapat
bersamaan. Untuk minimasi core,subrutin terakhir bisa T(n) = O(n lg n).
menggunakan thread pemanggil.
3. Lakukan sync atau sinkronisasi dari r subrutin yang Sedangkan kompleksitas waktu algoritma quicksort
sudah diselesaikan, ini karena solusi dari masing- dengan multithread adalah :
masing subrutin akan dikombinasikan menjadi solusi
dari masalah semula. 1. T(n) = O(1), n ≤ 1.
2. T(n) = T(n/2) + O(n).

IV. METODE LOGIKA Dengan master method didapat


Di sini akan dijelaskan metode perkiraan dari T(n) = O(n)
kompleksitas algoritma divide and conquer dengan dan
tanpa dinamis multithread. Perhatikan bahwa untuk sorting kompleksitas yang
Tanpa dinamis multithread kompleksitas waktu dibutuhkan menjadi liner(lebih baik dari sebelumnya).
algoritama divide and conquer bisa dinyatakan sebagai
berikut : V. IMPLEMENTASI
Sebelumnya telah dijelaskan mengenai contoh dinamis
1. T(n) = O(1), n ≤ n0. multithread yaitu algoritma rekursif fibonacci dan
2. T(n) = r * T(n/k) + C(n) algoritma divide and conquer. Meskipun kompleksitas
di mana C(n) merupakan komplesitas waktu untuk ruang dari dinamis multihtread lebih kecil, tetapi hal
partisi dan kombinasi solusi. tersebut belum menjamin waktu nyata eksekusi program

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011


lebih cepat ini dikarenakan beberapa hal, salah satunya Untuk Pseudo-code pengujian dinamis thread
adalah mahalnya cost untuk alokasi thread itu sendiri algoritma rekursif fibonacci dengan menggunakan lima
dan saat komunikasi serta protokol lainnya. Berikut akan thread dengan memanggil fungsi fibonacci serial pada
diberikan contoh implementasi untuk analisis dari Bagian II. Pseudo-code di bawah ini ditulis dalam
penerapa dinamis multithread : bahasa Java :

Pseudo-code untuk algoritma quicksort dengan


dinamis multithread : Program testing5threadfib(int n)
//Kasus untuk menghitung waktu tanpa thread
Program quicksortthread(A[p..r]) start = time();
if (p<r)
for i = 1 to 5 do
q = Partition(A,p,r)
spawn quicksortthread(A[p..q-1]) val = fibonacciserial(45);
quicksortthread(A[q+1..r])
sync end = time();
output(end-start)
Untuk algoritma Partition sama seperti algoritma
Partition pada quicksort tanpa dinamis multithread. //Kasus untuk menghitung waktu dengan thread
Berikut diberikan algoritma untuk partisi : start = time();
for i = 1 to 5 do
val = spawn fibonacciserial(45);
Function Partition(A[p..r])
for all thread running except mainthread
x = A[r] sync
I = p-1 end = time();
for j=p to r-1 output(end-start)
do if (A[j] ≤ x)
then i = i + 1
swap( A[i], A[j] )
swap(A[i+1 , A[r]) V. PENGUJIAN DAN ANALISIS
return i+1
Pengujian dilakukan di komputer penulis, di mana
mesin komputernya mempunyai tujuh core prosesor.
Untuk perbandingan dan analisis performansi dinamis Implementasi code ditulis dalam bahasa Java dan C.
multithread diberikan dua buah pseudo-code untuk Berikut lingkungan pengujian dari implementasi dinamis
fibonacci(psudo-code pertama ditulis dalam bahasa C, multithread pada algoritma divide and conquer
sedangkan pseudo-code kedua ditulis dalam bahasa Java)
: Parameter Nilai

Pseudo-code pengujian dinamis thread algoritma Sistem operasi Linux 32bit 11.10
rekursif fibonacci dengan menggunakan dua thread OneiricOcelot
dengan memanggil fungsi fibonacci serial pada Bagian II JDK Version 1.6
. Pseudo-code di bawah ini ditulis dalam bahasa C :
CPU Core i7 1.79GHz
Memori 4GB, 7Mb 3 level cache
Program testing2threadfib(int n)
search = n

//Kasus untuk menghitung waktu tanpa thread


start = time();
x = spawn fibonacciserial(n-1)
y = fibonacciserial(n-2)
end = time();
output(end-start)

//Kasus untuk menghitung waktu dengan thread


z = fibonacciserial(n)
output(end-start)

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011


Tabel 1. Lingkungan pengujian dinamis multithread Percobaan 2 : quicksort dengan n besar

Berikut dilakukan dua jenis percobaan : Gambar 2. Pengujian quicksort dengan ukuran n besar

1. Untuk percobaan quicksort dengan dinamis thread, Analisis percobaan 1 dan 2 :


dilakukan perbandingan dengan algoritma sort dari java Bisa diperhatikan dari kedua pengujian di atas didapat
library. Berikut hasil percobaan yang dilakukan bahwa dinamis multithread lebih efektif saat nilai n
besar.Ini dimungkinkan karena waktu cost yang
Percobaan 1 : quicksortthread dengan n kecil dihabiskan oleh thread masih lebih besar dibandingkan
dengan waktu lainnya, sehingga algoritma tanpa dinamis
multithread lebih cepat.

2. Untuk percobaan dinamis multithread dengan


menggunakan algoritma rekursif fibonacci dilakukan
perbandingan dengan menggunakan dua thread dan lima
thread(sesuai dengan implementasi)

Percobaan 3 : fibonacci rekursif dengan dua thread

Gambar 1. Pengujian quicksort dengan ukuran n kecil Gambar 3. Percobaan dinamis multithread untuk
algoritma rekursif fibonacci dengan dua thread

Percobaan 4 : fibonacci rekursif dengan dua thread

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011


REFERENCES
[1] Cormen. H. THOMAS, “Introduction to Algorithm” , 3ed, Ed. New
York: McGraw-Hill, 1964, pp. 772–780.
[2] http://sahits.ch/blog/?p=601#third
[3] http://www.planet-source-code.com/vb/scripts/ShowCode.asp?
txtCodeId=6908&lngWId=2
[4] http://lycog.com/concurency/performance-single-multi-thread-java/

PERNYATAAN
Dengan ini saya menyatakan bahwa makalah yang saya
tulis ini adalah tulisan saya sendiri, bukan saduran, atau
terjemahan dari makalah orang lain, dan bukan plagiasi.

Bandung, 8 Desember 2011

Gambar 4. Percobaan dinamis multithread untuk


algoritma rekursif fibonacci dengan lima thread

Analisis percobaan 3 dan 4 :


Bisa diperhatikan dari percobaa 3 dan 4, dimana jumlah
thread yang banyak akan semakin bagus dalam
menyelesaikan suatu permasalahan. Hal ini wajar, karena
dengan rekursif saat fibonacci memerlukan waktu yang
lama, sehingga semakin banyak thread maka
performansi dari algoritma bisa semakin baik(asumsikan
Novan Parmonangan Simanjuntak
core prosesor mencukupi).
13509034

VII. KESIMPULAN
Dari pembahasan bab-bab sebelumnya penulis membuat
beberapa kesimpulan sebagai berikut :

1. Jumlah core prosesor mempengaruhi kecepatan


program. Untuk uniprosesor(hanya satu core prosesor
saja), implementasi multithread pada malah akan
memperburuk performansi algoritma.
2. Penciptaan thread dan pemanggilannya mahal,
sehingga perlu dipertimbangkan mengenai ukuran data
dan banyak thread yang diperlukan sehingga bisa
mencapai performansi yang optimal
3. Penggunaan dinamis multithread memang bagus,
tetapi setiap thread mempunyai resource-nya sendiri,
sehingga akan memakan ruang lebih banyak daripada
tanpa dinamis multithread(kompleksitas ruang
bertambah).
4. Implementasi thread bisa lebih bagus untuk ukuran n
yang lebih besar.
5. Algoritma divide and conquer secara natural(dengan
mudah) bisa dibuat model dinamis multithreadnya.
6. Algoritma divide and conquer secara tidak langsung
telah mengurangi space function(stack untuk function
dan lainnya), karena untuk setiap subrutin masalah,
fungsi yang dipanggil sama.

Makalah IF3051 Strategi Algoritma – Sem. I Tahun 2010/2011

Anda mungkin juga menyukai