1. PERKALIAN MATRIX Perkalian dari dua matrix dapat dilakukan bila jumlah kolom pada matrix di sebelah kiri sama dengan jumlah baris pada matrix di sebelah kanan. Bila A merupakan matrix mxn dan B adalah nxm matrix, maka matrix perkalian AB adalah mxp matrix dimana hasilnya didapatkan dari dot product baris A pada kolom B.
nilai dari matrix agar dapat dimasukkan ke dalam cache kemudian dilakukan perhitungan. Hasil dari perhitungan kemudian dikembalikan ke dalam memori yang lambat RAM. Proses perhitungan secara blocking ditunjukkan pada gambar 3.
Gambar 2: Transpose matrix, merubah nilai pada baris ke kolom dan sebaliknya.
Perkalian matrix pada single processor merupakan persoalan komputasi sederhana. Namun pada matrix berukuran besar mengambil banyak ruang memori. Akses memori yang terbatas ini menimbulkan proses komputasi tidak optimal karena proses perhitungan lebih cepat dari pada proses akses data. Perkalian matrix pada komputer terdapat beberapa metode diantara nave, transpose, dan blocking. Metode nave merupakan perkalian matrix dengan cara biasa dan akan digunakan sebagai referensi tingkat percepatan untuk metode lainnya. Matrix memiliki bentuk 2 dimensi sementara memori komputer dibaca secara 1 dimensi. Hal ini menjadi dasar metode transpose dimana perkalian antara baris matrix sebelah kiri dengan kolom matrix sebelah kanan diubah menjadi dengan baris matrix sebelah kanan. Perubahan susunan matrix ditunjukkan pada gambar 2. Memori pada komputer terdapat jenis yang akses datanya cepat disebut dengan cache. Namun cache tidak memiliki ukuran besar sehingga tidak mampu menampung data matrix yang berukuran besar. Metode blocking dilakukan dengan membagi data
2. PROGRAM PERKALIAN MATRIX Program ditulis ke dalam tiga bagian penting sesuai dengan metode yang digunakan yaitu nave, transpose, dan blocking. 2.1 Nave matrix multiplication Perkalian matrix secara nave ditulis secara sederhana dimana dilakukan perkalian secara dot product baris A dengan kolom B.
//naive matrix multiplication for(i=0;i<size;i++) { for(j=0;j<size;j++) {
2.2 Transpose matrix multiplication Metode perkalian matrix multiplication sama dengan secara nave. Namun sebelum proses perkaliannya dilakukan proses transpose dimana nilai pada baris ditukar dengan nilai pada kolomnya.
//transposing matrix b for(i=0;i<size;i++) { for(j=0;j<size;j++) { transpose[i][j] = b[j][i]; } } //transpose matrix multiplication for(i=0;i<size;i++) { for(j=0;j<size;j++) { result[i][j]=0; for(k=0;k<size;k++) { result[i][j] += a[i][k] * transpose[j][k]; } } }
//read a block m=0; for(x=i;x<min(i+blockSize,size);x++) { n=0; for(y=k;y<min(k+blockSize,size);y++) { aBlock[m][n] = a[x][y]; n++; } m++; } //read b block m=0; for(x=k;x<min(k+blockSize,size);x++) { n=0; for(y=j;y<min(j+blockSize,size);y++) { bBlock[m][n] = b[x][y]; n++; } m++; } //block multiplication for(x=0;x<blockSize;x++) { for(y=0;y<blockSize;y++) { for(z=0;z<blockSize;z++) { resultBlock[x][y] += aBlock[x][z] * bBlock[z][y]; } } } } //write resultBlock to result m=0; for(x=i;x<min(i+blockSize,size);x++) { n=0; for(y=j;y<min(j+blockSize,size);y++) { result[x][y] = resultBlock[m][n]; n++; } m++; } } }
2.3 Blocking matrix multiplication Secara blocking dibagi menjadi beberapa proses membaca blok matrix A ke cache, membaca blok matrix B ke cache, melakukan perkalian matrix blok A dengan blok B, dan menuliskan hasil perkalian blok ke memori lambat RAM.
//blocking matrix multiplication for(i=0;i<size;i+=blockSize) { for(j=0;j<size;j+=blockSize) { //read result block m=0; for(x=i;x<min(i+blockSize,size);x++) { n=0; for(y=j;y<min(j+blockSize,size);y++) { resultBlock[m][n] = result[x][y]; n++; } m++; } for(k=0;k<size;k+=blockSize) {
3. HASIL OPTIMASI Kinerja pada optimasi perkalian matrix dengan metode transpose dan blocking menunjukkan hasil yang mencolok bila dibandingkan dengan metode nave. Hasil percobaan dengan berbagai ukuran matrix terhadap waktu yang dibutuhkan dalam satuan detik ditunjukkan pada tabel 1.
Table 1. Percobaan untuk berbagai ukuran matrix terhadap waktu komputasi yang diperlukan dalam satuan detik. Ukuran matrix 10 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 Nave 0 0.001 0.01 0.009 0.024 0.129 0.156 0.266 0.357 0.746 1.228 1.586 2.486 4.413 6.275 9.422 11.501 13.982 14.537 22.172 23.366 Transpose 0.001 0 0.004 0.008 0.022 0.037 0.12 0.23 0.279 0.523 0.702 0.706 0.893 1.396 1.492 2.182 3.088 3.276 3.515 4.499 5.187 Block 0.001 0.001 0.005 0.007 0.017 0.035 0.059 0.115
ditunjukkan flops yang dibutuhkan untuk setiap metode pada berbagai ukuran matrix.
1200 1000 Flops(106) 800 600 400 200 0 Nave Transpose Blocking
0.321 0.374 0.49 0.498 1.378 1.185 1.626 1.802 1.782 2.523 2.785 3.658
Tingkat Percepatan 9 8 7 6 5 4 3 2 1 0
Grafik menunjukkan percepatan yang sangat tinggi untuk metode transpose dan blocking bila dibandingkan dengan metode nave. Tingkat percepatannya ditunjukkan pada gambar 6.
10 100 200 300 400 500 600 700 800 900 1000 Ukuran Matrix
0.167
Pada tabel ditunjukkan metode nave menjadi yang paling cepat bila ukuran matrixnya kecil. Hasil pada tabel 1 bila digambarkan dalam grafik dapat dilihat pada gambar 4.
25
Transpose Blocking
4. KESIMPULAN
10 Nave 5 Transpose 0 10 100 200 300 400 500 600 700 800 900 1000 Blocking
Ukuran Matrix
Jumlah flops yang dilakukan untuk setiap ukuran matrix dapat dihitung dengan persamaan 2(n)3/waktu, dimana n adalah ukuran dari matrix. Pada gambar 5
Dari penerapan optimasi yang diterapkan didapatkan beberapa kesimpulan diantaranya : 1. Metode transpose dan blocking menunjukkan kinerja yang lebih cepat dibandingkan metode nave untuk matrix ukuran besar. 2. Metode blocking menunjukkan sebagai metode yang paling cepat. 3. Metode nave paling cepat bila ukuran matrix kecil. 4. Dalam penulisan program perlu diperhatikan karakteristik akses data untuk dihasilkan kinerja program yang optimal.
1000
100
200
300
400
500
600
700
800
900
10
DAFTAR REFERENSI [1] Single Processor Optimizations Matrix Multiplication Case Study, K a t h y Y e l i c k , yelick@cs.berkeley.edu, www.cs.berkeley.edu/~yelick/cs267