content:
Mengenal dan Membandingkan Berbagai Pemrograman Paralel pada CPU dan GPU [GGPU – Bag. 2] – Belajar Pembelajaran Mesin Indonesia
Lanjut ke konten
Cari
Cari untuk:
Belajar Pembelajaran Mesin Indonesia
IndoML.com
Menu
Home
Daftar Isi
Berdasarkan Topik
Data Science
Deep Learning
Machine Learning
Reinforcement Learning
Finansial
Kalkulus
Statistika
Pemrograman
Visualisasi
Perangkat Keras
Berdasarkan Tingkatan
0. Persiapan
1. Pemula
2. Menengah
3. Ahli
Berdasarkan Format
Artikel
Buku
Catatan Kuliah
MOOC
Kursus Online
NanoDegree/MicroMasters
Video
Kaggle
Berdasarkan Bahasa
C/C++
Python
R
Matlab/Octave
Berdasarkan Nilai Ulasan
☆
☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
Cheatsheets
All Cheatsheets
Student Notes: Convolutional Neural Networks (CNN) Introduction
Neural Networks and Deep Learning
Reinforcement Learning – An Introduction
Intro to Descriptive Statistics
Contact
About
Buka Pencarian
Mengenal dan Membandingkan Berbagai Pemrograman Paralel pada CPU dan GPU [GGPU – Bag. 2]
Di artikel sebelumnya Mengenal General Purpose Programming pada GPU (GPGPU) – [Bag. 1] kita sudah membahas kemampuan, manfaat, dan sedikit gambaran tentang cara melakukan pemrograman umum pada GPU. Di artikel ini kita akan melihat secara lebih detil bermacam cara pemrograman umum pada GPU dan juga pemrograman paralel pada CPU sekaligus kita bandingkan performansinya masing-masing.
Tujuan saya melakukan ini adalah mencari pertimbangan untuk memutuskan platform, bahasa pemrograman, dan API/librari apa yang nanti saya pakai untuk proyek pembelajaran mesin saya.
Tujuan
Dari segi platform, tentu saya ingin mengetahui seberapa besar manfaat yang kita dapat dengan menggunakan GPU. Di artikel sebelumnya sudah dipaparkan spesifikasi performansi di atas kertas, dan kali ini kita akan ukur perbedaannya secara riil di program kita.
Selain itu ada pilihan sistem operasi, yaitu Linux dan Windows. Kalau MacOS sepertinya kurang sesuai, paling tidak buat saya, karena GPU secara fisik bentuknya adalah kartu PCI-X sehingga harus punya komputer Apple yang berupa desktop atau server dan agak susah menjustifikasi investasinya. Kecuali kalau hanya untuk menjalankan dengan CPU, untuk pengembangan kode atau sekedar coba-coba, maka bisa pakai MacBook.
Berikut adalah tabel dukungan sistem operasi dari librari-librari pembelajaran mesin terkenal:
Linux Windows MacOS Lainnya
TensorFlow ✓ ✓ ✓ Android, iOS
PyTorch ✓ ✓ ✓
MXNet ✓ ✓ ✓ Raspberry Pi
CNTK ✓ ✓
Theano ✓ ✓ ✓
Caffe ✓ ✓ ✓
scikit-learn ✓ ✓ ✓ NetBSD
Menurut pengamatan saya, walaupun Windows didukung, tapi dukungannya tidak sebagus Linux. Misalnya saat ini, TensorFlow dan MXNet terbaru yang mendukung CUDA 9 hanya baru dirilis di Linux.
Dari segi bahasa pemrograman, karena saya fasih memakai Python dan C++, maka dua bahasa inilah yang menjadi perhatian utama saya. Python jelas adalah bahasa utama untuk pembelajaran mesin. Kalau Anda memilih Python maka rasanya Anda berada di jalan yang benar. Tapi C++ dengan standard barunya C++-11 sepertinya sangat mengasyikkan dan menarik untuk dipakai, jadi sebenarnya saya agak-agak mencari justifikasi agar bisa memakai C++.
Berikut adalah tabel dukungan bahasa dari berbagai librari pembelajaran mesin. Sepertinya dukungan paling luas memang untuk Python dan C++.
Python C++ Java Lainnya
TensorFlow ✓ ~ ~ Go
PyTorch ✓ ~
MXNet ✓ ✓ R, Julia, Scala, Perl
CNTK ✓ ✓ ~ C#, BrainScript
Theano ✓
Caffe ✓ ✓
scikit-learn ✓
(catatan: tanda ~ artinya hanya mendukung sebagian)
Dari segi librari, saya relatif belum familiar dengan librari apapun, jadi tidak ada preferensi untuk memilih salah satu karena semua harus belajar dari awal. Tapi perhatian utama saya adalah TensorFlow dan PyTorch, karena dua inilah yang mempunyai dukungan terbesar baik dari industri maupun komunitas (TensorFlow dibuat oleh Google dan PyTorch oleh Facebook). Tapi MXNet juga menarik karena mendukung C++ dan ada dukungan dari Amazon (bisa dijalankan di AWS). Sedangkan Theano kurang menarik karena penciptanya mengatakan tidak akan melanjutkan pengembangannya lagi, dan CNTK dari Microsoft kurang menarik karena rasanya tidak memberikan hal baru dari yang diberikan TensorFlow dan PyTorch (kecuali kalau Anda memakai C# atau .NET, maka CNTK adalah pilihan utama Anda). Tapi ini hanya sekedar perasaan dan tidak didasari penelitian apapun. Kalau Caffe saya belum meneliti.
Saya juga mengesampingkan beberapa librari dengan pertimbangan sebagai berikut:
scikit-learn: librari pembelajaran mesin yang cukup lengkap di Python, dengan bimbingan yang sangat banyak (dokumen, kursus, buku-buku). Sayangnya tidak mendukung GPU.
deeplearning4j: mungkin librari pembelajaran mesin yang paling lengkap untuk Java. Mendukung GPU juga.
mlpack: sekilas sepertinya cukup lengkap dan keren (mendukung reinforcement learning dan memakai idiom C++ moderen seperti template), tapi hanya C++ dan tidak mendukung GPU.
Dengan pertimbangan-pertimbangan di atas, kita akan melakukan percobaan dan pengukuran untuk menjawabnya. Kita akan melihat dari beberapa dimensi:
CPU vs GPU: membandingkan program yang sama dijalankan di CPU dan GPU
Python vs skrip vs C++: membandingkan performansi bahasa Python vs bahasa skrip lainnya vs C++
loop vs tervektorisasi (vectorized): membandingkan implementasi dalam bentuk loop dan yang tervektorisasi
Windows vs Linux: semua di atas, dibandingkan di Linux dan Windows , dijalankan di komputer yang sama (dual boot).
Kita akan membandingkan beberapa bahasa pemrograman dan librari:
librari C++: CUDA, OpenCL, OpenMP
bahasa pemrograman skrip: Python, Java, R, Octave, Julia
librari pembelajaran mesin: PyOpenCL, TensorFlow, MXNet
Pertanyaannya tentunya, tes apa yang pas dan cukup representatif, bisa berjalan di semua platform, dan tidak terlalu sulit untuk dilakukan?
SAXPY Benchmark
Berawal dari ide di artikel Six Ways to SAXPY, akhirnya saya buat SAXPY Benchmark, yang bisa Anda clone di https://github.com/bennylp/saxpy-benchmark. SAXPY adalah Single Precision A * X Plus Y, yaitu:
Y = A * X + Y
SAXPY dipilih karena kalkulasi ini umum dilakukan, dan mudah diimplementasikan di berbagai bahasa, baik menggunakan loop maupun tervektorisasi:
Loop:
for i=1 to N:
   y[i] += A * x[i]
Tervektorisasi:
   // Y = array[N]
   // X = array[N]
   Y += A * X
Sedangkan kekurangannya adalah, karena kalkulasi yang dilakukan begitu sederhana, maka porsi yang signifikan dihabiskan untuk mengakses memori.
Untuk N, saya set N=2^26, atau 64 mega, tepatnya 67108864. Pertimbangannya adalah agar eksekusinya tidak terlalu cepat atau lambat, dan jangan memakai terlalu banyak memori.
Untuk semua tes, hanya waktu kalkulasi SAXPY yang dihitung. Operasi lain seperti alokasi/dealokasi memori, inisialisasi array, transfer memori antara host dan GPU jika ada, dan verifikasi hasil tidak dimasukkan dalam pengukuran waktu.
Untuk setiap tes akan diulang berkali-kali (10-20 kali) dan 5 hasil terbaik akan dicatat dan diambil rata-ratanya. Kadang-kadang tes juga saya ulang di lain waktu untku melihat apakah bisa mendapatkan hasil yang lebih cepat.
Tes-tes dilakukan di satu komputer desktop yang dual-boot Windows dan Linux, dengan spesifikasi sbb:
Ubuntu 16.04
Windows 10
Host Intel i7-6700 3.4 GHz, 4 core HT, 16 GB RAM
GPU NVidia GeForce GTX 1080 8GB
OS Ubuntu 16.04 64bit Windows 10 64bit
C++ g++ 5.4.0 Visual Studio 2015 C++
CUDA 9.0 8.0
OpenCL
Khronos header 1.2
Intel driver 16.1.1
NVidia driver 1.2
Intel SDK 7.0.0.2519
OpenCL from CUDA SDK
OpenMP bawaan kompiler bawaan kompiler
Python 3.5.2 3.5.3 64bit
Java Oracle JDK SE 1.9.0.1 Oracle JDK SE 1.8.0_9
Octave 4.0.0 64bit 4.2.1 64bit
R 3.2.3 64bit 3.4.2 64bit
Julia 0.6.1 64bit 0.6.1 64bit
TensorFlow 1.4 CUDA 9.0 1.3 CUDA 8.0
MXNet mxnet-cu90 (0.12.1) mxnet-cu80 (0.12.0)
PyOpenCL 2015.1 2017.2
Dengan spesifikasi dan keterbatasan di atas, mari kita mulai!
Vektorisasi
Sebelum masuk ke pemrograman paralel, ada satu idiom yang penting untuk dipahami dalam pemrograman numerik. Dalam setiap kesempatan, kita selalu disarankan untuk menghindari loop dan memakai implementasi yang tervektorisasi, artinya implementasi yang menggunakan operasi vektor atau matriks (atau array), seperti pada contoh SAXPY di atas. Tujuannya adalah agar operasi dapat berjalan dengan lebih cepat.
Kita akan tinjau misalnya di Python. Di Python, SAXPY bisa kita implementasikan sebagai loop atau dengan Numpy. Implementasi dengan versi loop dapat Anda lihat di kode asal saxpy_loop.py, yang isi garis-besarnya kurang lebih adalah sebagai berikut.
(catatan: untuk kode-kode di bawah, AVAL, XVAL, dan YVAL adalah konstanta random)
x = [XVAL] * N
y = [YVAL] * N
for i in range(N):
    y[i] += AVAL * x[i]
Di Python, Numpy adalah librari fundamental untuk komputasi numerik dan sains. Implementasi tervektorisasi dengan Numpy dapat Anda lihat di kode asal saxpy_numpy.py yang isi garis-besarnya kurang lebih adalah sbb:
import numpy as np
x = np.zeros(N, dtype=np.float32) + XVAL
y = np.zeros(N, dtype=np.float32) + YVAL
y += AVAL * x
Hasil berbandingan waktu eksekusi kedua cara di atas adalah sbb:
Seperti terlihat di grafik di atas, merubah implementasi Python dari loop menjadi operasi vektor dengan Numpy bisa mempercepat eksekusi sebanyak kira-kira 155 kali!
Agar lebih lengkap, dan untuk mengenalkan bentuk grafik yang akan kita pakai dalam artikel ini, berikut adalah perbandingan Python loop vs tervektorisasi di Linux dan Windows (dengan memakai kode asal yang sama seperti di atas, dijalankan di dua sistem operasi di komputer yang sama).
Terlihat di Windows vektorisasi juga mempercepat eksekusi kurang-lebih 155-160 kali.
Di Windows terlihat performansi Python lebih jelek dari pada di Linux (sekitar 1.6x lebih lambat), baik versi loop maupun Numpy. Untuk sementara ini kita abaikan dulu, nanti akan kita bahas di bawah.
Vektorisasi dengan Python Pandas
Pandas adalah librari yang sangat popular di Python untuk analisis data dengan struktur tabular seperti tabel.
Operasi di Pandas juga tervektorisasi. Untuk SAXPY, implementasi lengkapnya dapat Anda lihat di kode asal saxpy_pandas.py yang isi garis-besarnya kurang lebih adalah sbb:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.zeros((N, 2), dtype=np.float32),
                  columns=["y", "x"])
df.x = XVAL
df.y = YVAL
df.y += AVAL * df.x
Berikut adalah perbandingan performansi antara Pandas dan Numpy.
Ternyata ada perbedaan performansi yang signifikan (sekitar 4x lipat) antara Pandas dan Numpy.
Vektorisasi di Bahasa R
Bahasa R adalah bahasa untuk komputasi numerik dan grafik yang dipakai secara luas di bidang statistika, sains data, dan finansial. Untuk bidang-bidang ini mungkin pemakaiannya bahkan lebih luas dari pada Python.
Bahasa R mendukung eksekusi di GPU dengan API CUDA dan kompilasi kode secara JIT (just in time) menjadi byte-code.
Perlu juga dicatat bahwa R tidak mempunya tipe data floating point dengan presisi tunggal (FP32), sehingga operasinya akan lebih lambat.
Idiom vektorisasi juga terbukti meningkatkan performansi di bahasa R. Berikut kita bandingkan implementasi dalam bentuk loop (saxpy_loop.R) dengan beberapa tipe data vektor di R:
array: vektor satu dimensi (saxpy_array.R)
matrix: tipe data tabular dua dimensi (saxpy_matrix.R )
data.frame: tipe data dengan fungsionalitas sama seperti matrix (saxpy_dataframe.R)
data.table: tipe data dengan fungsionalitas sama seperti data frame (saxpy_datatable.R)
Terus terang saya kurang memahami perbedaan detil antara tipe-tipe data ini. Saya hanya melihat ada beberapa tipe data yang mirip-mirip dan saya ingin membandingkan performansinya.
Berikut adalah hasilnya.
Seperti di Python, vektorisasi di R juga akan mempercepat eksekusi secara signifikan. Paling parah adalah loop di Linux, yang entah kenapa memakan waktu 75 detik, padahal loop yang sama di Windows hanya 5 detik. Kalau ini kita abaikan, maka penggunaan tipe data tervektorisasi tercepat (dalam hal ini array atau data.frame) akan mempercepat eksekusi kurang lebih 35x.
Python vs Skrip Lain vs Java vs C++
Octave
Octave adalah bahasa pemrograman berorientasi matematika dengan sintaks kompatibel dengan Matlab. Sangat populer di bidang sains, dan banyak disarankan sebagai sarana untuk membuat purwarupa model pembelajaran mesin karena sintaksnya lebih mudah.
Julia
Julia diklaim sebagai bahasa pemrograman tingkat tinggi dengan performa tinggi untuk komputasi numerik. Bahasa ini mengunggulkan kecepatannya yang lebih cepat dari bahasa-bahasa skrip lain dan Java (lihat di halaman depan laman julialang.org), dan mendukung eksekusi paralel baik dengan CPU atau GPU. Untuk pembelajaran mesin di Julia dapat memakai MXNet.
Java
Java tentu semua sudah tahu. Saya ikutkan di sini sebagai komparasi. Dan ternyata hasilnya cukup mengejutkan.
~~~~~
Berikut grafik perbandingan performansi eksekusi non-paralel dari:
Python Numpy (saxpy_numpy.py)
bahasa R tervektorisasi dengan menggunakan array (saxpy_array.R)
Octave tervektorisasi (saxpy.m)
Java loop (SaxpyLoop.java)
Julia tervektorisasi (saxpy_array.jl) dan loop (saxpy_loop.jl)
C++ loop (saxpy_cpu.cpp)
Ternyata R dan Octave tidak lebih cepat dari pada Numpy, walaupun kadang orang mengklaim begitu. Kecepatan Numpy lumayan, di Linux, hanya 2.1x lebih lambat dari pada kode natif C++ (kalau di Windows 3.4x). Dengan demikian kalau ada yang mengklaim kecepatan Numpy mendekati kecepatan natif, maka itu juga tidak benar.
Performansi Java sangat bagus, kecepatannya hanya lebih lambat 10-15% dibandingkan C++.
Namun yang mengejutkan adalah Julia, yang kecepatannya bisa sama dengan C++, bahkan bisa lebih cepat! Sejujurnya, tadinya untuk kompilasi C++ saya pakai opsi optimisasi seadanya (-O3 di gcc atau /Ox di msvc). Tapi dengan opsi ini ternyata kecepatannya kalah dibanding Julia! Oleh karena itu kemudian opsinya saya maksimalkan lagi agar lebih cepat.
Devektorisasi Julia
Hasil pada Julia menunjukkan fenomena menarik dan berkebalikan dengan idiom vektorisasi di bahasa-bahasa lain, yaitu kecepatan implementasi loop di Julia malah justru lebih cepat dari implementasi tervektorisasi. Agar lebih jelas, berikut saya tampilkan lagi perbandingan performansi implementasi dalam loop dan vektor, dibandingkan dengan C++.
Julia memang akan mengkompilasi kode kita menjadi kode mesin dengan kompiler JIT (just in time). Julia juga menyediakan beberapa instruksi tingkat bawah pada kode asal kita agar kompiler dapat mengoptimasi secara lebih baik. Berikut adalah kutipan kode asal SAXPY untuk Julia loop. Anda bisa melihat kode asal lengkapnya di file saxpy_loop.jl.
function saxpy( a, x, y )
    @simd for i=1:length(x)
        @inbounds y[i] += a*x[i]
    end
end
Instruksi untuk membantu optimisasi kompiler dapat Anda lihat di kutipan di atas (yaitu @simd dan @inbound). Ini bisa menjadi fitur plus atau minus dari Julia. Plusnya kita punya fasilitas untuk mengontrol optimasi, sedang minusnya adalah perhatian kita jadi terpecah untuk melakukan optimasi tingkat bawah, sesuatu yang harusnya dilakukan kompiler.
Dengan performansi yang begitu bagus untuk versi loop, sangat disayangkan bahwa versi vektornya lambat. Tapi Julia saat ini masih terus dikembangkan (sekarang masih versi 0.6.1) dan semoga performansinya akan lebih baik di versi-versi berikutnya.
Librari Pembelajaran Mesin Python
Sekarang kita akan menggunakan librari pembelajaran mesin untuk melakukan operasi array. Penggunaan librari ini memungkinkan kita untuk mengeksekusinya di GPU nanti.
Perbandingan performansi operasi array menggunakan Numpy (saxpy_numpy.py) dan TensorFlow (saxpy_tf.py) dan MXNet (saxpy_mxnet.py) di CPU adalah sebagai berikut.
Sesuai grafik di atas, kalau hanya melakukan operasi numerik sederhana seperti SAXPY, librari pembelajaran mesin lebih lambat dari pada memakai Numpy. Mungkin karena pekerjaan yang dilakukan librari tersebut terlalu canggih, yang ongkosnya lebih tinggi dari pada melakukan SAXPY secara langsung. Tapi ini hanya tebakan saja.
Catatan tentang Performansi Windows
Mungkin Anda bertanya-tanya dari tadi, kenapa performansi di Windows hampir selalu lebih buruk dari pada di Linux. Saya belum menyelidiki apakah memang perbedaan performansi ini memang sudah “dari sononya”. Tapi yang jelas kondisi Windows saya, karena sudah dipakai beberapa tahun, sudah banyak sekali isinya. Saya sudah berusaha mematikan sebanyak mungkin program ketika menjalankan pengukuran, namun masih ada puluhan proses lain yang saya tidak tahu juga apa saja yang masih berjalan.
Sedangkan Linux saya baru saja dibangun.
Disamping itu ada perbedaan kompiler, versi program, dan librari, karena perbedaan ketersediaannya. Harusnya perbedaan ini tidak berpengaruh sih, karena tesnya sangat sederhana.
Dengan perbedaan kedua sistem seperti ini, maka perbedaan pada hasil ini jangan dijadikan sebagai referensi yang terlalu serius. Saya sarankan Anda mencoba sendiri SAXPY benchmark di sistem Anda.
Operasi Array pada Python dengan GPU
Seperti dikatakan di atas, penggunaan librari pembelajaran mesin pada Python memungkinkan eksekusi pada GPU. Mari kita lihat perbedaan hasilnya antara eksekusi di CPU dan GPU dengan librari-librari ini.
Sebagai catatan, percobaan ini dilakukan dengan GPU NVidia GeForce GTX 1080. Untuk penggunaan GPU lain tentu hasilnya akan lain. Kode sumber yang dipakai sama dengan untuk versi CPU di atas, yaitu saxpy_numpy.py (Numpy), saxpy_tf.py (TensorFlow) dan saxpy_mxnet.py (MXNet), tinggal dikasi argumen berbeda.
Seperti terlihat, di Linux, librari tercepat di GPU (MXNet) bisa mempercepat eksekusi 6x dibanding eksekusi tercepat di CPU (Numpy). Ironisnya, MXNet jalannya paling lambat kalau di CPU, hampir 3x lipat dari Numpy.
Untuk TensorFlow tidak ada perbedaan kecepatan yang berarti pada eksekusi di GPU antara di Linux dan Windows. Harusnya memang begitu, karena eksekusi di GPU relatif bebas dari pengaruh “junk” yang berjalan di host, jadi mestinya hasilnya lebih konsisten.
Tapi untuk MXNet, ternyata perbedaannya cukup besar, sekitar 2.9x lebih lambat di Windows (sekali lagi walaupun eksekusinya di GPU yang sama). Dalam hal ini, salah satu perbedaan yang mungkin berpengaruh adalah versi CUDA (librari komputasi GPU dari NVidia) yang dipakai MXNet di kedua platform berbeda. Windows memakai CUDA 8.0, sedangkan Linux memakai CUDA 9.0. Mungkin ini penyebabnya, atau ada penyebab lain, tidak jelas. Anehnya perbedaan ini juga ada di TensorFlow, tapi toh performansinya hampir sama.
Python GPU vs C++ CPU
Kita bandingkan kecepatan librari Python GPU tadi dengan loop C++ yang berjalan di CPU.
Librari Python dengan GPU berhasil mengalahkan loop sederhana C++ di CPU.
Tapi peningkatan kecepatannya rasanya kurang maksimal. Librari GPU tercepat dengan Python (MXNet) hanya 2.9x lebih cepat dari loop C++. Padahal sudah memakai GPU yang lumayan canggih dan mahal (GTX 1080 termasuk kartu grafis konsumer papan atas). Padahal sudah memakai librari yang state-of-the-art, melawan program C yang bodo-bodoan. Apalagi kalau memakai TensorFlow, maka hanya lebih cepat 1.2x.
Sepertinya kita harus menggali lebih dalam.
Pemrograman Paralel CPU dan GPU dengan C++
Untuk pemrograman GPU dengan C++, kita akan meninjau tiga librari.
CUDA
Dalam kemasan SDK yang dibuat NVidia untuk mengakses GPU, CUDA adalah API di tingkat yang paling bawah. Selain itu, kemasan juga berisi librari-librari tingkat yang lebih tinggi misalnya operasi aritmetika (BLAS), pemrosesan sinyak, dan jaringan syaraf tiruan (neural network).
Contoh program CUDA yang sederhana bisa Anda lihat di kode asal program SAXPY untuk CUDA, yaitu file saxpy_cuda.cpp. Kode asalnya hanya sekitar 50 baris sehingga cukup mudah untuk diikuti. Perintah untuk mengkompilenya dapat Anda lihat di Makefile.
OpenCL
OpenCL adalah librari untuk pemrograman paralel baik untuk CPU, GPU, DSP, FPGA, dan piranti akselerator lain. Kelebihan OpenCL adalah dukungan untuk jenis perangkat keras yang lebih banyak (misalnya CPU dari Intel dan kartu grafis AMD), selain kartu grafis NVidia juga, jadi menggunakan ini akan membuat program kita lebih portabel.
Contoh program C++ OpenCL yang sederhana bisa Anda lihat di kode asal SAXPY untuk OpenCL yaitu file saxpy_ocl1.cpp. Perintah untuk mengkompilenya dapat Anda lihat di Makefile. Kalau Anda ingin melihat implementasi SAXPY dalam OpenCL dalam bahasa C, bisa dilihat di file saxpy_ocl2.cpp. File ini jauh lebih panjang dari pada versi C++.
OpenMP
OpenMP (Open Multi-Processing) adalah salah satu spesifikasi pemrograman paralel yang paling lama. Versi 4 dari spesifikasi OpenMP mendukung pemrograman GPU. Namun untuk percobaan kita, saya hanya mencoba paralelisme di CPU, karena untuk eksekusi di GPU sepertinya kita harus kompile sendiri gcc versi trunk.
Kompiler-kompiler baru sudah mendukung OpenMP. Saya mencoba dengan gcc 5.4 dan Visual C++ 2015, dukungan OpenMP sudah ada dan tinggal memberi opsi -fopenmp dan /fopenmp untuk mengaktifkannya di kedua kompiler tersebut. Untuk di MacOS, kompilernya juga sudah mendukung OpenMP, tapi ada librari lagi yang harus diunduh.
OpenMP adalah pemrograman berbasis direktif. Perintah-perintah untuk OpenMP diberikan dalam #pragma omp seperti contoh berikut dari loop di kode asal SAXPY. Anda bisa melihat kode asal lengkapnya di file saxpy_omp.cpp.
#pragma omp parallel
{
    int num_threads = omp_get_num_threads();
    for (int i=omp_get_thread_num(); i<N; i+=num_threads)
        y[i] += AVAL * x[i];
}
Dibanding dengan CUDA dan OpenCL, maka pemrograman paralel OpenMP tingkatnya lebih tinggi sehingga lebih mudah dipakai. Namun kekurangannya adalah dia terasa seperti “bahasa dalam bahasa” (yaitu bahasa direktif di dalam bahasa C/C++) dan sifat direktif yang lebih implisit (misalnya direktif di atas kalau dikompile di kompiler yang tidak mendukung OpenMP maka akan diabaikan) membuat kita harus lebih berhati-hati agar program berjalan seperti yang kita inginkan.
Yang Tidak Dicoba
Satu yang tidak sempat saya coba adalah OpenACC (Open Accelerators), sebuah model pemrograman berbasis direktif (seperti OpenMP) untuk permrograman paralel secara portabel di CPU, GPU, dan piranti akselerator lain. Dukungan untuk OpenACC sepertinya masih kurang. GCC misalnya, hanya ada dukungan eksperimental di GCC 7. Visual C++ tidak/belum mendukung OpenACC.
C++ Paralel di CPU
Kita akan coba dulu di CPU. Kode sumber untuk SAXPY OpenCL dan OpenMP sama baik untuk eksekusi di CPU dan GPU (kalau CUDA hanya bisa jalan di GPU), cukup hanya diberi argumen cpu atau gpu untuk mengaturnya. Harapan saya dengan menggunakan OpenCL dan OpenMP eksekusinya akan lebih cepat dibanding loop C++ biasa, karena CPU saya punya 4 core, dengan hyper-threading maka bisa ada 8 eksekusi paralel yang bisa dijalankan.
Ternyata hasilnya tidak seperti yang diharapkan. Dari kedua librari tadi tidak satupun yang bisa mempercepat eksekusi program.
Penyebabnya mungkin karena operasinya terlalu sederhana, jadi overhead untuk membuat eksekusi paralel lebih besar dari pada kalau menjalankan operasinya sendiri. Jadi untuk mendapatkan paralelisme yang optimal pada CPU, kita harus memecah program kita menjadi task yang lebih besar, mirip kalau kita memecah task untuk multi-threading mungkin. Ini masuk akal karena implementasi paralelisme OpenCL dan OpenMP di sistem operasi umum seperti Windows dan Linux kemungkinan memakai thread.
C++ Paralel di GPU
Selanjutnya mari kita coba bandingkan performansi C++ loop dengan eksekusi di GPU. Kali ini OpenMP yang tidak ikut karena seperti dibahas di atas SAXPY OpenMP saya belum mendukung eksekusi di GPU.
Terlihat peningkatannya sangat signifikan, bisa sampai 13x.
Dan terlihat juga, performansi GPU cukup konsisten, dengan dua API berbeda, di sistem operasi berbeda, perbedaan performansinya hanya 6% maksimum.
PyOpenCL dan PyCUDA
Dengan performansi dan konsistensi CUDA dan OpenCL dari C++ yang cukup menjanjikan, mungkin ada jalan tengah untuk mengakses GPU dari Python, dengan menggunakan API yang lebih low level.
Jalan tengah itu adalah:
PyOpenCL: wrapper Python yang memberikan API OpenCL di Python
PyCUDA: wrapper Python yang memberikan API CUDA di Python
Namun penting untuk diketahui bahwa walaupun kita menggunakan Python, namun fungsi yang dieksekusi di GPU tetap harus dibuat dalam bahasa C (di dalam program Python), yang dikompile oleh PyOpenCL atau PyCUDA ketika program dijalankan. Untuk lebih jelasnya silakan lihat kode sumbersaxpy_pycuda.py dan saxpy_pyocl.py.
PyCUDA
Kode asal untuk pemrograman SAXPY dengan PyOpenCL dapat Anda lihat di file saxpy_pycuda.py. Berikut adalah hasilnya.
Sesuai dengan grafik di atas, performansi PyCUDA sangat mendekati performansi CUDA dengan C++. Perbedaan performansi antara Windows dan Linux menurut saya karena ada bagian yang dieksekusi di host.
PyOpenCL
Kode asal untuk pemrograman SAXPY dengan PyOpenCL dapat Anda lihat di file saxpy_pyocl.py. Berikut adalah hasilnya.
Terlihat konsistensi performansinya cukup membingungkan.
Untuk CPU, kalau C++ OpenCL tidak bisa mempercepat eksekusi, maka PyOpenCL justru bisa mempercepat eksekusi di CPU! Kalau benar begitu dan bukan karena hal lain (misalnya bugs) maka ini cukup menarik untuk diamati.
Di sisi lain, untuk GPU, performansi PyOpenCL sungguh mengecewakan, sangat jauh dari performansi dan konsistensi OpenCL C++ untuk GPU.
Jadi untuk OpenCL dan PyOpenCL, hanya OpenCL C++ untuk GPU yang memberikan performansi yang konsisten.
Kesimpulan
Berikut adalah grafik selengkapnya dari semua percobaan, minus Python loop dan R loop yang terlalu lambat sehingga grafiknya akan merusak skala grafik lain kalau dipasang.
Mudah-mudahan hasil percobaan di atas bisa menambah informasi Anda untuk memilih platform, bahasa, dan API/librari apa untuk dipakai di proyek Anda.
Sekali lagi harap diingat bahwa percobaan ini hanyalah mengukur SAXPY, suatu ekspresi sederhana yang hanya merepresentasikan SAXPY dan tidak untuk dipakai untuk menggeneralisir performansi suatu bahasa, librari, atau sistem operasi.
Untuk artikel selanjutnya kita akan bahas perangkat keras GPU yang bisa kita pakai.
Share this:
Twitter
Facebook
Surat elektronik
Cetak
LinkedIn
Telegram
WhatsApp
Lagi
Tumblr
Pinterest
Pocket
Skype
Menyukai ini:
Suka Memuat...
Diterbitkan oleh Benny Prijono
Lihat semua pos dari Benny Prijono
November 28, 2017
2. Menengah, Artikel, C/C++, Machine Learning, Matlab/Octave, Pemrograman, Perangkat Keras, Python, R
GPGPU, Machine Learning
Navigasi pos
Mengenal General Purpose Programming pada GPU (GPGPU) – [Bag. 1]
Ulasan Buku: Reinforcement Learning: An Introduction, 2nd Edition (Sutton & Barto)
3 respons untuk ‘Mengenal dan Membandingkan Berbagai Pemrograman Paralel pada CPU dan GPU [GGPU – Bag. 2]’
Add yours
fajarlaksono berkata:
April 9, 2018 pukul 22:33
Mantap om…
SukaSuka
Balas
saripudin berkata:
Juni 26, 2019 pukul 16:44
Di tabel dukungan sistem operasi dari librari-librari pembelajaran mesin terkenal, seharusnya PyTorch juga masuk dalam dukungan Windows.. karena bisa juga di install package nya
SukaSuka
Balas
Benny Prijono berkata:
September 19, 2019 pukul 19:09
Iya betul, sekarang sudah bisa. Trims
SukaSuka
Balas
Tinggalkan Balasan ke saripudin Batalkan balasan
Ketikkan komentar di sini...
Isikan data di bawah atau klik salah satu ikon untuk log in:
Email (wajib) (Alamat takkan pernah dipublikasikan)
Nama (wajib)
Situs web
You are commenting using your WordPress.com account.	( Logout / Ubah )
You are commenting using your Twitter account.	( Logout / Ubah )
You are commenting using your Facebook account.	( Logout / Ubah )
Batal
Connecting to %s
Beri tahu saya komentar baru melalui email.
Beritahu saya pos-pos baru lewat surat elektronik.
Δ
Kategori
Berdasarkan Bahasa: (33)
C/C++ (2)
Matlab/Octave (3)
Python (29)
R (8)
Berdasarkan Format: (47)
Artikel (6)
Buku (7)
Catatan Kuliah (5)
Jupyter Notebook (1)
Kaggle (1)
Kursus Online (4)
MOOC (12)
NanoDegree/MicroMasters (11)
Video (3)
Berdasarkan Nilai Review: (35)
☆ (1)
☆☆ (1)
☆☆☆ (11)
☆☆☆☆ (16)
☆☆☆☆☆ (6)
Berdasarkan Tingkat: (47)
0. Persiapan (10)
1. Pemula (20)
2. Menengah (24)
Berdasarkan Topik (46)
Aljabar Linear (2)
Data Science (10)
Deep Learning (10)
Finansial (1)
Kalkulus (1)
Machine Learning (12)
Pemrograman (14)
Perangkat Keras (2)
Reinforcement Learning (6)
Statistika (4)
Visualisasi (1)
Uncategorized (1)
Arsip
Juli 2020 (1)
September 2019 (4)
Agustus 2019 (3)
April 2018 (3)
Maret 2018 (3)
Februari 2018 (6)
November 2017 (2)
Oktober 2017 (3)
September 2017 (2)
Agustus 2017 (15)
Juli 2017 (1)
Juni 2017 (5)
Tag
Actor-Critic AlexNet Andrew Ng Anomaly Detection Anova Bagging Bayesian Learning Boosting CAPM Charles Isbell Chi-Square Clustering CNN Correlation Data-Wrangling Data Science David Silver Decision Trees Deep Learning derivatives Dimensionality Reduction DQN Dyna E-Greedy encoder-decoder Ensemble Feature Selection Feature Transformation Finansial Game Theory Georgia Tech GoogLeNet GPGPU Hypothesis-Testing Inception Information Theory Instance-Based Learning Kaggle KNN Le-Net5 Linear Regression Machine Learning Markov Decision Process matlab Matplotlib Max-Pooling Michael Littman Monte-Carlo MOOC Neural Networks NLP NumPy octave Panda partial derivatives plotting Python PyTorch Q-Learning R Recommender System Reinforcement Learning ResNet Richard Sutton RNN Sarsa sequence model Sharpe Ratio Statistika SVM T-Test Temporal-Difference Tucker Balch VGG Z-Test
Cari untuk:
Berlangganan ke Blog via Email
Masukkan alamat surel Anda untuk berlangganan blog ini dan menerima pemberitahuan tulisan-tulisan baru melalui surel.
Bergabunglah dengan 59 pengikut lainnya
Alamat Email:
Berlangganan
Follow Belajar Pembelajaran Mesin Indonesia on WordPress.com
My Sites
PJSIP
Quant.id
Retailogi
Stocks Asia
Stosia
Buat situs web atau blog gratis di WordPress.com.
Atas ↑
Privasi & Cookie: Situs ini menggunakan cookie. Dengan melanjutkan menggunakan situs web ini, Anda setuju dengan penggunaan mereka.

label: ja

label: ceb

label: it


content: 7 Golongan Yang Akan Mendapatkan Naungan Allah naungan Allah, pada hari dimana tidak ada naungan selain naungan-Nya 0

warc-identified-content-language: msa

warc-type: conversion

content-type: text/plain

label: id


content:
Permainan judi slot online mampu dimainkan dengan benar dan membawa banyak keuntungan selama masa taruhan judinya, yang mesti dijalani oleh semua pemain adalah dengan bergabung di dalam website slot online terbesar di dunia yang luar biasa dan mempunyai kualitas yang terjamin. Bila pemain judi sudah bergabung di dalam website ini, dipastikan senantiasa betah dan tidak sempat membuat pemain judi merasa bosan buat senantiasa melanjutkan taruhan judinya setiap harinya di sini.
Bagi pemain judi agar Memang bergabung dalam situs agen slot yang asli dan terpercaya sepenuhnya wajib tahu terlebih dahulu mana situs yang asli dan mana website yang selalu membuat pemain judi rugi belaka. Maka games judinya terjadi sesuai dengan apa yang sudah di desain selama ini.
3 Panduan Menemukan Website Cara Daftar Joker123 Terpercaya dan Terbesar
Biar web agen slot yang dipilih asli dan tidak ada penipuan sama sekali, pemain judi wajib sudah memegang pedoman pemerolehan situs agen slot yang resmi dan asli. Tata cara yang mampu menunjukkan pada tipe tempat yang bisa mengambil taruhan judinya tanpa ada rintangan tapi hanya keuntungan yang ada di dalamnya. Di bawah ini selengkapnya:
Petunjuk yang Pertama dalam proses pemerolehan web yang benar, pemain judi wajib menentukan bahwa website yang diambil merupakan yang paling baik dibandingkan dengan Lainnya Hal ini bisa diliat dengan sejumlah member judi yang tergabung dan selalu memainkan judi secara aktif sehingga kegiatan dalam bertarung judi selalu beri dukungan pemain untuk bertarung judi di sini. Bahkan menarik perhatian pemain judi lain utk segera bergabung di dalam situs slot online paling besar di dunia ini saja jangan yang Lainnya Bagi pemain judi yang sudah menemukan web agen seperti ini tidak butuh ragu lagi utk mendaftarkan diri di sini.
Panduan yang Kedua dalam mendapatkan suatu website yang benar dan selalu membuat pemain merasa suka dalam taruhannya, maka wajib tentukan bahwa beliau telah mempunyai permainan yang bisa dimainkan kapan pun dan dalam kondisi apapun itu. Games judinya jumlah tidaklah sedikit. Sehingga pemain judi tinggal memilih saja judi online yang akan dijalaninya. Dijamin dengan memakai satu akun dari pemain judi bisa memakai seluruh games judi yang ada di dalamnya. Pemain pun selalu betah dan tidak pernah merasa bosan bertarungnya.
Di dalamnya juga telah didorong dengan sistem yang tersusun dan pemain judi bisa menggunakan dalam taruhan judinya. Keamanan di sini juga membuat member tidak sempat ada kesukaran dan membuat permainan judinya berjalan dengan mudah. Sehingga permainan judinya berlangsung dengan nyaman dan senantiasa memberi kesempatan kemenangan bagi member judi yang tergabung di dalamnya. Semuanya saja tentu ingin bertarung judi di agen slot ini.
Tips yang Ke3 dalam meraih kategori website judi slot online yang terpercaya wajib memastikan bahwa dirinya yaitu agen paling benar di antara sekian banyak agen yang ada selama ini. Terbaiknya bisa di lihat dari sisi testimony yang dipunyai oleh pihak website ini diisi dan ditulis oleh pihak pemain judi. Dengan adanya testimony ini sudah dipastikan bahwa website itu selalu memberikan keyakinan bagi lemain bahwa situs inilah yang wajib diambil oleh pemain judi biar mampu menikmati taruhan judi dengan lancar dan selalu memperoleh games judi yang selama ini diharapkan.
Dengan menjalankan seluruh tips yang sudah diterangkan di atas dengan benar, maka permainan judinya juga dipastikan berhalan dengan tidak tersendat sebab sudah ada situs slot online paling besar di dunia yang terjamin amannya. Kalau website judi yang dipilih sudah pasti benarnya, pemain judi bisa mengatur sendiri masalah daftar dan Lainnya Sebab tinggal menjalankan saja sesuai syarat ketentuan yang berlaku. Maka permainan judinya berlangsung juga dengan cara Tidak tersendat

warc-identified-content-language: ind,eng


content:
Mesin slot cocok untuk alasan perjudian. Karena perjudian online sama sekali tidak memerlukan pengetahuan tentang aturan, orang-orang dari segala usia suka memainkannya. Kegiatan melibatkan yang terkait dengan keberuntungan daripada menerapkan strategi. Jika Anda beruntung, Anda memiliki peluang yang sangat bagus untuk memenangkan jackpot.
Pertama dan terpenting, seperti pemain Olimpiade, Anda selalu siap dan siap sebelum bermain. Dalam bermain dengan mesin slot, Anda membutuhkan uang. Jadi, buatlah spesifik Anda memiliki cukup uang untuk menjadi. Voucher tidak dihormati di kasino, hanya uang. Bahkan jika Anda memiliki uang tunai, Anda bisa berakhir dengan hutang pengecer lingkungan tahu cara mengelolanya. Jadi, alokasikan jumlah tertentu untuk permainan Anda besok. Tetap berpegang pada moneter. Jika Anda telah mengkonsumsi jumlah yang ditetapkan, maka Anda berhenti, berdiri dan mengucapkan selamat tinggal. Kembali lagi materi daripada menghabiskan semua hal yang telah Anda peroleh dari pekerjaan Anda.
Tip kedua sebenarnya adalah bermain untuk pemenang saat Anda bermain untuk tujuan rekreasi, itulah sebabnya kebanyakan orang berpartisipasi. Jika Anda begitu terlibat dalam kenyataan Anda bermain untuk kesenangan bahwa Anda tidak dapat minggir dengan kemenangan besar, Anda mungkin tidak akan pernah menghindari slot kasino online untuk pemenang.
Dengan mesin slot online, Anda dapat memanfaatkan kapan saja Anda mau, di suatu tempat. Yang Anda butuhkan hanyalah komputer yang terhubung ke internet dan kemudian masuk ke keuangan Anda. Anda dapat memainkan permainan slot favorit Anda bahkan di kenyamanan kamp Anda. Jika Anda memiliki komputer laptop, Anda juga dapat bermain slot saat Anda berada di taman, di dalam kedai kopi, atau di restoran.
Pertama, Perjudian dengan strategi meminta untuk kehilangan semua dolar. O.K., Anda percaya bahwa itu jauh lebih penting yang harus dilakukan seseorang untuk tidak perlu menyusun strategi perjudian atau tidak persis bagaimana menyusun strategi Perjudian, saya mengakui maksud Anda, namun, Anda selalu dapat mempelajari cara menyusun strategi Perjudian untuk berjudi yang dihosting.
Scatter Pays: Simbol spesifik dari permainan slot yang membayar bahkan jika simbol tidak berada di payline yang sama persis. Tips: Scatter Pays membayar hanya pada baris yang diaktifkan dengan taruhan.
SBOBET Terpercaya peluang bagus untuk menang, bermain dengan slot menghadirkan jackpot yang sangat tinggi, bonus tinggi, dan lebih banyak putaran. Juga, periksa pembayaran dan tabel pembayaran. Bermain dengan mesin slot yang memiliki 95 persen dan di atas pengembalian. Jika ada kasino yang baru dibuka dengan wilayah Anda, cobalah. Mereka memiliki promosi pasti dan mereka akan lebih tinggi bonus dan jackpot ditambah hadiah tambahan.


content:
hoki188 – Kasino online belakangan ini secara tradisional ditampilkan sebagai tempat yang sangat menarik untuk memainkan permainan kasino melalui Internet. Tidak ada lagi kebutuhan untuk benar-benar pergi ke klub kasino untuk memainkan permainan kasino favorit Anda, meskipun jika Anda melakukannya, Anda mungkin akan mendapatkan gebrakan yang nyata. Bermain slot kasino online bisa menjadi cara yang sangat menarik untuk menghabiskan waktu luang Anda saat online, dan jika Anda mengikuti tip kasino online untuk slot kasino online, Anda pasti akan merasa sangat nyaman dan bebas repot. Ini adalah alternatif yang bagus untuk kerumitan dan hiruk pikuk pergi ke kasino lokal Anda, dan jika Anda ingin memenangkan sejumlah uang maka Anda pasti akan mendapatkan sensasi dari bermain game slot melalui Internet!
Jika Anda adalah penggemar perjudian kasino, kemungkinan besar Anda pernah mendengar tentang kiat kasino online. Ini pada dasarnya adalah tip dan strategi bermanfaat yang dirancang untuk membantu Anda meningkatkan peluang menang saat berjudi online. Ini sangat penting ketika memainkan permainan taruhan tinggi seperti slot. Bagian terbaiknya adalah ada banyak sistem perjudian di luar sana, banyak di antaranya dapat meningkatkan peluang Anda secara dramatis, tetapi sangat bermanfaat untuk mengetahui apa yang Anda hadapi sebelum Anda mulai berjudi online.
Salah satu saran terbaik adalah memastikan Anda mengetahui semua yang perlu diketahui tentang bonus sebelum Anda bermain. Bonus pada dasarnya adalah ketika operator kasino memberi Anda persentase atau “kredit” tertentu untuk digunakan saat Anda bertaruh dengan mesin slot kasino mereka. Semakin banyak kredit yang Anda miliki, semakin baik peluang Anda untuk menang. Bonus dibayarkan dengan jenis pemroses pembayaran tertentu, jadi membayar untuk mencari situs judi online yang mengeluarkan bonus dalam mata uang pilihan Anda.
Saran lain yang paling penting adalah meningkatkan uang Anda. Saat tip kasino online berjalan, meningkatkan uang Anda pada dasarnya adalah cara untuk memastikan bahwa Anda akan dapat terus bermain sampai uang Anda habis. Ini karena segera setelah Anda mencapai pengeluaran tertentu, uang Anda melemahkan peluang Anda untuk memenangkan lebih banyak uang, karena kasino kemudian akan mencoba memenangkan Anda kembali menggunakan perangkat lunaknya. Oleh karena itu, peningkatan bankroll Anda dapat secara signifikan meningkatkan peluang Anda untuk menang, terutama jika Anda telah menghabiskan waktu mencoba mencocokkan serangkaian kiat online tertentu.
Ada sejumlah trik yang disarankan oleh tip kasino online untuk Anda gunakan untuk meminimalkan keunggulan kasino Anda. Salah satunya jelas bermain di mesin yang memiliki tepi rumah rendah. Idenya di sini adalah untuk mendapatkan pembayaran sedekat mungkin dengan 100%, yang seharusnya cukup mudah sekarang, mengingat bahkan kasino online terbesar di dunia hanya memiliki keunggulan dua puluh persen. Namun, tepi rumah bukan satu-satunya hal yang dapat Anda kurangi. Hal lain yang dapat Anda lakukan adalah meminimalkan waktu bonus kasino perangkat lunak kasino Anda, yang berarti Anda harus bertujuan untuk bermain tidak lebih dari dua kali per minggu.
Alasan utama mengapa tip kasino online adalah cara yang efektif untuk menang hanyalah karena fakta bahwa tip tersebut dirancang untuk mengurangi waktu dan penyebaran bonus kasino, yang berarti bahwa peluang Anda untuk menang juga berkurang. Ini berarti bahwa uang Anda, yang pada awalnya mungkin cukup kecil, dapat diperpanjang selama beberapa minggu. Ini karena peluang Anda untuk menang akan berkurang saat Anda mendekati akhir uang Anda, yang pada gilirannya mengurangi jumlah potensi penghasilan Anda.
Penting untuk dicatat bahwa Anda harus mulai memainkan slot kasino online ini dengan bankroll yang relatif kecil. Ingatlah bahwa ini adalah permainan di mana rumah selalu menang, jadi waktu bonus kasino ada untuk keuntungan Anda, tetapi Anda harus mulai bermain dengan bankroll kecil hanya untuk menguji air. Jika Anda kehilangan banyak uang sejak awal maka Anda harus ingat bahwa ini cukup normal dan Anda harus segera berhenti bermain mesin slot. Yang perlu Anda lakukan sebagai gantinya adalah memenangkan kembali uang sebanyak mungkin sebelum Anda berhenti memainkannya, jika tidak, uang Anda akan habis dengan sangat cepat. Salah satu cara paling efektif untuk melakukan ini adalah dengan memastikan bahwa Anda bermain di slot yang lebih cepat, yang cenderung memiliki nilai jackpot yang lebih rendah, tetapi mereka jauh lebih mungkin untuk membayar.
Ada banyak jenis bonus kasino online lainnya yang dapat Anda manfaatkan untuk meningkatkan peluang Anda untuk menang. Sering ada skema loyalitas dimana jika Anda bermain cukup lama, Anda menerima avatar khusus yang menggambarkan tim olahraga favorit Anda atau mungkin kebangsaan Anda. Bahkan ada beberapa kasino online yang memberi Anda putaran gratis pada permainan roulette mereka. Kasino online ini biasanya akan memberi Anda kode putaran sehingga Anda dapat menikmati permainan sebanyak mungkin tanpa benar-benar mempertaruhkan uang tunai! Anda dapat menggunakan kode-kode ini dalam kombinasi dengan bonus kasino untuk memastikan bahwa Anda meningkatkan peluang Anda untuk menang.


content:
Anda sedang melihat informasi mengenai mobil Toyota Vellfire bekas pemilik langsung, mobil bekas murah di situs Otomurah.com. Di sini, Anda bisa mengecek dan membeli mobil Toyota Vellfire 2008 bekas dan baru dengan harga paling terjangkau di Indonesia, dengan kualitas yang terjamin.
Semua
Mobil bekas
Mobil baru
Ada gambar
Hasil pencarian terbaik
Default
Dari terbaru
Dari terlama
Harga: dari tertinggi
Harga: dari terendah
Jual Toyota Vellfire 2008 harga murah
17/06/2022
Rp 265 juta
Bekas
Jawa Barat
93.000 Km
Daftar mobil Toyota Vellfire 2008 bekas lagi dijual di Otomurah dengan harga mulai dari 265 juta.
Dengan jumlah listing mobil lagi dijual dengan harga terjangkau, Otomurah akan membantu Anda memilih kendaraan Vellfire 2008 yang sesuai dengan anggaran. Selain itu, Otomurah.com juga memberikan informasi review mobil, tips menarik seputar mobil dan pasar mobil di Indonesia, serta proses cicilan yang menarik bagi pembeli mobil.Selain itu, jika Anda memiliki kebutuhan untuk menjual mobil Toyota Vellfire 2008 di Indonesia, silakan membuat postingan dengan gambar, dan perbarui informasi lengkap tentang spesifikasi kendaraan, harga, informasi kontak, dll. langsung di Otomurah . Kami akan membantu menghubungkan penjual dan pembeli dengan cepat dan efisien.
Otomurah.com hanya bantu penjual pasang iklan jual mobil saja, bukan diler jual mobil.
Untuk dapat infor tentang mobil yang Anda berminat, mohon langsung hubungi penjual via Nomor Hpnya yang kami sudah sediakan di bagian informasi penjual.

warc-identified-content-language: ind


content: Orang menggunakan langkah sederhana untuk berbagai macam kegiatan yang ada dengan memanfaatkan ponsel. Anda dapat melakukan banyak kegiatan dengan menggunakan perangkat seperti ini juga. Sayangnya,… Read More »3 Tips Temukan Alamat Lengkap Service Center Semarang Berkualitas


content:
Bermain Slot Online di Situs dengan Metode Deposit Pulsa – Perlu anda ketahui saat ini bahwa ketika para player ingin bermain slot online, sebagaian besar player pastinya memilih metode deposit pulsa. Ada banyak peluang slot uang nyata untuk tim Indonesia. Dengan beberapa situs judi slot online deposit pulsa top Indonesia, tidak hanya pengalaman yang bersih, aman, dan menyenangkan, tetapi beberapa slot teratas dengan permainan terbaik dapat dijamin. Anda dapat menjamin waktu yang layak dengan insentif yang dapat diakses di beberapa kasino online di Indonesia dan dengan aturan UKGC yang ketat.
Banyak slot online di Amerika Serikat yang mengubah hal-hal ketika undang-undang diubah. Ratusan slot sekarang terbuka, dan legal dan nyaman untuk memainkan slot uang nyata tergantung pada negara bagian Anda. Misalnya, pemain di NJ dapat memilih dari sejumlah besar kasino online NJ yang memungkinkan mereka memainkan slot uang nyata . Undang-undang setempat dapat memengaruhi pengalaman bermain game Anda secara online, tetapi Anda dapat memilih dari banyak hal jika legal untuk Anda di wilayah Anda!
Strategi Slot Online Kas Nyata Teratas
Karena Anda sudah terbiasa dengan slot mpo online, mungkin Anda ingin beberapa jenis taktik dalam permainan Anda dimasukkan. Secara alami, tidak banyak yang dapat dikatakan untuk mengubah hasil putaran pada slot. Namun, dengan mengingat dan menerapkan tip tersebut, Anda dapat meminimalkan kerugian dan mengelola aset Anda.
Seperti yang dikatakan sebelumnya, bermain blackjack atau bakarat misalnya, di mana berbagai permainan dapat digunakan, tidak sama untuk permainan slot. Sebagai gantinya, generator nomor acak (RNG) mengatur keadilan situs judi slot online deposit pulsa yang digunakan untuk menghasilkan game di genre ini. Ini memastikan bahwa ketika Anda menekan tombol untuk memulai permainan, setiap putaran memiliki hasil yang ditentukan secara acak.
Lihat bagaimana berbagai fungsi khusus slot diaktifkan. Semakin Anda dapat mengingat apa yang terjadi saat Anda memainkan permainan slot yang Anda pilih. Fasilitas akan memungkinkan Anda untuk menyesuaikan bankroll Anda dengan lebih mudah jika Anda mengenali variasi taruhan yang Anda tawarkan.
Kecepatan dan tingkat ketidakpastian dalam game yang Anda mainkan adalah beberapa hal terakhir yang perlu diingat untuk dilihat. Ini akan memberi tahu Anda seberapa besar harapan Anda untuk menang di situs judi slot online deposit pulsa dan seberapa kuat pembayarannya. Saat Anda memulai dengan taruhan yang lebih kecil, Anda akan mengetahui lebih banyak tentang cara kerja permainan dan Anda tidak kehilangan keseimbangan terlalu banyak pada saat yang bersamaan.
Anda harus mengeluarkan uang yang setidaknya tidak dapat Anda tanggung untuk mengambil risiko, tetapi membuat taruhan minimum akan memungkinkan Anda memahami bagaimana slot berfungsi dan seberapa banyak fitur dapat terjadi. Coba apa saja terlebih dahulu, lalu pilih satu atau dua speaker lagi dalam mode demo bermain gratis.…
Category: Slot Tags: agen judi slot, bandar judi, bandar judi online, bandar judi slot, bandar slot, bandar slot online, Bermain Slot Online di Situs dengan Metode Deposit Pulsa, jackpot slot, judi, judi online, judi slot, judi slot online, mpo, mpo gaming, mpo slot, situs slot online, slot, slot mpo, slot mpo online, slot online