tentang CUDA nvidia

sudah lama ingin menulis artikel ini , semenjak memulai menyusun tesis ku pada tahun 2012 kemaren, hingga selesai pada tahun 2013[disini], mungkin baru ini bisa share. 
saya sendiri mengenal teknologi ini telah lama mungkin semenjak nvidia mulai mengenalkanya pada awal tahun 2006 yang pertama kali di terapkan pada platform video card nya pada chipset 8800gt. namun saat intu hanya sebatas tau saja, tentang keuntungan teknik ini. 

dalam hal ini pasti banyak artikel lain yang telah "mereview" atau memperkenalkannya. artikel ini berisi cuplikan dari tesis saya waktu itu, kalo ada yang beminat untuk mengembangkannya bisa share aja disini, 


CUDA ( Compute Unified Device Architecture )

CUDA ™ adalah platform komputasi paralel dan model pemrograman yang memungkinkan peningkatan dramatis dalam kinerja komputasi dengan memanfaatkan kekuatan dari graphics processing unit (GPU) (Nvidia, 2012). Sejak diperkenalkan pada 2006, CUDA telah banyak disebarkan melalui ribuan aplikasi dan diterbitkan pada makalah penelitian, dan didukung oleh dasar terinstal lebih dari 300 juta CUDA-enabled GPU di notebook, workstation, menghitung cluster dan super-computer. (Nvidia, 2012).

Cuda juga di lengkapi dengan lingkungan perangkat lunak yang memungkinkan pengembang menggunakan bahasa C sebagai bahasa pemrogramannya (nvidia, 2012). Pada Gambar 2.6 diilustrasikan bahasa pemrograman lain yang bisa di gunakan dalam CUDA dan implementasi pemrograman interface. 

gambar 2.6


Model pemrograman CUDA adalah membagi pekerjaan yang akan di lakukan ke banyak unit pemroses paling kecil, yakni thread. Setiap thread memiliki memori tersendiri dan mengerjakan inti pekerjaan yang kecil dan akan berjalan bersamaan dengan thread lain sehingga waktu yang di butuhkan untuk mengerjakan pekerjaan seluruhnya menjadi lebih singkat. Kumpulan dari thread tersebut disebut sebagai blok dalam blok memiliki satu memori tersendiri yang bisa di gunakan thread dalam blok tersebut. Media untuk saling berkomunikasi antar thread dinamakan dengan Share memori. Setiap blok akan di kelompokkan lagi menjadi sebuah grid yang menjadi sekumpulan block yang digunakan dalam komputasi. Ilustrasi seperti terlihat pada Gambar 2.7.
gambar 2.7

CPU dalam CUDA disebut dengan istilah Host, dan GPU disebut dengan istilah Device. Ada 2 bagian pada pemrograman CUDA yaitu fungsi yang di jalankan pada CPU dan fungsi yang di jalankan pada GPU, karnel adalah sebutan untuk program CUDA yang berjalan pada GPU. Pada saat fungsi ini berjalan, pemogram harus memberikan informasi pada GPU untuk memesan berapa banyak block, thread yang akan digunakan dalam masing-masing block.

Perangkat CUDA menggunakan spasi memori yang memiliki karakteristik yang berbeda yang menunjukkan yang berbeda dalam aplikasi Cuda. Ruang ruang memory pada CUDA seperti terlihat pada Gambar 2.8
gambar 2.8

Jumlah memori yang tersedia di setiap ruang memori pada setiap tingkat kemampuan menghitung Global, Constant dan memory texture memiliki latency yang terbesar, di ikuti oleh memori konstan, register dan shared memori, ciri tiap memori bisa terlihat pada 

Memory
Location on/off chip
Cached
Access
Scope
Lifetime
Register
On
-
R/W
1 thread
Thread
Local
Off
+
R/W
1 Thread
Thread
Shared
On
n/a
R/W
All thread in block
Block
Global
Off
+
R/W
All thread + host
Host location
Constant
Off
Yes
R
All thread + host
Host location
Texture
Off
Yes
R
All thread + host
Host location
  Bahasa pemrograman yang digunakan oleh CUDA adalah bahasa C/C++ yang diberi ekstensi fungsi-fungsi dan sintaks yang digunakan khusus untuk CUDA untuk menajemen perangkat CUDA. Sintaks khusus pada pemrograman CUDA memiliki fungsi fungsi yang berbeda dan tujuan yang berbeda tiap sintaksnya. Seperti terlihat pada Tabel 2.2 di bawah.

Sintaks
Write in program
Fungsi
Keterangan
cudaGetDeviceCount().
cudaGetDeviceCount().
Device management

cudaGetDeviceProperties().
cudaGetDeviceProperties().
Device management

cudaMalloc()
cudaMalloc()
Device
memory
management

cudaFree ()
cudaFree ()


cudaMemcpy ()
cudaMemcpy ()


cudaBindTexture ()
cudaBindTexture ()
Texture
management

cudaBindTextureToArray ()
cudaBindTextureToArray ()


cudaGLMapBufferObject ()
cudaGLMapBufferObject ()
Graphics
interoperability

cudaD3D9MapVertexBuffer()
cudaD3D9MapVertexBuffer()


__global__
Void MyKernel(){}
Function
qualifiers
Cal from host, execute on GPU
__device__
Float MyDeviceFunc() {}
Function
qualifiers
Cal from GPU, execute on GPU
__host__
Int HostFunc() {}
Function
qualifiers
Cal from host, execute on host
__device__
Float MyGPUArray[32];
Variable
qualifiers
In GPU memory space
__constant__
Float MyConstArray[32];
Variable
qualifiers
Write by host; read by GPU
__shared__
Float MySharedArray[32];
Variable
qualifiers
Shared within thread block
Int1, int2…
Float1, float2…
Double, double2..etc

Built-in
vector types

<<<  >>>
<<< Grid, Block >>>
Excution configuration
Launch kernel
gridDdim
Dim3 gridDdim;
Variable and function valid in device code
Grid dimension
blockDim
Dim3 blockDim
Variable and function valid in device code
Block dimension
blockIdx
Dim3 blockIdx
Variable and function valid in device code
Block index
ThreadIdx
Dim3 ThreadIdx
Variable and function valid in device code
Thread index
__sycthreads()
Void __sycthreads()
Variable and function valid in device code
Thread synchronization
<![if !supportLists]>2.2.1.      <![endif]>            CUDA ( Compute Unified Device Architecture )
CUDA ™ adalah platform komputasi paralel dan model pemrograman yang memungkinkan peningkatan dramatis dalam kinerja komputasi dengan memanfaatkan kekuatan dari graphics processing unit (GPU) (Nvidia, 2012). Sejak diperkenalkan pada 2006, CUDA telah banyak disebarkan melalui ribuan aplikasi dan diterbitkan pada makalah penelitian, dan didukung oleh dasar terinstal lebih dari 300 juta CUDA-enabled GPU di notebook, workstation, menghitung cluster dan super-computer. (Nvidia, 2012).
Cuda juga di lengkapi dengan lingkungan perangkat lunak yang memungkinkan pengembang menggunakan bahasa C sebagai bahasa pemrogramannya (nvidia, 2012). Pada Gambar 2.6 diilustrasikan bahasa pemrograman lain yang bisa di gunakan dalam CUDA dan implementasi pemrograman interface.
<![if !supportMisalignedColumns]> <![endif]>
GPU Computing Application
Libraries and Middleware
cuFFT
cuBLAS
cuRAND
cuSPASE
LAPACK
CULA
MAGMA
Thrust
NPP
cuDPP
VSIPL
SVM
OpencCurrent
PhysX
OptiX
Iray
RealityServer
MATALAB
Mathematica
C
C++
Fotran
Java
Python
Wrappers
Direct Compute
OpenCLtm
Directives
(e.g. OpenACC)
NVIDIA GPU
Whit the CUDA Parallel Computing Architecture
Fermi Architecture
Geforce 400 series
Quadro Fermi Series
Tesla 20 Series
Tesla Architecture
Geforce 200 series
Geforce 9 series
Geforce 8 series
Quadro FX series
Quadro Plex series
Quadro NVX Series
Tesla 10 series
<![if !vml]><![endif]>
<![if !vml]><![endif]>
<![if !vml]><![endif]>
Gambar 2.6 CUDA untuk bahasa pemrograman dan aplikasi program interface. (nvidia, 2012)
Model pemrograman CUDA adalah membagi pekerjaan yang akan di lakukan ke banyak unit pemroses paling kecil, yakni thread. Setiap thread memiliki memori tersendiri dan mengerjakan inti pekerjaan yang kecil dan akan berjalan bersamaan dengan thread lain sehingga waktu yang di butuhkan untuk mengerjakan pekerjaan seluruhnya menjadi lebih singkat. Kumpulan dari thread tersebut disebut sebagai blok dalam blok memiliki satu memori tersendiri yang bisa di gunakan thread dalam blok tersebut. Media untuk saling berkomunikasi antar thread dinamakan dengan Share memori. Setiap blok akan di kelompokkan lagi menjadi sebuah grid yang menjadi sekumpulan block yang digunakan dalam komputasi. Ilustrasi seperti terlihat pada Gambar 2.7.
<![if !vml]>Description: grid-of-thread-blocks<![endif]>
Gambar 2.7 Struktur unit pemproses pada CUDA (nvidia, 2012)
CPU dalam CUDA disebut dengan istilah Host, dan GPU disebut dengan istilah Device. Ada 2 bagian pada pemrograman CUDA yaitu fungsi yang di jalankan pada CPU dan fungsi yang di jalankan pada GPU, karnel adalah sebutan untuk program CUDA yang berjalan pada GPU. Pada saat fungsi ini berjalan, pemogram harus memberikan informasi pada GPU untuk memesan berapa banyak block, thread yang akan digunakan dalam masing-masing block.
Perangkat CUDA menggunakan spasi memori yang memiliki karakteristik yang berbeda yang menunjukkan yang berbeda dalam aplikasi Cuda. Ruang ruang memory pada CUDA seperti terlihat pada Gambar 2.8
                   <![if !vml]><![endif]>
Gambar 2.8. Model memory perangkat CUDA
Jumlah memori yang tersedia di setiap ruang memori pada setiap tingkat kemampuan menghitung Global, Constant dan memory texture memiliki latency yang terbesar, di ikuti oleh memori konstan, register dan shared memori, ciri tiap memori bisa terlihat pada
.
Tabel 2.1 Fitur memory device
Memory
Location on/off chip
Cached
Access
Scope
Lifetime
Register
On
-
R/W
1 thread
Thread
Local
Off
+
R/W
1 Thread
Thread
Shared
On
n/a
R/W
All thread in block
Block
Global
Off
+
R/W
All thread + host
Host location
Constant
Off
Yes
R
All thread + host
Host location
Texture
Off
Yes
R
All thread + host
Host location
  Bahasa pemrograman yang digunakan oleh CUDA adalah bahasa C/C++ yang diberi ekstensi fungsi-fungsi dan sintaks yang digunakan khusus untuk CUDA untuk menajemen perangkat CUDA. Sintaks khusus pada pemrograman CUDA memiliki fungsi fungsi yang berbeda dan tujuan yang berbeda tiap sintaksnya. Seperti terlihat pada Tabel 2.2 di bawah.
Tabel 2.2 Beberapa perintah untuk pemrograman CUDA.
Sintaks
Write in program
Fungsi
Keterangan
cudaGetDeviceCount().
cudaGetDeviceCount().
Device management
cudaGetDeviceProperties().
cudaGetDeviceProperties().
Device management
cudaMalloc()
cudaMalloc()
Device
memory
management
cudaFree ()
cudaFree ()
cudaMemcpy ()
cudaMemcpy ()
cudaBindTexture ()
cudaBindTexture ()
Texture
management
cudaBindTextureToArray ()
cudaBindTextureToArray ()
cudaGLMapBufferObject ()
cudaGLMapBufferObject ()
Graphics
interoperability
cudaD3D9MapVertexBuffer()
cudaD3D9MapVertexBuffer()
__global__
Void MyKernel(){}
Function
qualifiers
Cal from host, execute on GPU
__device__
Float MyDeviceFunc() {}
Function
qualifiers
Cal from GPU, execute on GPU
__host__
Int HostFunc() {}
Function
qualifiers
Cal from host, execute on host
__device__
Float MyGPUArray[32];
Variable
qualifiers
In GPU memory space
__constant__
Float MyConstArray[32];
Variable
qualifiers
Write by host; read by GPU
__shared__
Float MySharedArray[32];
Variable
qualifiers
Shared within thread block
Int1, int2
Float1, float2
Double, double2..etc
Built-in
vector types
<<<  >>>
<<< Grid, Block >>>
Excution configuration
Launch kernel
gridDdim
Dim3 gridDdim;
Variable and function valid in device code
Grid dimension
blockDim
Dim3 blockDim
Variable and function valid in device code
Block dimension
blockIdx
Dim3 blockIdx
Variable and function valid in device code
Block index
ThreadIdx
Dim3 ThreadIdx
Variable and function valid in device code
Thread index
__sycthreads()
Void __sycthreads()
Variable and function valid in device code
Thread synchronization

Comments