Mengenal General Purpose Programming pada GPU (GPGPU) – [Bag. 1]

GPGPU, kepanjangan dari general-purpose computing on graphics processing units, adalah penggunaan GPU (graphics processing unit) untuk komputasi secara umum yang biasanya dilakukan di CPU [1]. Awalnya dulu GPU hanya dipakai untuk melakukan komputasi yang berhubungan dengan grafis, namun kemudian orang menyadari bahwa kemampuan GPU yang besar untuk melakukan komputasi floating point secara paralel sangat menggoda untuk dipakai untuk keperluan lain selain grafis.

Keunggulan utama GPGPU dibandingkan dengan CPU adalah kemampuannya untuk melakukan operasi paralel secara masif. Kita ambil contoh misalnya saat ini procesor Intel Xeon terbaru mempunyai paling banyak 24 core [2], sedangkan kartu grafis GPGPU terbaru dari NVidia, Tesla V100, mempunyai 5120 core! [3] Atau kalau kita ambil contoh kartu grafis NVidia untuk level konsumer saja, misalnya GeForce GTX 1050 Ti seharga 2 jutaan, punya 2560 core (prosesor Xeon dengan 24 core tadi saya estimasi harganya di atas 150 juta!).

Core pada GPU jauh lebih sederhana daripada core pada CPU, oleh karena itu harganya lebih murah. Dan sebenarnya keduanya tidak bisa dibandingkan satu dengan lainnya secara langsung. Ada yang bilang, istilah core pada GPU sebenarnya lebih ke istilah marketing saja, agar terlihat unggul, karena NVidia selalu mengunggulkan GPU dari pada CPU. Ada benarnya juga. Arsitektur core pada GPU dibuat untuk melakukan satu instruksi yang sama pada jutaan data (misalnya semua pixel di monitor), sedangkan core pada CPU dibuat untuk melakukan banyak hal yang berbeda dan mempunyai set instruksi yang jauh lebih kompleks [4].

gputech_f2
Ilustrasi perbedaan arsitektur GPU dan CPU. GPU mengalokasikan lebih banyak unit untuk pemrosesan dari pada untuk flow control dan caching data (sumber: [15])
Namun ternyata jenis pemrosesan GPU di atas, yaitu eksekusi satu operasi yang sama pada jutaan data, banyak juga dijumpai di bidang lain, misalnya di bidang keilmuan. Contoh aplikasi mendasar dari prinsip ini adalah operasi matriks, di mana satu jenis operasi yang sama (misalnya penjumlahan atau perkalian) dilakukan pada banyak elemen matriks. Karena operasi matriks dipakai di banyak bidang, maka tumbuhlah penggunaan GPU untuk banyak bidang (terutama keilmuan) selain grafis ini.

Vendor GPU seperti NVidia dan AMD dan penyedia sistem operasi seperti Microsoft dan Apple juga menyadari potensi ini, dan mendukungnya dengan merilis API dan SDK untuk menggunakan GPU untuk komputasi umum sejak sekitar tahun 2005. Kita akan bahas ini lebih lanjut di bawah.

Saat ini penggunaan GPU untuk komputasi umum (GPGPU) sudah sangat banyak. Di bidang pembelajaran mesin misalnya, hampir semua framework pembelajaran mesin mendukung eksekusi pada GPU: TensorFlow, PyTorch, MXNet, Caffe, Torch, Theano, CNTK [5][6]. Yang tidak atau belum mendukung GPU misalnya scikit-learn dan mlpack.

Kita akan meninjau lebih jauh GPGPU dari berbagai aspek di artikel ini dan artikel-artikel mendatang.

Keunggulan GPU

Untuk selanjutnya, kita akan anggap GPU sama dengan GPGPU, oleh karena itu istilah GPU dan GPGPU akan kita samakan saja dan pakai bergantian, karena secara produk, rasanya sekarang hampir semua GPU modern dari NVidia, AMD, dan Intel sekarang bisa dipakai sebagai GPGPU (untuk produk NVidia, mungkin semua kartu grafik keluaran mulai sekitar tahun 2007 bisa dipakai sebagai GPGPU [9]).

Performansi

Keunggulan yang utama, seperti sudah disinggung di atas, adalah performa yang tinggi dengan harga yang murah. Untuk jenis komputasi GPGPU seperti yang dijelaskan di atas tentunya.

Untuk menganalisis lebih jauh, mari kita bandingkan tiga jenis produk:

  • prosesor Intel Xeon tercanggih (E7-8890 v4) dengan 24 core dan kemampuan hyper-threading (HT)
  • dua produk GPGPU seri Tesla dari NVidia. Seri Tesla adalah produk yang memang ditujukan untuk penggunaan GPGPU, jadi tidak mempunyai output VGA.
    • Tesla V100 adalah produk GPGPU seri Tesla terbaru
    • Tesla K80 adalah produk GPGPU seri Tesla yang yang lebih lama, yang sudah bisa Anda temukan di toko daring terdekat di Indonesia.
  • produk GPU tingkat konsumer:
    • NVidia GeForce GTX 1080, adalah produk kartu grafis NVidia tingkat konsumer yang lumayan canggih  (di atas ini cuma ada GeForce GTX 1080Ti, Titan X, dan Titan XP yang lebih cepat)
    • NVidia GeForce GTX 1050, adalah produk kartu grafis tingkat awal yang tidak terlalu mahal
    • AMD Radeon RX 580, sebagai pengimbang untuk produk non-NVidia. Kartu grafis seri Radeon sangat populer di kalangan penambang mata uang kripto sehingga toko-toko sering kehabisan stok.

Berikut adalah grafik perbandingan performansinya.

flops-cpu-vs-gpu

Seperti terlihat di grafik di atas, untuk performansi komputasi floating point presisi tunggal (FP32), bahkan kartu grafis tingkat awal seperti GTX 1050 seharga 2 jutaan rupiah saja kemampuannya sudah melebihi procesor Xeon tercanggih yang harganya ratusan juta.

Kartu grafis untuk konsumer biasanya memang mempunyai kemampuan komputasi FP32 yang sangat tinggi. Namun seperti terlihat di grafik, kemampuan komputasi floating point presisi gandanya (FP64) biasanya rendah sekali, di mana skor untuk komputasi FP64 biasanya hanya sekitar 3-6% dari skor komputasi FP32. Untuk Radeon 580 bahkan skor FP64-nya tidak tidak diketahui atau mungkin tidak dipublikasikan [7].

Hal ini yang diatasi oleh produk kartu grafis khusus untuk GPGPU, seperti seri Tesla dari NVidia. Untuk kartu seri ini, skor FP64-nya lebih kurang setengah dari skor FP32, mirip dengan karakteristik skor CPU.

Kekurangan lain dari kartu grafis konsumer adalah jenis memory yang digunakan adalah non-ECC (error correcting code), sehingga terdapat kemungkinan komputasi akan menghasilkan hasil yang salah akibat bit memory yang salah. Hal ini mungkin tidak menjadi masalah pada penggunaan untuk tujuan grafis; misalnya ada satu pixel yang salah pada satu frame dari sebuah game yang berjalan di atas 25 FPS, rasanya sama sekali tidak masalah. Tapi kalau hal ini terjadi pada suatu komputasi ilmiah, akibatnya tentu akan lebih serius.

Oleh karena itu maka pada produk kartu GPGPU jenis memory yang digunakan adalah jenis ECC. Untuk produk dari NVidia, memori ECC juga digunakan pada produk kartu grafis seri “serius” yaitu Quadro, yang biasanya ditujukan untuk desainer grafis profesional dan harganya lebih mahal daripada seri GeForce.

NVidia Tesla V100
NVidia Tesla V100

Di lain pihak, penggunaan memori jenis ECC juga mempunyai konsekuensi negatif, salah satunya tentunya adalah biaya yang dikeluarkan akan jauh lebih mahal, karena disamping harga produk GPGPU jauh lebih mahal dari pada GPU level konsumer (akan kita bahas di bawah), penggunaan ECC juga akan mengurangi jumlah memori yang bisa dipakai karena satu bit harus dialokasikan untuk ECC. Kalau Anda tertarik untuk menyimak diskusi tentang ini bisa dilihat di [8].

Harga

Sementara kalau kita bandingkan harganya:

price-gpu-vs-cpu

(catatan: harga diambil dari toko daring terdekat, kecuali V100 dan Xeon yang harganya diestimasikan dari harga ritel di luar negeri)

Terlihat bahwa untuk GPGPU yang serius (K80 dan V100), harganya juga sangat mahal, seharga mobil baru. Demikian juga dengan harga prosesor Xeon tercanggih, harganya di luar jangkauan konsumer kebanyakan.

Tapi di balik harga tersebut, kemampuan yang kita dapat berbeda. Oleh karena itu mari kita tinjau dari harga per kemampuan komputasi yang kita dapatkan.

price-vs-gflops-cpu-vs-cpu

Dari grafik di atas, dapat disimpulkan bahwa walaupun Tesla V100 harganya mahal sekali, tapi dari segi harga per performansi sebenarnya “murah”, paling tidak dibandingkan dengan Xeon. Harga per performansi V100 juga lebih murah dari pendahulunya K80.

Sementara untuk kartu grafis konsumer, boleh dibilang harga per performansinya murah bingits, terutama Radeon. Mungkin itu sebabnya Radeon banyak dicari oleh para penambang mata uang kripto. Tentunya kartu grafis konsumer mempunyai kekurangan-kekurangan yaitu performansi FP64 dan penggunaan memori non-ECC seperti sudah kita bahas di atas.

Skalabilitas

Dari segi skalabilitas, sangat mudah untuk menambah kemampuan pemrosesan GPGPU dari sistem. Tinggal colokin kartu grafis baru saja! Sekali lagi kita ambil contoh dari dunia penambangan mata uang kripto, orang bisa memasang sampai enam kartu grafis di satu komputer untuk mendapatkan rasio performansi dan biaya yang paling optimal. Di atas angka ini, katanya sistem menjadi kurang stabil.

Sebaliknya, tidak mudah untuk menambah CPU baru. Jumlah CPU biasanya sudah tetap tergantung motherboard yang kita punya, sehingga untuk menambah CPU baru mau tidak mau kita harus membuat sistem (komputer) baru, dengan banyak komponen yang terduplikasi (rangka, motherboard, memori, hard drive, dsb). Tentu ini menambah biaya. Dan lebih penting lagi, komunikasi antar sistem (komputer) mempunyai latensi dan harga komunikasi lain yang jauh lebih tinggi dari pada komunikasi dalam sistem yang sama.

Penggunaan GPGPU

Penggunaan di Penambangan Mata Uang Kripto

Seperti banyak disebut di atas, salah satu penggunaan yang luas dari GPGPU adalah untuk penambangan mata uang kripto, yang booming mulai sekitar tahun 2011 sampai sekarang. Kita bisa banyak belajar dari komunitas ini tentang banyak hal, misalnya:

  • produk-produk GPGPU apa yang direkomendasikan karena performa, harga, dan kestabilannya,
  • bagaimana menyetel GPGPU agar menghasilkan performa yang maksimal (baca: overclocking) tapi dengan menjaga kestabilan agar bisa berjalan 24/7 selama berbulan-bulan,
  • bagaimana merancang konfigurasi, memilih komponen komputer, dan membuat sistem (komputer) sendiri

Penggunaan di Pembelajaran Mesin

Bidang pembelajaran mesin adalah bidang lain yang menggunakan GPGPU secara luas. Penggunaan GPGPU sangat menguntungkan karena dapat memercepat waktu pelatihan model secara sangat signifikan. Kemajuan bidang pembelajaran mesin yang melesat beberapa tahun terakhir juga salah satunya diatribusikan oleh meningkatnya kemampuan kecepatan pemrosesan komputer, yang utamanya adalah penggunaan GPU untuk komputasi umum/non-grafis.

Seperti sudah disebut di atas, saat ini boleh dikata semua framework pembelajaran mesin yang ternama pasti mendukung penggunaan GPGPU, misalnya TensorFlow, PyTorch, MXNet, Caffe, Torch, Theano, CNTK [5][6]. Beberapa mendukung penggunaan lebih dari satu GPGPU dan bahkan lebih dari satu komputer untuk pembelajaran pada saat bersamaan.

Penggunaan Lainnya

Salah satu yang menarik yang saya jumpai, yaitu saat ini berkembang trend penggunaan database di GPU. Untuk hal-hal lainnya saya juga kurang tahu.

API

Kalau Anda menggunakan aplikasi atau framework pembelajaran mesin, maka penggunaan GPGPU relatif sudah transparan, alias tidak ada hal khusus yang perlu dilakukan agar program Anda jalan di GPU kecuali paling satu baris kode untuk memerintahkan framework agar programnya jalan di piranti GPU tertentu.

Sedangkan kalau Anda membangun aplikasi sendiri dari nol, maka ada lebih banyak pilihan API untuk mengakses GPGPU.

CUDA

CUDA adalah API dan SDK yang dibuat oleh NVidia untuk melakukan GPGPU pada kartu grafis buatan NVidia [10]. API CUDA dirilis pertama pada tahun 2007, dan disediakan untuk pemrograman C/C++ dan Fortran. Komunitas kemudian membuat binding untuk bahasa pemrograman lain, misalnya PyCUDA untuk Python [11].

NVidia adalah raja pembuat GPGPU, maka CUDA adalah “bahasa nasional” untuk GPGPU. Paling tidak untuk bidang pembelajaran mesin, TensorFlow, MXNet, PyTorch, Torch, dan CNTK semuanya menggunakan API CUDA untuk akses GPUnya (untuk framework yang lain saya belum pelajari, tapi kemungkinan besar sama).

Dengan kata lain, boleh dibilang penggunaan GPGPU pada bidang pembelajaran mesin secara eksklusif hanya mendukung perangkat keras grafis dari NVidia (ada sih usaha untuk membuat TensorFlow bisa memakai piranti grafis dari AMD, lihat OpenCL di bawah).

OpenCL

OpenCL adalah API untuk melakukan pemrograman paralel pada CPU, GPU, DSP, FPGA, dan piranti akselerator lain [12]. Awalnya dibuat oleh Apple, lalu pengembangannya selanjutnya dilakukan oleh konsorsium non-profit yaitu Khronos Group, yang didukung oleh perusahaan-perusahaan ternama seperti Altera, AMD, Apple, ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx, and ZiiLABS.

Kelebihan OpenCL adalah mendukung pemrograman paralel untuk banyak macam piranti, termasuk piranti grafis buatan NVidia sendiri. Dengan demikian maka kita tidak terkunci oleh piranti buatan satu perusahaan saja.

Kelebihan lain, kalau Anda pengguna MacOS maka OpenCL sudah terpasang di komputer Anda (sejak MacOS 10.7), sehingga bisa langsung digunakan. Saya sudah mencoba ini, dan lumayan, bisa menjalankan program di CPU dan GPU Intel Iris di Macbook Pro.

Untuk TensorFlow, kabarnya ada upaya untuk menambah fitur agar bisa menggunakan GPU non-NVidia dengan memakai OpenCL, tapi saya kurang mengikuti perkembangannya. Silakan Anda melihat [13].

DirectCompute

DirectCompute adalah API yang dibuat oleh Microsoft untuk melakukan GPGPU, merupakan bagian dari DirectX dan bertujuan sama seperti API direct-direct yang lain seperti DirectShow, DirectSound, dsb., yaitu mendekatkan diri pada perangkat keras.

API ini sudah ada sejak lama, pertama dirilis dengan Windows 7 di tahun 2009, dan katanya perkembangannya kurang bagus [14]. Saya sendiri tidak punya pengalaman sama sekali dengan API ini jadi tidak bisa menjelaskan lebih lanjut.

API Lainnya

  • OpenACC [https://www.openacc.org/]: pemrograman paralel berbasis direktif (dengan menggunakan #pragma untuk mengatur eksekusi paralel) yang bisa dilakukan di CPU dan GPU.
  • OpenMP [http://www.openmp.org/]: pemrograman paralel berbasis direktif juga, yang mendukung eksekusi di GPU dengan rilis OpenMP 4.0. OpenMP juga mendukung paralelisme di lebih dari satu node komputer.
  • GPUOpen [https://gpuopen.com/]: API dan SDK oleh AMD untuk pemrograman grafis untuk bersaing dengan NVidia. Tidak seperti NVidia, API dan SDK ini dikembangkan secara Open Source.
  • Matlab juga mendukung eksekusi paralel dengan GPGPU.

Di artikel mendatang akan kita pelajari pemrograman GPGPU secara lebih mendetil, mengukur manfaatnya dari segi kecepatan pemrosesan, termasuk pada framework pembelajaran mesin, dan melakukan pembandingan kecepatan dari masing-masing metoda pemakaian GPGPU ini.

Referensi

  1. https://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units
  2. https://www.intel.com/content/www/us/en/products/processors/xeon/e7-processors.html
  3. https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units
  4. https://stackoverflow.com/questions/36681920/cpu-and-gpu-differences/36812922#36812922
  5. T.Chen dkk – MXNet: A Flexible and Efficient Machine Learning Library for Heterogeneous Distributed Systems [pdf]
  6. https://github.com/Microsoft/CNTK
  7. https://en.wikipedia.org/wiki/AMD_Radeon_500_series
  8. https://devtalk.nvidia.com/default/topic/909860/computing-the-probability-of-ecc-errors-on-a-gtx-gpu/?offset=3
  9. https://www.geforce.com/hardware/desktop-gpus
  10. https://en.wikipedia.org/wiki/CUDA
  11. https://mathema.tician.de/software/pycuda/
  12. https://en.wikipedia.org/wiki/OpenCL
  13. https://github.com/tensorflow/tensorflow/issues/22
  14. https://www.codedivine.org/2013/07/25/directcompute-from-an-opencl-and-cuda-perspective/
  15. http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
Iklan

2 respons untuk ‘Mengenal General Purpose Programming pada GPU (GPGPU) – [Bag. 1]

Add yours

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Blog di WordPress.com.

Atas ↑

%d blogger menyukai ini: