1. TUGAS REKAYASA KOMPUTASIONAL
‘OpenCL’
Kelompok 7 :
1. Rizki Nurul Huda 56410144
2. Rizkha Pramesti 56410112
3. Roni Dafiansyah 56410242
4. Rossi Aryani P 56410256
5. S. Chandra 56410314
Universitas Gunadarma
2012
2. Apa itu OpenCL?
OpenCL (Open Computing Library)
OpenCL (Open Computing Library) merupakan framework untuk menulis program
yang jalankan di berbagai platform heterogen yang terdiri dari CPU, GPU, dan prosesor
lainnya.
OpenCL mencakup bahasa (berdasarkan C99) untuk menulis kernel (fungsi yang dijalankan
pada perangkat OpenCL), ditambah API yang digunakan untuk mendefinisikan dan
kemudian mengontrol platform.
OpenCL menyediakan komputasi paralel menggunakan paralelisme berdasarkan tugas
dan data berbasis. Alat ini telah diadopsi ke dalam driver kartu grafis oleh AMD / ATI, yang
membuatnya sendiri GPGPU penawaran dicap sebagai Streaming SDK, dan Nvidia, yang
menawarkan OpenCL sebagai pilihan yang sama dengan Arsitektur Unified Perangkat
Compute (CUDA) dalam driver nya. OpenCLs arsitektur berbagi berbagai interface
komputasi dengan baik CUDA dan pesaing DirectCompute Microsoft.
3. Sejarah
OpenCL awalnya dikembangkan oleh Apple Inc , yang memegang merek dagang hak, dan
disempurnakan menjadi sebuah proposal awal bekerja sama dengan tim teknis di AMD , IBM
, Intel , dan Nvidia . Apel mengajukan proposal awal ini ke Grup Khronos . Pada tanggal 16
Juni 2008, Khronos Hitung Kelompok Kerja dibentuk dengan perwakilan dari CPU, GPU,
tertanam-prosesor, dan perusahaan perangkat lunak. Kelompok ini bekerja selama lima bulan
untuk menyelesaikan rincian teknis dari spesifikasi untuk OpenCL 1.0 sebesar 18 November
2008. Spesifikasi teknis ini telah diperiksa oleh anggota Khronos dan disetujui untuk rilis
publik pada tanggal 8 Desember 2008.
OpenCL 1.0
OpenCL 1.0 telah dirilis dengan Mac OS X Snow Leopard . Menurut siaran pers Apel:
Snow Leopard lebih lanjut memperluas dukungan untuk perangkat keras modern dengan
Open Computing Language (OpenCL), yang memungkinkan aplikasi keran ke gigaflops
besar daya komputasi GPU sebelumnya hanya tersedia untuk aplikasi grafis. OpenCL
didasarkan pada bahasa pemrograman C dan telah diusulkan sebagai standar terbuka.
AMD telah memutuskan untuk mendukung OpenCL (dan DirectX 11) bukan sekarang usang
Dekat Logam dalam Surat kerangka Streaming . RapidMind mengumumkan adopsi mereka
OpenCL bawah platform pengembangan untuk mendukung GPU dari beberapa vendor
dengan satu antarmuka. Pada tanggal 9 Desember 2008, Nvidia mengumumkan niatnya untuk
menambahkan dukungan penuh untuk OpenCL 1.0 spesifikasi untuk perusahaan Computing
Toolkit GPU. Pada tanggal 30 Oktober 2009, IBM merilis implementasi OpenCL pertama
sebagai bagian dari kompiler XL .
OpenCL 1.1
OpenCL 1.1 disahkan oleh Khronos Group on 14 Juni 2010 dan menambahkan fungsionalitas
yang signifikan untuk meningkatkan fleksibilitas pemrograman paralel, fungsionalitas, dan
kinerja termasuk:
Tipe data baru termasuk vektor 3-komponen dan format gambar tambahan;
4. Penanganan perintah dari beberapa benang host dan pengolahan buffer di beberapa
perangkat;
Operasi pada daerah penyangga termasuk membaca, menulis dan menyalin dari 1D,
2D, atau wilayah persegi panjang 3D;
Peningkatan penggunaan acara untuk mendorong dan mengontrol perintah eksekusi;
Tambahan OpenCL built-in fungsi C seperti penjepit integer, shuffle, dan salinan
strided asynchronous;
Peningkatan interoperabilitas OpenGL melalui berbagi efisien gambar dan buffer
dengan menghubungkan peristiwa OpenCL dan OpenGL.
OpenCL 1.2
Pada 15 November 2011, para Khronos Group mengumumkan spesifikasi OpenCL 1.2, yang
menambahkan fungsionalitas yang signifikan selama versi sebelumnya dalam hal kinerja dan
fitur untuk pemrograman paralel. Fitur yang paling menonjol meliputi:
Partisi perangkat: kemampuan untuk partisi perangkat ke dalam sub-perangkat
sehingga tugas kerja dapat dialokasikan untuk unit menghitung individu. Hal ini
berguna untuk melestarikan daerah perangkat untuk mengurangi latency untuk tugas-
tugas waktu-kritis.
Kompilasi terpisah dan menghubungkan objek: fungsi untuk mengkompilasi OpenCL
ke perpustakaan eksternal untuk dimasukkan ke program lain.
Peningkatan dukungan gambar: 1.2 menambahkan dukungan untuk gambar 1D dan
array gambar 1D/2D. Selanjutnya, berbagi ekstensi OpenGL sekarang memungkinkan
untuk OpenGL 1D tekstur dan 1D/2D array tekstur yang akan digunakan untuk
membuat gambar OpenCL.
Built-in kernel: perangkat kustom yang mengandung fungsi yang unik spesifik
sekarang terintegrasi lebih erat ke dalam kerangka OpenCL. Kernel dapat dipanggil
untuk menggunakan aspek-aspek khusus atau non-programmable hardware yang
mendasarinya. Contohnya termasuk video encoding / decoding dan prosesor sinyal
digital.
5. Fungsi DirectX: DX9 berbagi permukaan media yang memungkinkan untuk berbagi
efisien antara OpenCL dan DX9 atau DXVA permukaan media. Sama, untuk DX11,
berbagi mulus antara OpenCL dan DX11 permukaan diaktifkan.
Kelebihan OpenCL
- OpenCL memberikan setiap akses aplikasi ke Graphics Processing Unit untuk non-grafis
komputasi.
- OpenCL memperluas kekuatan Graphics Processing Unit di luar grafis (tujuan umum
komputasi pada graphics processing unit).
- OpenCL adalah analog dengan standar industri terbuka OpenGL dan OpenAL, untuk grafis 3D
dan audio komputer, masing-masing.
OpenCL dapat mempercepat perhitungan matematis paralel lebih banyak. Algoritmanya
dapat dengan mudah diparalelkan, beberapa contohnya:
- Fungsi akar-temuan dan optimasi;
- Gambar penyaringan dan pengolahan;
- Perhitungan vektor Vertex dan normal untuk model 3D;
- Algoritma evolusioner seperti Algoritma Genetika atau Ant Colony Sistem;
6. - Partikel interaksi
- Scripting Matematika: anda dapat mengkompilasi kode dalam waktu eksekusi
Kekurangan OpenCL
- Saat ini, alat-alat untuk debug kode OpenCL tidak sangat baik. Saat menulis kode C #
dengan cara OpenCL, fungsi tidak mengembalikan data (void) dan menerima vektor
floats dan ints.
Contoh Program OpenCL
Kita akan menghitung jumlah terbesar dari daftar berikut dengan bilangan positif:
1 2 3 1 7 10 11 30 28 65 33 1 2 3 10
Cara yang paling mudah untuk melakukan ini adalah:
Float max = -1;
for (int i = 0; i <x.Length, i + +)
{
if (max <x [i]) max = x [i];
}
Membuat proyek Visual Studio baru untuk ini. Load acara formulir harus menginisialisasi
OpenCL dan mengkompilasi kode:
... OpenCLTemplate CLCalc Program Kernel kernelCalcMax;
private void Form1_Load (pengirim objek, EventArgs e)
{
String calcMaxSrc = @ "
__kernel batal
calcMax (__ mengambang global yang * x,
__global float * max)
{
/ / Index elemen Vector
int i = get_global_id (0);
7. if (max [0] <x [i]) max [0] = x [i];
} ";
InitCL CLCalc ().;
if (GLAcceleration CLCalc. == CLCalc. GLAccelerationType. UsingGL) {
Kompilasi (Program CLCalc.. Baru string [1] {} calcMaxSrc);
kernelCalcMax = new . Program CLCalc Kernel ("calcMax").;
}
}
Sebagai program tersebut dimuat, kami menyatakan sumber OpenCL, menginisialisasi
OpenCL dan mengkompilasi program.
Ini adalah screenshoot program nya :
Seperti yang Anda lihat, jenis daftar nomor di textbox txtList pengguna. Perhitungan
maksimum dari Read textbox, menghitung maksimum benar dan menjalankan kode OpenCL:
private void btnMaxWithOpenCL_Click (pengirim objek, EventArgs e)
{
String [] s = txtList.Text.Split ();
float [] x = float baru [s.Length];
String DataRead = "";
for (int i = 0; i <x.Length, i + +)
{
float.TryParse (s [i], keluar x [i]);
x [i] = Math.abs (x [i]);
if (DataRead = "!") DataRead + = "";
DataRead + = x [i] ToString ();.
}
txtList.Text = DataRead;
/ / Got daftar x untuk menemukan maksimum
float [] = max baru float [] {-1};
for (int i = 0; i <x.Length, i + +)
{
if (max [0] <x [i]) max [0] = x [i];
}
/ / Tulis jawaban
lblMax.Text = max [0] ToString ();.
/ / Perhitungan OpenCL
8. max [0] = -1;
CLCalc.Program.Variable varx = new CLCalc.Program.Variable (x);
CLCalc.Program.Variable varMax = baru CLCalc.Program.Variable (max);
int [] = new int pekerja [] {} x.Length;
CLCalc.Program.Variable [] args = new CLCalc.Program.Variable [] {varx, varMax};
kernelCalcMax.Execute (args, pekerja);
/ / Baca OpenCL max
varMax.ReadFromDeviceTo (max);
lblCLMax.Text = max [0] ToString ();.
}
}
Saat program dieksekusi, tidak ada urutan ditentukan dimana algoritma akan mengeksekusi.
Jadi ini mungkin terjadi (catatan: x [0] = 1, x [1] = 2):
1 - Pekerja 0 membaca max [0] dan x [0]. Sejak max [0] adalah -1, jika melewati uji;
2 - Pekerja 1 berbunyi max [0] dan x [1]. max [0] masih -1 jadi tes melewati;
3 - Pekerja 1 menulis max [0] = 2;
4 - 0 Pekerja (yang sampai ke titik penulisan kemudian) menulis max [0] = 1.