• Tidak ada hasil yang ditemukan

Seleksi Fitur

Tujuan dari seleksi fitur adalah untuk memilih subset fitur-fitur yang relevan untuk membangun model prediksi efektif. Menurut Hall (2000) seleksi subset fitur adalah proses mengidentifikasikan dan membuang sebanyak mungkin informasi yang redundan dan tidak relevan. Menurut Djatna dan Morimoto (2008a, 2008b) di dunia nyata di antara fitur terdapat korelasi. Djatna dan Morimoto (2008a, 2008b) mengajukan algoritme yang menyeleksi pasangan fitur dengan interkorelasi tinggi dan juga mempunyai korelasi tinggi dengan kelas target.

Algoritme seleksi fitur dengan pasangan fitur berkorelasi tinggi (Djatna dan Morimoto 2008a, 2008b):

1) Jika basis data terdiri atas sekelompok fitur berjumlah fn maka dapat direpresentasikan

database=

{

f1,..., ffn

}

(5) Maka dibuatkan kombinasi pasangan fitur tanpa perulangan sebanyak :

! 2!( 2) !

fn

fn (6)

2) Sebuah bidang dua dimensi yang disebut multidimensional equi-depth histogram di bentuk dari tiap pasangan fitur seperti dalam Gambar 7. Histogram tersebut terdiri atas perpotongan baris dan kolom yang disebut bucket. Maksud dari equi depth histogram adalah tiap bucket terdiri atas sejumlah record dengan total record yang sama. Lingkaran berwarna pada Gambar 7 menunjukkan record yang kelas target bernilai positif. Lingkaran tanpa warna menunjukkan record dengan kelas target negatif. Semua record dari pasangan fitur dibagi ke dalam tiap bucket dan proses ini disebut diskritasi. Tiap bucket dihitung jumlah record kelas target positif dan jumlah record kelas target negatif seperti pada Gambar 8. P adalah jumlah record kelas target positif dan N adalah jumlah record kelas target negative. P dan N disimpan dalam bentuk array dua kolom. Indeks array dimulai dari nol. Contoh P[0,1] bermakna jumlah record kelas target positif baris pertama kolom kedua.

12

Gambar 7 Diskritasi dengan multidimensional equi-depth histogram

Gambar 8 Multidimensional equi-depth histogram yang tiap bucket dihitung jumlah record kelas target positif dan jumlah record target negatif

3) Djatna dan Morimoto (2008a, 2008b) menggunakan komputasi geometri untuk mencari pasangan fitur yang interkorelasinya tinggi. Mereka percaya jika dibentuk suatu area poligon yang disebut x-monotone maka pasangan fitur tersebut mempunyai interkorelasi yang tinggi. Area poligon x-monotone adalah area poligon yang tidak terpotong dengan garis vertikal. Contoh area poligon x-monotone dan bukan x-monotone dapat dilihat pada Gambar 9. Setiap pasangan fitur menghasilkan satu area poligon x-monotone.

(a) (b)

13

Berikut ini dijelaskan secara ringkas logika algoritme x-monotone : i. Kalkulasi inner product (Θ) untuk tiap bucket di histogram.

FOR i = 1 to banyak_baris FOR j = 1 to banyak_kolom , , . . x Pi j y Pi j θ θ Θ = + END FOR END FOR

Gambar 10 Kalkulasi inner product untuk semua kolom x

θ

: stamp point x y θ : stamp point y , i j

P : jumlah record kelas target positif baris i kolom j

,

i j

N : jumlah record kelas target negatif baris i kolom j ii. Komputasi botsum untuk semua kolom.

FOR m = 1 TO banyak_kolom botsum(1) = 0 FOR S = 2 to N botsum(s) = botsum(s-1)+Gs-1,m END FOR END FOR

Gambar 11 Komputasi botsum untuk semua kolom N : jumlah baris multidimensional equi-depth histogram m : indeks kolom

1,

s m

G : total inner product di kolom m dari baris pertama sampai baris s-1

iii. Komputasi bot untuk semua kolom.

FOR m = 1 TO banyak_kolom botm(1) = 1FOR s = 2 TO N IF (botsum(S) < botsum(botm(s-1))) botm(s) = s ELSE botm(s) = botm(s-1) END IF dBottomArr((s*dCelSize)+m) = botm(s) END FOR END FOR

Gambar 12 Komputasi bot untuk semua kolom iv. Komputasi topsum untuk semua kolom.

FOR m = 1 TO banyak_kolom topsum(N) = 0 FOR S = N-1 to 1 topsum(s) = topsum(s+1)+Gs+1,m END FOR END FOR

14

v. Komputasi top untuk semua kolom.

FOR m = 1 TO banyak_kolom topm(N) = N FOR s = N-1 TO 1 IF (topsum(S) < topsum(topm(s+1))) topm(s) = s ELSE topm(s) = topm(s+1) END IF dTopArr((s*dCelSize)+m) = topm(s) END FOR END FOR

Gambar 14 Komputasi top untuk semua kolom

vi. Kalkulasi x-monotone secara rekursif mencari area x-monotone perkolom secara rekursif.

F1 = max(cover1(i,j)) FOR k = 2 TO m

{

1

}

1

( ) max max(0, ( )) cov ( , )

k k k j N F i F j er i j ≤ ≤ = + END FOR

Gambar 15 Kalkulasi x-monotone

vii. Kalkulasi convex hull untuk mencari x-monotone dengan entropi terkecil.

Θ = {{-1,1}, (1,-1), (-1,-1), (1,1)}

Ebest = 0.0

ChooseStampPoint = {0,0}

FOR each stamp point in Θ

Calculate Entropy

IF Entropy < Ebest THEN Ebest = Entropy

ChooseStampPoint = stamp point Bottom = dBottomArr

Top = dTopArr END

END FOR

Calculate MidPoint from ChooseStampPoint Calculate Entropy from MidPoint

IF Entropy < Ebest THEN Ebest = Entropy.

ChooseStampPoint = MidPoint END

WHILE(Entropy < Ebest)

Calculate MidPoint from ChooseStampPoint Calculate Entropy from MidPoint

IF Entropy > Ebest THEN Ebest = Entropy

ChooseStampPoint = MidPoint END

END WHILE

15

Setiap area x-monotone di muldimensional equi-depth histogram dapat direpresentasikan dengan dua vektor, yaitu vektor τ(R) = {t0, t1,…, tm-1} dan β(R) = {b0, b1,…,bm-1}. τ(R) adalah urutan bagian atas indeks Y dan β(R) adalah urutan bagian bawah indeks Y. Nilai m menunjukkan banyak kolom pada multidimensional equi-depth histogram. Pada Gambar 17 nilai m adalah jumlah kolom yaitu 13 terhitung dari kiri ke kanan. Tiap area x-monotone dievaluasi dengan fungsi flatness seperti dijelaskan pada rumus 7. Dimana µ adalah rata-rata dari vektor τ(R) dan vektor β(R). Fungsi flatness menunjukkan bagaimana sekuen dari tiap vektor terpisah dari nilai rata-rata. Semakin besar nilai fungsi flatness maka semakin penting pula pasangan fitur tersebut. Seperti pada contoh Gambar 17 (a) nilai τ(R) = {5, 4, 4, 7, 8, 9, 7, 5, 4} dan nilai β(R) = {2, 1, 2, 3, 4, 4, 3, 3, 2} maka nilai flatness adalah max{0.742, 0.889} = 0.889. Gambar 17 (b) nilai

τ(R) = {5, 5, 4, 4, 4, 4, 4, 4, 5, 5} dan nilai β(R) = {1, 0, 0, 0, 0, 1, 1, 1, 1, 1} maka nilai flatness adalah max{0.240, 0.240} = 0.250. Berdasarkan kedua area tersebut, nilai flateness lebih besar area a. Hal ini menunjukkan pasangan fitur pada Gambar 17 (a) lebih tinggi korelasinya daripada Gambar 17 (b).

2 2 0 0 ( ( ( ))) ( ( ( ))) ( ) max{ , } m m i i i i t R b R flat R m m µ τ µ β = = − − =

∑ ∑

(7)

Gambar 17 evaluasi area x monotone Sumber : Djatna dan Morimoto (2008a, 2008b)

Perancangan Teknik Paralel menggunakan GPU

Komputasi paralel adalah penggunaan komputer paralel untuk mereduksi waktu yang dibutuhkan untuk menyelesaikan masalah komputasional tunggal (Quinn 2003). Beberapa jenis tugas paralelisasi adalah sebagai berikut (Quinn 2003). :

16

Beberapa tugas yang saling bebas mengerjakan operasi yang sama terhadap kumpulan data yang berbeda.

b) FunctionalParallelism

Beberapa tugas yang saling bebas mengerjakan operasi yang berbeda terhadap kumpulan data yang berbeda.

c) Pipelining

Komputasi ini mirip proses perakitan, di mana satu operasi terdiri atas beberapa bagian terhadap kumpulan data yang berbeda.

Komputasi paralel dapat dilakukan oleh computer dengan multi core CPU (Central Processing Unit) atau many core GPU (Graphics Processing Unit). Secara arsitektur GPU mempunyai lebih banyak inti (core) yang merupakan keunggulan daripada multi core CPU. NVIDIA sebagai salah satu vendor GPU merupakan perintis dalam komputasi paralel dengan GPU. CUDA (Compute Unit Device Architecture) adalah platform komput asi paralel dan model pemrograman yang diciptakan oleh NVIDIA.

Sistem komput asi CUDA terdiri atas host yaitu CPU dan satu atau beberapa device yaitu GPU. Program CUDA merupakan kode sumber gabungan untuk host dan GPU. Kompiler C (nvcc) memisahkan kompilasi program host dan program GPU. Program host ditulis menggunakan bahasa C ANSI. Program GPU menggunakan bahasa C ANSI dengan sintaks tambahan untuk fungsi data paralelisasi disebut kernel. Fungsi kernel dijalankan banyak pekerja yang disebut thread untuk paralelisasi data. Beberapa thread dikelompokkan dalam satu atau lebih blok. Fungsi kernel dikirimkan oleh host ke GPU. Parameter pada fungsi kernel digunakan untuk memasukkan data dari host ke GPU dan menerima data hasil dari GPU ke host. GPU mempunyai struktur memori seperti digambarkan pada Gambar 18. Data dari host disimpan dalam memori global dan konstan (constant) di GPU. Data tersebut dipindahkan ke memori bersama (shared memory) untuk diolah oleh tiap blok thread. Memori bersama hanya dapat terlihat oleh thread dalam satu blok.

17

Gambar 18 Struktur memori CUDA dan cara kerja program CUDA Dalam penelitian ini kasus yang akan diparalelisasi adalah seleksi fitur yang sudah dijelaskan pada bab sebelum. Proses seleksi fitur ini dilakukan untuk tiap kombinasi pasangan fitur sesuai dengan rumus 6. Tiap pasangan fitur di seleksi dengan proses yang sama. Secara sekuensial, seleksi fitur diulang sebanyak fn kali, dimana fn adalah jumlah pasangan fitur. Sehingga jika kompleksitas seleksi fitur adalah n2 maka untuk semua pasangan fitur kompleksitasnya menjadi fn x n2. Kompleksitas ini dapat di reduksi menjadi n2 dengan menjalankan seleksi fitur secara paralel untuk semua pasangan fitur. Kasus seleksi fitur yang telah dijelaskan pada bab sebelumnya dibagi menjadi dua bagian masalah yaitu diskritasi data dan komputasi geometri x-monotone. Diskritasi data akan membagi data ke dalam multidimensional equi-depth histogram. Tiap bucket pada histogram menyimpan jumlah record untuk kelas target positif dan negatif. Histogram menjadi masukan bagi komputasi x-monotone. Tiap histogram akan dicari area x-monotone dan fungsi flatness. Dua fungsi kernel dibuat untuk menyelesaikan masalah, yaitu kernel diskritasi dan kernel x-monotone.

18

Gambar 19 Rancangan program paralel untuk kasus seleksi fitur

Kernel Diskritasi

Kernel diskritasi mempunyai enam data masukan dan dua data keluaran. Tabel 1 menjelaskan masukan dan keluaran dari kernel diskritasi. Fungsi kernel diskritasi dijalankan oleh semua pasangan fitur untuk menghasilkan multidimensional equi-depth histogram. Semua pasangan fitur mengeksekusi proses diskritasi yang sama sehingga proses ini dilakukan secara paralel. Jumlah thread pada kernel diskritasi adalah jumlah pasangan fitur dikali jumlah record. Tiap pasangan fitur mempunyai thread sebanyak jumlah record. Kumpulan thread untuk tiap pasangan fitur dikelompokkan dalam satu blok thread. Seperti pada contoh Gambar 20, data yang diolah terdiri atas tiga fitur dan empat baris record. Fitur keempat adalah kelas target yang merupakan hasil klasifikasi. Tiga fitur akan menghasilkan tiga pasangan fitur berdasarkan rumus 6. Sehingga untuk kasus pada Gambar 21 kernel diskritasi akan mempunyai dua belas thread. Dua belas thread tersebut dibagi ke dalam tiga blok dengan tiap blok terdiri atas empat thread. Tiap blok thread mengeksekusi kernel untuk satu pasangan fitur.

G ambar 20 Penentuan indeks pasangan fitur untuk tiap blok thread

19

Gambar 21 Alokasi data dan kelas target ke tiap blok thread Tabel 2 Input dan output kernel diskritasi

Data Jenis Keterangan

dData Input Data semua record untuk semua fitur yang diambil dari basis data. Data ini direpresentasikan dalam bentuk vektor baris (lihat Gambar 10).

dPairId input data indeks fitur yang akan menjadi pasangan fitur yang diolah oleh tiap blok thread. Gambar 9 terdapat 3 blok yang menentukan indeks pasangan fitur untuk mereka olah. Blok-0 pair id (0,1), blok-1 pair id (0,2) dan blok-2 pair id (1,2). Kombinasi indeks pasangan fitur dilakukan oleh host.

dTargetClass input Data kelas target untuk tiap record pasangan fitur. (lihat Gambar 10).

density input jumlah record untuk tiap bucket dalam histogram.

dCelSize input Jumlah bucket untuk membentuk histogram yang merupakan perkalian baris dan kolom dari histogram.

pairs input Jumlah kombinasi pasangan fitur.

dBucketPositif Output Total record di tiap bucket untuk kelas target positif dBucketNegatif output Total record di tiap bucket untuk kelas target negatif

Setelah ditentukan alokasi thread dan data yang diperlukan, dilanjutkan dengan perancangan algoritme. Muralikrishna dan DeWitt (1988) mengajukan algoritme diskritasi data menjadi multidimensional equi-depth histogram. Algoritme tersebut melakukan dua hal yaitu pengurutan data dan pembagian data ke bucket. Dalam penelitian ini dibuat algoritme diskritasi yang mengadopsi algoritme Muralikhrisna dan DeWitt (1988) tetapi berbeda dalam hal pengurutan dan dilakukan secara paralel. Pengurutan data dilakukan berdasarkan dua nilai yaitu nilai record fitur pertama dan fitur kedua dalam pasangan fitur. Algoritme bitonic merge sort digunakan untuk proses pengurutan dapat dilihat pada Gambar 22.

20

Scatter data for each BLOCK of THREAD

EACH BLOCK of THREAD

{

Receive portion to sort

Sort local data using an algorithm of preference

FOR( level = 1; level <= lg(P) ; level++ ) FOR ( j = 0; j<level; j++ )

partner = rank ^ (1<<(level-j-1));

Exchange data with partner

IF ((rank<partner) == ((rank & (1<<level)) ==0))

extract low values from local and received data (mergeLow)

ELSE

extract high values from local and received data (mergeHigh)

END IF END FOR END FOR }

Gambar 22 Algoritme bitonic merge sort berdasarkan dua nilai data

Setelah proses pengurutan data dilakukan maka dilanjutkan dengan pembagian tiap record ke bucket. Tiap bucket menyimpan jumlah record kelas target positif dan jumlah record kelas target negative ke dalam dBucketPositif dan dBucketNegatif. Multidimensional equi-depth histogram terdiri atas dCelSize baris dan dCelSize kolom sehingga total bucket adalah dCelSize x dCelSize. Sebanyak dCelSize x dCelSize thread dipekerjakan untuk menghitung jumlah record. Jika dCelSize x dCelSize bernilai lebih kecil daripada jumlah record maka sejumlah (jumlah record - (dCelSize x dCelSize)) thread akan idle. Gambar 23 adalah contoh multidimensional equi-depth histogram berukuran 3 x 3 dan kepadatan 5 record tiap bucket. Satu thread menangani satu bucket sehingga terdapat sembilan thread pada Gambar 23. Thread bekerja secara paralel untuk menghitung lima record dalam tiap bucket. Gambar 24 menjelaskan logika untuk menghitung record tiap bucket.

Gambar 23 Alokasi beberapa thread ke tiap bucket dari multidimensional equi-depth histogram berukuran 3 x 3

21

DECLARE dBucketPositif, dBucketNegatif for saving number of record for each class value.

IF (tid < gridSize)

{in parallel}

Determine the start position of data of each thread. pos = tid * density

FOR i := 1 TO density

{in parallel}

All threads check value of target class. IF SortedTargetClass[pos] is positif THEN

add dBucketPositif ELSE

add dBucketNegatif END IF

pos = pos + 1

END FOR END IF

Gambar 24 Algoritme untuk menghitung jumlah record kelas target positif dan negatif

Kernel X-Monotone

Kernel x-monotone mempunyai lima data masukan dan satu data keluaran. Tabel 2 menjelaskan masukan dan keluaran dari kernel x-monotone. Perhitungan x-monotone untuk setiap pasangan ditangani oleh satu blok dari thread. Jumlah blok thread sama dengan jumlah pasangan fitur (fn). Jumlah thread dalam setiap blok sama dengan jumlah bucket (dCelSize x dCelSize) dalam multidimensional equi-depth histogram. Untuk menemukan area x-monotone lengkap, harus ditemuka n area di masing-masing kolom yang memaksimalkan nilai informasi gain. Perhitungan untuk area x-monotone tersebut bersifat rekursif karena nilai dari kolom m tergantung pada nilai kolom m-1. Jenis kasus ini termasuk pipelining. Dengan adanya ketergantungan ini, tidaklah mungkin untuk melakukan hal ini secara paralel. Paralelisasi hanya dapat dilakukan untuk mencari daerah yang optimal tiap kolom. Nilai yang dihitung dalam proses ini adalah inner product, botsum, bottom, topsum, top, Fmax dan flatness. Perhitungan inner product dan dilakukan oleh semua thread karena tidak ada ketergantungan nilai antara kolom. Pada kasus ini tiap thread dialokasikan di tiap bucket dan mengkalkulasi inner product secara paralel. Gambar 12 menunjukkan alokasi thread untuk menghitung nilai botsum, bottom, topsum, top. Kalkulasi ini dilakukan untuk semua kolom secara paralel sehingga jumlah thread yang dibutuhkan sebanyak dCelSize atau sebanyak jumlah kolom.

22

Tabel 3 Input dan output kernel x-monotone Parameter Jenis Keterangan

dBucketPositif Input Total record di tiap bucket untuk kelas target positif. dBucketNegatif Input Total record di tiap bucket untuk kelas target negatif. dTotalPositif Input Jumlah keseluruhan record dengan kelas target positif. dTotalNegatif Input Jumlah keseluruhan record dengan kelas target negatif. dCelSize Input Jumlah bucket untuk membentuk histogram yang

merupakan perkalian baris dan kolom dari histogram. dFlatness output Nilai fungsi flatness untuk tiap pasangan fitur seperti pada

rumus 6.

Gambar 25 Alokasi thread di tiap kolom untuk menghitung botsum, bot, topsum, top secara paralel

Berikut ini dijelaskan secara ringkas logika algoritme x-monotone :

i. Kalkulasi inner product (Θ) untuk tiap bucket dengan rumus sebagai berikut :

col = threadIdx.x row = threadIdx.y

tid = (row * dCelSize) + col

. .

x Ptid y Ptid

θ θ

Θ = +

Gambar 26 Kalkulasi inner product untuk semua kolom secara paralel ii. Komputasi botsum untuk semua kolom.

col = threadIdx.x row = threadIdx.y botsum(row) = 0 FOR S = 2 to N

pos = ((s-1) * dCelSize) + col

botsum((s * dCelSize)+col) = botsum(pos) + G(pos) END FOR

Gambar 27 Komput asi botsum semua kolom secara paralel iii. Komputasi bot untuk semua kolom.

col = threadIdx.x row = threadIdx.y bot(row) = 1

23

FOR s = 2 TO N

idx = bot(((s-1) * dCelSize)+col)

IF (botsum((s * dCelSize)+col) < botsum((idx * dCelSize)+col)

bot((s * dCelSize)+col) = s ELSE

bot((s * dCelSize)+col) = bot(((s-1) * dCelSize)+col)

END IF

dBottomArr((s*dCelSize)+m) = topm(s) END FOR

Gambar 28 Lanjutan Komputasi bot untuk semua kolom secara paralel iv. Komputasi topsum untuk semua kolom.

col = threadIdx.x row = threadIdx.y topsum(row) = 0 FOR s = N-1 to 1

pos = ((s+1) * dCelSize) + col

topsum((s * dCelSize)+col) = topsum(pos) + G(pos) END FOR

Gambar 29 Komputasi topsum untuk semua kolom secara paralel v. Komputasi top untuk semua kolom.

col = threadIdx.x row = threadIdx.y top(row) = row FOR s = N-1 TO 1

idx = bot(((s+1) * dCelSize)+col)

IF (topsum((s * dCelSize)+col) < topsum((idx * dCelSize)+col) topm((s * dCelSize)+col) = s ELSE topm((s * dCelSize)+col) = topm((((s+1)*dCelSize)+col)) END IF dTopArr((s*dCelSize)+m) = topm(s) END FOR

Gambar 30 Komputasi top untuk semua kolom secara paralel

vi. Komputasi F-max untuk membentuk area x-monotone dilakukan tiap kolom. Komputasi x-monotone kolom m memerlukan area x-monotone kolom m-1.

col = threadIdx.x row = threadIdx.y

tid = (row * dCelSize) + col

FOR idx = dBottomArr[tid] TO dTopArray[tid]

cover[tid] = innerProduct[(idx*dCelSize) + col] END FOR

24 IF (col == 1) THEN F(col) = max(cover(col)) END IF FOR k = 2 TO m F(k) = max(max(0,F(k-1))+cover(k))) END FOR

Gambar 31 Lanjutan Komputasi F-max untuk tiap kolom secara paralel vii. Kalkulasi convex hull

Kalkulasi ini memerlukan perulangan yang akan mencari area x-monotone dengan nilai entropi lebih rendah daripada nilai entropi terbaik saat ini. Kalkulasi ini tetap berjalan sekuensial karena perulangan bersifat heuristik.

viii. Pada kalkulasi fungsi flatness sesuai dengan rumus 7, perhitungan jarak dilakukan secara paralel seperti pada Gambar 32.

col = threadIdx.x

b[col] = pow( bottom[col] – mean_bottom, 2) t[col] = pow( top[col] – mean_top, 2)

Gambar 32 Komput asi nilai flatness secara paralel Integrasi Aplikasi dan Kernel

Aplikasi ditulis dalam bahasa pemrograman Visual C++ edisi express 2008. Aplikasi terdiri atas program yang berjalan di host dan program yang berjalan di GPU. Gambar 33 menjelaskan struktur program aplikasi secara keseluruhan. Prototipe.cpp adalah program yang dijalankan di host, KernelSupport.cu adalah program yang dijalankan di GPU, KernelDiskritasi.h dan KernelXmonotone. adalah file header yang berisi kode program kernel yang dijalankan di GPU. Program prototipe.cpp akan memanggil KernelSupport.cu. Dalam KernelSupport.cu dieksekusi pemanggilan header KernelDiskritasi.h dan KernelXmonotone.h.

Gambar 33 Arsitektur aplikasi seleksi fitur

Prototipe.cpp adalah program yang terkoneksi langsung dengan DBMS MySQL 5.5. Prototipe.cpp mengambil seluruh data dari sampel di tabel BackingSample. Prototipe.cpp menghitung dimensi data yaitu jumlah record dan jumlah fitur. Prototipe.cpp menghitung jumlah pasangan fitur berdasarkan jumlah fitur dan membuat kombinasi pasangan fitur dan disimpan dalam variabel dPairId. Nilai-nilai yang disebutkan sebelumnya adalah variabel atau tidak tetap. Fungsi kernel harus dapat menerima nilai yang tidak tetap ini dan tetap berjalan normal. Hal ini dilakukan dengan menyimpan semua data-data yang ukurannya tidak tetap dalam memori bersama dinamis (dynamic shared memory). Memori bersama

25

dinamis dalam program CUDA adalah memori bersama yang ukurannya tidak konstan dan ditentukan dari luar fungsi kernel.

Berikut ini dijelaskan bagaimana memori bersama dinamis digunakan untuk data dinamis. Contoh yang diambil adalah alokasi memori bersama dinamis pada kernel diskritasi. Data yang ukurannya dinamis adalah dData, dTargetClass, dBucketPositif, dBucketNegatif (lihat Tabel 2). Pertama deklarasikan variabel untuk menyimpan ukuran seluruh data yang dinamis dalam hal ini variabel nSharedMem. Variabel ini diberikan nilai nol sebagai nilai inisialisasi. Alokasikan ukuran untuk memori dinamis dengan dengan aturan seperti rumus 8 dan 9. Kode sumber untuk alokasi ukuran data dinamis di kernel diskritasi dapat dilihat pada Gambar 34.

Jika data bukan array maka :

nSharedMemory=ukuranTipeData (8) Jika data berupa array maka :

1

totalItem

length

nSharedMemory length ukuranTipeData =

=

× (9)

int nSharedMem; nSharedMem = 0;

nSharedMem += 2 * (totalRecord * sizeof(float)); nSharedMem += totalRecord * sizeof(int);

nSharedMem += 2 * (gridSize * sizeof(int)); nSharedMem += 2 * (gridSize * sizeof(int));

Gambar 34 Alokasi ukuran data dinamis di kernel diskritasi

Memori bersama dinamis nSharedMem dimasukkan ke kernel dengan perintah seperti pada Kode sumber 3. Ukuran memori bersama dinamis dialokasikan untuk tiap blok thread. Sehingga jika jumlah blok sebanyak blocksPerGrid maka total memori bersama keseluruhan yang digunakan program adalah blocksPerGrid x nSharedMem. Berikut ini penjelasan elemen dari Gambar 35 :

• diskritasi : kernel.

• blocksPerGrid : jumlah blok thread.

threadsPerBlock : jumlah thread dalam blok thread.

• nSharedMem : ukuran memori dinamis dalam byte.

diskritasi<<<blocksPerGrid,threadsPerBlock, nSharedMem>>> ( dData, dPairId, dTargetClass, dSorted,

dBucketYes, dBucketNo, dTotalYes,

dTotalNo,totalRecord, celSize, density, totalFitur);

Gambar 35 Pemanggilan kernel beserta jumlah blok thread, jumlah thread, ukuran memori dinamis dan data

Setelah dialokasikan ukuran memori bersama dinamis untuk tiap blok, selanjutnya adalah mendeklarasikan variabwl di blok yang menggunakan memori bersama. Rincian logikanya dapat dilihat pada Kode sumber 4. Baris pertama pada Gambar 36 digunakan untuk mendeklarasikan variabel s untuk memori bersama dinamis.

26

Baris berikutnya mengalokasikan memori dinamis ke beberapa variabel dengan cara menggunakan pointer.

extern __shared__ float s[]; dAtt1 = s; dAtt2 = &dAtt1[totalRecord];

sorted = (int *)&dAtt2[totalRecord]; yes = &sorted[totalRecord];

no = &yes[gridSize]; tYes = &no[gridSize]; tNo = &tYes[gridSize];

Gambar 36 Pengambilan memori bersama dinamis untuk tiap variable di dalam blok

Dokumen terkait