ISSN : 2407 - 6511
SIMULASI FLUIDA MENGGUNAKAN CUDA FAST FOURIER TRANSFORM LIBRARY (CUFFT) DAN OPEN GL Irwinda Famesa1, I Wayan Ade S.D2, Fitriyani3 1,,2,3
1
Prodi S1 Teknik Ilmu Komputasi, Fakultas Informatika, Universitas Telkom
[email protected],
[email protected],
[email protected]
Abstrak Fluida merupakan suatu zat yang bisa mengalami perubahan-perubahan bentuknya secara kontinu bila terkena tekanan atau gaya geser walaupun relatif kecil atau bisa juga dikatakan suatu zat yang mengalir. Simulasi fluida adalah penyelesaian numerik pada persamaan Navier-Stokes yang direpresentasikan pada grid uniform dari lokasi spasial atau grid cells. Simulasi ini memerlukan sumber daya yang besar. Pada penelitian ini NVIDIA CUDA Fast Fourier Transform library (cuFFT) digunakan untuk simulasi fluida. Kemudian hasil komputasi CuFFT akan ditampilkan menggunakan OpenGL untuk me-render sistem partikel didalam fluida dengan tools QT Project dan Visual Studio. Hasil penelitian menunjukkan bahwa besaran inputan Viscosity dan force berpengaruh pada perubahan fps. Kata kunci : NVIDIA CUDA, cuFFT, simulasi fluida Pendahuluan NVIDIA CUDA Fast Fourier Transform (FFT) terdiri dari dua library terpisah: cuFFT dan cuFFTW. Library cuFFT didesain untuk memberikan performa tinggi pada GPU-GPU NVIDIA. Library cuFFTW dibuat sebagai alat porting untuk memungkinkan pengguna FFTW untuk mulai menggunakan GPU-GPU NVIDIA dengan upaya yang minimum. Library NVIDIA CUDA 6.5 Fast Fourier Transform library (cuFFT) menyediakan interface yang sederhana untuk komputasi FFTs hingga 10 kali lebih cepat. Dengan menggunakan ratusan core prosesor dalam GPU NVIDIA, cuFFT memberikan kinerja floating-point dari GPU tanpa harus mengembangkan implementasi custom FFT GPU. FFT merupakan algoritma divide-and-conquer untuk menghitung transformasi Fourier diskret atas dataset kompleks maupun nilai riil secara efisien. FFT merupakan salah satu algoritma numerik yang paling penting dan paling banyak digunakan pada komputasi fisika dan pemrosesan sinyal umum. Library cuFFT menyediakan interface sederhana untuk menghitung FFT pada GPU NVIDIA, yang memungkinkan pengguna untuk memaksimalkan daya floating-point dan paralelisme dari GPU pada library yang optimal. NVIDIA CUDA Fast Fourier Transform library (cuFFT) banyak digunakan dalam aplikasi mulai dari fisika komputasi untuk pengolahan citra dan pemrosesan sinyal umum. Fast Fourier Transform adalah suatu algoritma yang efisien untuk menghitung transformasi Fourier diskrit kompleks atau bernilai real set data. cuFFT menggunakan algoritma Cooley-Tukey dan Bluestein algoritma, sehingga hasil lebih akurat dan lebih cepat. Library cuFFTW menyediakan API FFTW3 untuk memfasilitasi porting dari aplikasi FFTW yang ada. Pada penelitian ini akan disimulasikan fluida menggunakan cuFFT dan OpenGL dengan bantuan GPU sebagai media pemrosesan. GPU mengoptimalkan perhitungan pada piksel, yang dapat dijadikan sebagai grid sel. GPU mencapai kinerja tinggi melalui paralelisme dengan penggunaan thread yang mampu memproses beberapa simpul dan piksel secara bersamaan sehingga mengoptimalkan melakukan beberapa pencarian tekstur per siklus. Hasil akhir akan ditampilkan menggunakan bahasa OpenGL dengan mengaplikasikan tampilan aplikasi QT Project untuk me-render sistem partikel didalam fluida. Dasar Teori 1. Fluida Fluida merupakan suatu zat yang bisa mengalami perubahan-perubahan bentuknya secara kontinu/terus-menerus bila terkena tekanan atau gaya geser walaupun relatif kecil atau bisa juga dikatakan suatu zat yang mengalir. Fluida tersusun atas molekul-molekul dengan jarak pisah yang cukup kecil untuk zat cair. Molekul-molekul tersebut tidak dapat terikat pada suatu sisi, melainkan zat-zat
204
ISSN : 2407 - 6511 tersebut saling bergerak bebas terhadap satu dengan yang lainnya. mencakup zat cair, gas, air, dan udara karena zat-zat ini dapat mengalir [1]. Watak dari fluida adalah mengalir, mengisi ruangan yang mewadahinya. Beberapa diantara sifat-sifat fluida adalah: 1) Densitas (massa jenis) dan berat spesifik: Densitas adalah massa per satuan volume, sedangkan berat spesifik adalah berat per satuan volume. 2) Temperatur (suhu), panas spesifik (specific heat), konduktivitas termal, dan koefisien ekspansi termal: Panas spesifik adalah jumlah energi panas yang diperlukan untuk menaikkan satu satuan massa sebesar satu derajat. Konduktivitas termal menunjukkan kemampuan fluida untuk menghantarkan (mengkonduksikan) panas. Sedangkan koefisien ekspansi termal menghubungkan antara temperatur dan densitas pada tekanan konstan. 3) Compressibility: Dalam hal ini, fluida bisa dibagi menjadi compressible fluid dan incompressible fluid. Secara umum, cairan bersifat compressible dan kemampuan suatu fluida untuk bisa dikompresi biasanya dinyatakan dalam bulk compressibility modulus.Istilah compressible fluid dan incompressible fluid dibedakan dengan istilah compressible flow dan incompressible flow. Compressible flow adalah aliran dimana densitas fluidanya tidak berubah didalam medan aliran (flow field), misalnya aliran air. Sedangkan incompressible flow adalah aliran dimana densitas fluidanya berubah didalam medan aliran, misalnya aliran udara. 4) Viskositas: menunjukkan resistensi satu lapisan untuk meluncur (sliding) diatas lapisan lainnya. Definisi lain dari viskositas dikaitkan dengan ada tidaknya geseran (shear). Dengan demikian, viskositas berhubungan langsung dengan besarnya friksi dan tegangan geser yang terjadi pada partikel-partikel fluida. Semua fluida pasti memiliki viskositas betapapun kecilnya. Namun ketika viskositasnya sangat kecil dan bisa diabaikan, maka biasanya diasumsikan sebagai inviscid fluid. 2. Fast Fourier Transform (FFT) Fast Fourier Transform (FFT) merupakan suatu algoritma untuk menghitung Discrete Fourier Transform (transformasi Fourier diskri atau DFT) dengan cepat, efisien dan inversnya yang diterapkan dalam beragam bidang dari pengolahan sinyal digital dan memecahkan persamaan diferensial parsial menjadi algoritma-algoritma untuk penggandaan bilangan integer dalam jumlah banyak. Garis besar dari kata Fast diartikan karena formulasi FFT jauh lebih cepat dibandingkan dengan metode perhitungan algoritma Fourier Transform sebelumnya [2]. Sebuah DFT bisa diimplementasikan sebagai matrix vektor perkalian yang memerlukan operasi O(N2). Bagaimanapun, library cuFFT menggunakan algoritma Cooley-Turkey untuk mengurangi jumlah operasi yang diperlukan untuk mengoptimasi performa dari ukuran suatu transformasi. Transformasi Fourier merupakan suatu proses memindahkan domain dari suatu fungsi atau obyek ke dalam domain frekwensi. Di dalam pengolahan citra digital, transformasi Fourier digunakan untuk mengubah domain spasial pada citra menjadi domain frekwensi. Analisa-analisa dalam domain frekwensi banyak digunakan seperti filtering. Dengan menggunakan transformasi Fourier, sinyal atau citra dapat dilihat sebagai suatu obyek dalam domain frekwensi
F(t )
Transfor masi
F( )
Gambar 2.1. Transformasi Fourier Transformasi Fourier diskrit atau disebut dengan Discrete Fourier Transform (DFT) adalah model transformasi Fourier yang dikenakan pada fungsi diskrit, dan hasilnya juga diskrit. DFT didefinisikan dengan :
205
ISSN : 2407 - 6511 N
F (k ) f (n).e j 2knT / N
(1)
n 1
Dimana :
F = representasi domain frekuensi sinyal time series sinyal 'f'. Rumus menghasilkan satu bilangan kompleks F(k) untuk setiap k. k = komponen frekuensi k ; k = 0,1,..,N-1. N = jumlah sampel dalam sinyal ‘f’. f = sinyal time series (data) ; n = 0,1,..,N-1. n = sampel ke-n (dalam domain waktu). j = unit imajiner.
3. Deskripsi Tools Tools yang digunakan pada penelitian ini adalah sebagai berikut: 1. Visual Studio 2013 Visual Studio adalah satu set lengkap alat pengembangan untuk membangun aplikasi dan memudahkan penciptaan solusi dengan bahasa campuran. Selain itu, memungkinkan suatu bahasa menggunakan fungsi dari Framework. Kelebihan dari visual studio 2013 adalah dapat menjalankan cuda 6.5 toolkit[3]. 2. Cuda Toolkit 6.5 CUDA Toolkit mencakup compiler untuk NVIDIA GPU, library matematika, dan alat-alat untuk debugging dan mengoptimalkan kinerja aplikasi. CUDA 6.5 memperkenalkan API callback yang memungkinkan untuk mengoptimalkan perpindahan data pada banyak aplikasi. Fitur ini tersedia di library cuFFT untuk cuFFT callback [4]. 3. CuFFT NVIDIA CUDA Fast Fourier Transform library (cuFFT) banyak digunakan dalam aplikasi mulai dari fisika komputasi untuk pengolahan citra dan pemrosesan sinyal umum. cuFFT menggunakan algoritma Cooley-Tukey dan Bluestein algoritma, sehingga hasil lebih akurat dan lebih cepat. Algoritma tersebut mengekspresikan matriks DFT sebagai penjumlahan blok matrix yang jarang. Library cuFFT mengimplementasikan blok bangunan berikut: radix-2, radix-3, radix5, and radix-7. Maka performa dari ukuran transformasi yang bisa difaktorkan sebagai 2 a × 3 b × 5 c × 7 d (dimana a,b,c, dan d adalah bilangan bulat non-negative) di optimisasikan di library cuFFT. Ada juga bangunan blok untuk bilangan prima lainnya, m, yang nilainya < 128. Ketika panjang tidak bisa diurai menjadi perkalian dari pangkat bilangan prima antara 2 ke 127, algoritma bluestein yang digunakan. Sejak implementasi bluestein membutuhkan lebih banyak komputasi per titik output dari implementasi Cooley-Tukey, akurasi algoritma CooleyTukey lebih baik. Implementasi murni Cooley-Tukey mempunyai akurasi yang sempuran, dengan error relatif yang tumbuh secara proporsional ke log 2(N), dimana N adalah ukuran transformasi dalam titik [5]. 4. Open GL OpenGL adalah suatu graphic library yang digunakan pada berbagai jenis compiler seperti C++. Dalam kasus ini openGL untuk menampilkan cairan, pergerakan partikel menggunakan medan kecepatan fluida, dan untuk menggambarkan partikel. Interoperabilitas API memungkinkan untuk berbagi memori antara CUDA dan OpenGL, sehingga dapat memperbarui sistem partikel menggunakan CUDA, dan render dari memori yang sama dengan menggunakan OpenGL [6]. 5. QT Project Qt adalah aplikasi cross-platform dan UI framework untuk pengembang menggunakan C ++ atau QML, CSS dan JavaScript [7]. 6. Free Glut FreeGLUT adalah utilitas Toolkit (GLUT) library yang memungkinkan pengguna untuk membuat dan mengelola jendela yang berisi konteks OpenGL pada berbagai platform dan juga membaca fungsi mouse, keyboard dan joystick [8]. 7. Glew OpenGL Extension Wrangler Library (GLEW) adalah cross-platform C / C ++ library yang membantu dalam query dan pemuatan ekstensi OpenGL.
206
ISSN : 2407 - 6511 GLEW menyediakan mekanisme run-time yang efisien untuk menentukan OpenGL ekstensi yang didukung pada platform target. Semua ekstensi OpenGL terpapar dalam file header tunggal, yang merupakan mesin yang dihasilkan dari daftar ekstensi resmi [9]. Simulasi Fluida Ada beberapa library yang digunakan pada project simulasi fluida. Saat dilakukan proses running, terdapat perintah error sehingga project gagal dijalankan, seperti library undefine atau cannot open source file . Untuk mengatasinya, dilakukan pengecekan atau penanganan error yaitu salah satunya mencari library yang dibutuhkan. Sebelum menambahkan library, dilakukan build customization files untuk dapat memanggil fungsi-fungsi cuda. Berikut library-library yang digunakan setelah dilakukan pengecekan : QT Pada glfluids.h terdapat include QGLWidget sehingga dibutukan library Qt. Kemudian dilakukan penambahan direktori library tersebut.
Gambar 3.2 Penambahan direktori QtOpenGL FreeGlut Ketika ada error message yang berawalan GL, maka konfigurasi library open GL belum benar. Maka download freeGlut sebagai library. Glew Pada fluidGL.cpp terdapat library glew yang digunakan, maka langkah berikutnya adalah download library, lalu di build dengan klik glew.sln dan dijalankan. Kemudian link C:\Dev\glew-1.11.0\include dan C:\Dev\glew-1.11.0\lib dimasukkan ke properties pages. Untuk langkah terakhir, semua library diinisialisasi satu persatu ke dalam additional dependencies.
Inti pada simulasi fluida adalah penyelesaian numerik pada persamaan Navier-Stokes, direpresentasikan pada grid uniform dari lokasi spasial atau grid cells. Penyelesaian dikerjakan secara iteratif dimana setiap iterasi 1 set dari operator diskret differensial diaplikasikan pada sekelompok kecil cell pada seluruh domain. Beberapa operasi seperti penyebaran dan tekanan akan update state fluida berdasarkan nilai grid. Kernel yang digunakan pada langkah saat penyelesaian fluida diparalelkan dengan mengeksekusi blok-blok dari ratusan thread yang mencakup domain komputasi, dimana setiap thread mengaplikasikan operator-operator ini ke sejumlah kecil sel grid. Kernel sendiri dijalankan dengan banyak thread secara bersamaan pada GPU. Thread ini dikelompokkan pada block. Jumlah thread yang dapat dijalankan pada satu block terbatasi oleh kemampuan hardware, tapi satu kernel dapat dijalankan oleh banyak block sekaligus. Banyaknya block dan thread per block didefinisikan saat memanggil kernel dalam program. Thread yang berada dalam satu block dapat saling berbagi memori. Konfigurasi thread memberikan performa jumlah thread per blok, maksimum jumlah blok per multiprocessor dalam chip, dan jumlah sumber daya per thread yang tersedia. Kami menggunakan kode CUDA C yang tersedia untuk memeriksa tiap thread di dalam batasan domain. Kode ini digunakan pada semua fungsi __global__ untuk solver fluida, dan digunakan blok thread 64 x 4, dimana tiap thread menghitung hasil untuk kolom vertikal dari sel 16 grid. Berikut pengeksekusian blok thread pada domain fluida [10] : Ukuran tile : Domain fluida dibagi menjadi tile dengan sel 64 kali 64. Kami melakukan tile keseluruhan domain dengan cara ini, menggunakan tile penuh secara parsial jika dimensi domain tidak dapat dibagi 64. Ukuran blok : 256 thread dibagi secara logika pada 64 thread dalam x kali 4 thread di y. Thread-thread ini didistribusikan ke tile layaknya tiap thread menghitung hasil untuk kolom vertikal dari sel 16 grid.
207
ISSN : 2407 - 6511
Gambar 3.6 Thread pada penyelesaian fluida Kemudian simulasi dilakukan dengan langkah sebagai berikut: 1.
Memasukkan nilai inputan berupa force dan viscosity. Force merupakan kecepatan fluida berkembang sesuai dengan tenaga masukan dari waktu ke waktu. Langkah ini mengupdate medan kecepatan fluida dengan mengintegrasikan kekuatan pada setiap sel grid sedangkan viscosity merupakan ukuran bagaimana input tenaga berdifusi melintasi medan kecepatan dari waktu ke waktu.
Gambar 3.3 Inputan Program
Gambar 3.4 Hasil running program 2.
Pergerakan Fluida Pada pergerakan fluida,yang sebelumnya bergerak jika ada interaksi sentuh, maka kami modifikasi sehingga setelah menginputkan nilai force dan viscosity sehingga aliran fluida akan bergerak sendirinya sesuai kecepatan maupun kepekatan inputan.
208
ISSN : 2407 - 6511
Gambar 3.5 Pergerakan fluida otomatis
3.
Menampilkan FPS Untuk mengetahui fps saat running program, maka kami menambahkan programnya sehingga dapat dianalisis dari segi FPS.
Tabel 1 berikut menggambarkan inputan force dan viscosity beserta hasil fps setelah dirunning. Tabel 1. Hasil Running Force 50 100 200 400 750 1000 2300 4000 6900 10000
Viscosity 0.00005 0.00007 0.00009 0.0005 0.0007 0.0009 0.005 0.007 0.009 0.01
FPS min 81.9 55.5 59.8 59.5 58.7 66.4 94.5 75.3 57.1 60.5
FPS max 500.2 499.9 506.7 502.1 499.1 495.2 493.7 488.7 479.4 472.1
Dalam grafik berikut ditampilkan :
209
ISSN : 2407 - 6511 Dari data dan grafik terlihat bahwa besaran inputan Viscosity dan perubahan fps.
force berpengaruh pada
4. Kesimpulan CUFFT digunakan pada saat melakukan difusi velocity dan massa konservasi dalam domain frekuensi. Library CUDA FFT akan menampilkan transformasi Fourier. OpenGL interoperability menampilkan fluida, setiap partikel (kecepatan medan fluida) digambarkan menggunakan GL. Interoperabilitas API mengijinkan memori dibagi antara CUDA dan OpenGL, sehingga update sistem partikel menggunakan CUDA dan render menggunakan OpenGL. Cairan fluida dapat disimulasikan dengan menggunakan library CUDA yaitu cuFFT dan OpenGL dengan bantuan tool Qt dan Visual Studio. Simulasi dapat dijalankan dengan spesifikasi laptop yang telah include GPU Nvidia didalamnya. Berdasarkan hasil analisis, terlihat bahwa ketika menambahkan perhitungan secara otomatis dengan menyimpan segala bentuk perpindahan pada kordinat partikel cairan, maka fps yang dihasilkan berkisar rata-rata 64 (min) sampai 520 (max). Sedangkan ketika tidak ditambahkan perhitungan perpindahan otomatis dengan tidak menyimpan segala hasil perubahan yang ada, maka fps yang dihasilkan berada pada kisaran 100 (standar).
5. Referensi [1] Stam, J. 1999. “Stable Fluids.” InProceedings of SIGGRAPH 1999. [2] Harris, Mark J. Fast Fluid Dynamics Simulation on the GPU. In GPU Gems, R. Fernando, Ed., ch. 38, pp. 637–665. Addison Wesley, 2004 [3] Microsoft. 2014. “Visual Studio 2013”. Available at http://www.visualstudio.com/enus/downloads/download-visual-studio-vs.aspx. [accessed 5 Desember 2014] [4] NVIDIA. 2014. “Cuda Toolkit ” Available at https://developer.nvidia.com/cuda-toolkit. [accessed 5 Desember 2014] [5] NVIDIA. 2007. “CUDA Toolkit Documentation”. Available at http://docs.nvidia.com/cuda/cufft/index.html#cufft-api-reference. [accessed 5 Desember 2014] [6] SGI Website. 2014. „”OpenGL”. [Online] Available at https://www.opengl.org/ [accessed 5 Desember 2014] [7] Digia Oyj. 2014.” QT Project” [Online] Available at qt-project.org. [accessed 5 Desember 2014] [8] FreeGLUT. 2014.”FreeGLUT”[Online] Available at freeglut.sourceforge.net. [accessed 5 Desember 2014] [9] Adiwijaya, 2014, “Aplikasi Matriks dan Ruang Vektor”. Graha Ilmu [10] Glew.2014.”Glew”[Online] Available at http://glew.sourceforge.net/.[accessed 5 Desember 2014] [11] Nolan Goodnight.2007. “CUDA/OpenGL Fluid Simulation”. NVIDIA. [12] Github.2014. “Cuda example” . Available at https://github.com/drufat/cuda-examples. [accessed 5 Desember 2014]
210