SlideShare a Scribd company logo
BAB IV
EXAMPLE
A.1
Opencl Example
Bab ini membahas beberapa contoh
OpenCL dasar, yang memungkinkan untuk
meringkas pemahaman tentang
spesifikasi yang dibahas dalam Bab 3.
Contoh-contoh ini menunjukkan langkah-
langkah pemrograman yang diperlukan
untuk menulis aplikasi OpenCL yang
lengkap.
Contoh yang dibahas di sini akan
berfungsi sebagai dasar untuk
membandingkan kode yang lebih
dioptimalkan, yang dapat ditulis setelah
bab selanjutnya dipelajari.
presentation title 3
A.2.
Histogram
Histogram digunakan untuk menghitung atau
memvisualisasikan frekuensi data (yaitu jumlah kemunculan)
pada unit interval diskrit, yang disebut bin. Histogram memiliki
banyak aplikasi dalam pemrosesan data dan gambar. Dalam
contoh ini, kami akan membuat histogram frekuensi nilai piksel
dalam gambar 256-bit.
Secara konseptual, algoritma histogram itu sendiri
sangat sederhana. Dalam kasus di mana setiap nilai sesuai
dengan bin, histogram dapat dihitung sebagai berikut:
20XX
presentation title 4
A.2.
Histogram
Dalam banyak kasus, memparalelkan algoritme untuk
OpenCL sangat mirip dengan memparalelkan algoritme untuk CPU
multithreaded meskipun perincian dekomposisi mungkin berbeda.
Seperti algoritma CPU multithreaded pertama, algoritma OpenCL
tidak akan efisien untuk memiliki nilai pembacaan item kerja dan
menambah bin dari histogram bersama dalam memori global.
Pendekatan terbaik kemudian membuat versi lokal dari
histogram per kelompok kerja. Item kerja dalam grup kerja memiliki
akses bersama ke memori lokal, yang pada arsitektur GPU dipetakan
ke memori on-chip yang cepat. Seperti versi kedua dari algoritme CPU
multithread, setelah work-group selesai membuat salinan lokal
histogramnya, ia dapat melakukan satu lintasan penulisan atom ke
histogram memori global bersama. Namun, menerapkan histogram
per-kelompok kerja hadir dengan satu kerutan tambahan: yaitu
sekarang memiliki kondisi balapan dalam memori lokal.
Untuk GPU, akses atomik ke memori lokal cukup efisien.
Pada GPU AMD Radeon, unit atom dibangun ke dalam penyimpanan
scratchpad on-chip. Oleh karena itu, operasi atom pada memori lokal
jauh lebih murah daripada akses atom ke memori global.
20XX
presentation title 5
A.2.
Histogram
contoh berikut menggunakan operasi atom lokal saat
menghasilkan histogram lokal.
20XX
presentation title 6
A.2.
Histogram
Implementasi dari algoritma histogram seperti yang ditunjukkan
diatas terdiri dari lima langkah:
1. Inisialisasi tempat histogram lokal ke nol (Baris 14).
2. Sinkronkan untuk memastikan bahwa semua pembaruan telah selesai
(Baris 23).
3. Hitung histogram lokal (Baris 26).
4. Sinkronkan kembali untuk memastikan bahwa semua pembaruan telah
selesai (Baris 35).
5. Tulis histogram lokal ke memori global (Baris 39).
Langkah 1, 3, dan 5 mengilustrasikan teknik OpenCL umum untuk
membaca data dari, atau menulis data ke lokasi bersama (memori global
atau lokal). Pada langkah 1, kami melangkah dengan ukuran kelompok
kerja untuk menginisialisasi setiap nilai dalam histogram lokal ke nol.
Langkah 3 menggunakan teknik yang sama untuk membaca dari memori
global, dan langkah 5 lagi menggunakan teknik untuk menulis dari memori
lokal. Langkah 2 dan 4 menggunakan penghalang untuk menyinkronkan
antar langkah, dan tentukan pagar memori untuk memastikan bahwa
semua item kerja dalam kelompok kerja memiliki tampilan memori yang
sama sebelum melanjutkan.
20XX
presentation title 7
A.2.
Histogram
Agar pembaruan histogram global menghasilkan hasil yang benar,
kita juga perlu menginisialisasi nilai histogram global ke nol. Cara paling
mudah untuk menginisialisasi buffer adalah dengan menggunakan
panggilan API host clEnqueueFillBuffer() setelah buffer dibuat.
Panggilan ke clEnqueueFillBuffer() mirip dengan fungsi C memset().
Buffer parameter adalah objek memori yang akan diinisialisasi dengan
data yang ditentukan oleh pola. Tidak seperti memset(), pola untuk
clEnqueueFillBuffer() dapat ditentukan dalam skalar atau vektor integer
atau tipe data titik mengambang yang didukung oleh OpenCL.
Parameter pattern_size menentukan ukuran tipe yang memegang pola.
Ukuran parameter digunakan untuk menentukan jumlah byte yang akan
diinisialisasi, dan harus kelipatan dari pattern_size. Menyediakan offset
memulai inisialisasi pada offset dalam buffer.
20XX
presentation title 8
A.3.
IMAGE
ROTATION
Rotasi adalah rutinitas pemrosesan gambar yang umum dengan aplikasi
dalam pencocokan, penyelarasan, dan algoritma berbasis gambar lainnya. Input untuk
rutinitas rotasi citra adalah citra, sudut rotasi , dan titik di mana rotasi dilakukan.
Koordinat titik (x, y) jika diputar dengan sudut terhadap (x0, y0) menjadi (x’ , y’ ), seperti
yang ditunjukkan oleh persamaan berikut:
Dengan membuat setiap item kerja sesuai dengan lokasi keluaran, kita dapat
secara intuitif memetakan ID global setiap item kerja ke (x’ , y’ ). Kami juga dapat
menentukan (x0, y0), yang sesuai dengan pusat gambar, segera setelah kami memuat
gambar dari disk. Oleh karena itu, kami memiliki dua persamaan dan dua yang tidak
diketahui, yang memungkinkan kami untuk menghitung lokasi yang dibaca oleh setiap
item kerja saat menghitung rotasi:
Pseudocode OpenCL C :
20XX
presentation title 9
A.3.
IMAGE
ROTATION
Berikut ini menunjukkan implementasi kernel OpenCL yang melakukan rotasi gambar :
Di kernel ini, kami menggunakan read_imagef() (Baris 38), karena kami
bekerja dengan data floating-point. Seperti semua fungsi yang digunakan untuk
mengakses gambar, read_imagef() mengembalikan tipe data vektor 4-lebar. Karena kita
bekerja dengan gambar saluran tunggal (dijelaskan selanjutnya), kita hanya tertarik
pada komponen pertama, yang dapat kita akses dengan menambahkan .x ke akhir
pemanggilan fungsi (Baris 38). Panggilan untuk menulis ke gambar juga mengambil
vektor 4-lebar terlepas dari tipe data sebenarnya, tetapi akan ditangani dengan tepat
oleh perangkat keras. Oleh karena itu, pada pemanggilan write_imagef(), kita harus
mentransmisikan hasilnya ke vektor float4 (Baris 41).
20XX
presentation title 10
A.3.
IMAGE
ROTATION
Memberikan CLK_NORMALIZED_COORDS_FALSE menentukan bahwa kita akan
menggunakan pengalamatan berbasis piksel. OpenCL juga memungkinkan sejumlah mode
pengalamatan digunakan untuk menangani akses di luar batas. Untuk contoh ini, kami
menggunakan CL_ADDRESS_CLAMP, menetapkan bahwa nilai yang dihasilkan oleh akses di luar
batas adalah 0 untuk saluran RG dan B, dan mengembalikan 0 atau 1 untuk saluran A
(berdasarkan format gambar). Hasilnya adalah piksel di luar batas dikembalikan sebagai hitam.
Akhirnya, sampler memungkinkan kita untuk menentukan mode penyaringan. Mode pemfilteran
menentukan bagaimana nilai diperoleh dari koordinat yang disediakan oleh akses gambar. Opsi
CLK_FILTER_NEAREST hanya mengembalikan elemen gambar yang paling dekat dengan koordinat
yang disediakan. Atau, CLK_FILTER_LINEAR menyediakan interpolasi linier dari piksel di
sekitarnya.
Di versi OpenCL sebelumnya, ukuran konfigurasi item kerja global untuk NDRange
harus kelipatan dari ukuran grup kerja di setiap dimensi. Di OpenCL 2.0, perangkat diperlukan
untuk mendukung NDRanges yang kelompok kerjanya dapat berupa ukuran variabel di batas.
Mengalokasikan objek gambar untuk menampung gambar input dan output dilakukan
menggunakan panggilan clCreateImage() API. Gambar yang akan menyimpan tipe vektor empat
elemen harus menggunakan CL_RGBA untuk urutan saluran dalam format gambar. Sebagai
alternatif, dalam gambar di mana setiap piksel direpresentasikan sebagai nilai tunggal (misalnya
piksel dari gambar skala abu-abu atau elemen matriks), data dapat ditentukan untuk hanya
menggunakan satu saluran dengan menentukan CL_R untuk urutan saluran.
Saat menentukan tipe data dalam format gambar, seseorang menentukan tipe integer
dengan kombinasi penandatanganan dan ukuran. Misalnya, CL_SIGNED_INT32 adalah bilangan
bulat bertanda 32-bit, dan CL_UNSIGNED_INT8 setara dengan karakter tidak bertanda dalam C.
Data titik-mengambang presisi tunggal ditentukan oleh CL_FLOAT
20XX
presentation title 11
A.3.
IMAGE
ROTATION
Berikut ini menunjukkan kode host yang digunakan untuk membuat gambar input dan
output untuk contoh ini. Setelah gambar dibuat, kami menggunakan panggilan API
clEnqueueWriteImage() untuk mentransfer data input dari host ke objek gambar.
20XX
presentation title 12
A.4.
Image Convolution
20XX
Dalam pemrosesan gambar, konvolusi adalah algoritma yang umum
digunakan yang memodifikasi nilai setiap piksel dalam suatu gambar dengan
menggunakan informasi dari piksel tetangga. Kernel konvolusi, atau filter, menjelaskan
bagaimana setiap piksel akan dipengaruhi oleh tetangganya.
Algoritma konvolusi bekerja dengan mengulangi setiap piksel dalam gambar
sumber. Untuk setiap piksel sumber, filter dipusatkan di atas piksel, dan nilai filter
mengalikan nilai piksel yang dihamparkannya. Sejumlah produk kemudian diambil untuk
menghasilkan nilai piksel baru.
Gambar berikut memberikan representasi visual untuk algoritma ini. Gambar
(b) menunjukkan efek blurring filter adan Gambar (c) menunjukkan efek embossing
filter pada gambar sumber yang sama seperti yang terlihat pada Gambar (a).
presentation title 13
A.4.
Image Convolution
20XX
Di OpenCL, menggunakan objek memori gambar untuk
mengimplementasikan konvolusi memiliki beberapa keunggulan
dibandingkan implementasi menggunakan buffer. Pengambilan
sampel gambar dilengkapi dengan opsi untuk menangani akses di luar
batas secara otomatis dan juga menyediakan cache data dua dimensi
yang dioptimalkan.
Implementasi OpenCL dari kernel konvolusi cukup mudah, dan ditulis
mirip dengan versi C. Dalam versi OpenCL, kami membuat satu item
kerja per piksel keluaran, menggunakan paralelisme untuk
menghapus dua loop dari luar. Tugas setiap item kerja adalah
menjalankan dua loop terdalam, yang melakukan operasi
penyaringan. Kernel OpenCL lengkap ditunjukkan dibawah ini :
presentation title 14
A.4.
Image Convolution
20XX
Dalam contoh diatas, kami mendeklarasikan piksel (nilai
yang dikembalikan oleh akses gambar) dan jumlah (data yang
dihasilkan yang disalin ke gambar keluaran) sebagai tipe float4. Kami
kemudian menggunakan komponen-x saat mengumpulkan nilai piksel
yang difilter (Baris 45).
Filter konvolusi adalah kandidat sempurna untuk memori
konstan dalam contoh ini karena semua item kerja mengakses
elemen yang sama setiap iterasi. Cukup menambahkan kata kunci _
_constant dalam signature fungsi (Baris 7) menempatkan filter dalam
memori konstan.
presentation title 15
A.4.
Image
Convolution
20XX
Pada contoh sebelumnya, kami membuat sampler langsung dari
dalam kernel. Dalam contoh ini, kami membuat sampler
menggunakan API host dan meneruskannya sebagai argumen kernel.
Untuk contoh ini, kita akan menggunakan C++ API (konstruktor
sampler C++ memiliki parameter yang identik).
The host API signature untuk membuat sampler di C adalah sebagai
berikut:
Dengan menggunakan C++ API, the signature adalah sebagai berikut:
Sampler yang digunakan oleh kernel kami dapat dibuat sebagai
berikut:
presentation title 16
A.5
PRODUCER-CONSUMER
20XX
Untuk beberapa aplikasi, produsen dan konsumen dapat beroperasi
secara bersamaan, dengan data pemrosesan konsumen seperti yang
dihasilkan oleh produsen. OpenCL 2.0 telah memperkenalkan objek memori
pipa untuk memfasilitasi aplikasi konsumen produsen. Pipa memiliki potensi
untuk menawarkan utilitas terlepas dari apakah kernel produsen-konsumen
dijalankan secara serial atau bersamaan.
Dalam contoh ini, akan menggunakan pipa untuk membuat aplikasi
produsen-konsumen menggunakan kernel yaitu konvolusi dan histogram.
Kernel konvolusi pertama-tama akan memproses gambar, kemudian
ketika piksel keluaran dihasilkan, piksel tersebut akan diteruskan ke kernel
histogram menggunakan pipa .
Kernel konvolusi akan dijalankan pada GPU perangkat, dan kernel
histogram akan dijalankan pada CPU perangkat. Mengeksekusi kernel pada
beberapa perangkat juga akan memungkinkan eksekusi dua kernel secara
bersamaan, dengan pipa yang digunakan untuk meneruskan data saat
dihasilkan.
presentation title 17
A.5
PRODUCER-CONSUMER
20XX
Pipes adalah objek memori yang berisi data (disebut paket) yang
diatur dengan struktur first in first out (FIFO). Memori yang dialokasikan
untuk pipa ada di memori global, dan secara bersamaan dapat diakses
oleh banyak kernel. Data yang disimpan dalam pipa tidak dapat diakses
dari host.
Untuk kernel tertentu, pipa dapat dibaca saja (_ _read_only)
atau hanya tulis (_ _write_only), tetapi tidak dapat dibaca-tulis. Jika
sebuah pipa tidak ditentukan sebagai hanya baca atau tulis saja,
kompilator akan secara default hanya baca. Pipa dideklarasikan sebagai
parameter kernel dengan menentukan pipa kata kunci, tipe akses, dan tipe
data paket.
Untuk mengakses pipa, OpenCL C menyediakan fungsi intrinsik
read_pipe() dan write_pipe() dengan tanda tangan berikut:
presentation title 18
A.5
PRODUCER-CONSUMER
20XX
implementasi kernel untuk aplikasi kita, Secara khusus
menargetkan kernel konsumen untuk CPU menggunakan hanya satu item
kerja saat membuat histogram. Juga secara eksplisit menargetkan CPU,
menempatkan histogram langsung di memori global.
Meskipun data yang disimpan dalam pipa tidak dapat diakses
dari host, API host masih diperlukan untuk membuat objek pipa. Panggilan
API untuk membuat pipa adalah sebagai berikut:
presentation title 19
A.5
PRODUCER-CONSUMER
20XX
Dalam skenario ini, kami tidak akan berasumsi bahwa kedua kernel dijamin
untuk berjalan secara bersamaan; oleh karena itu, kita akan membuat objek
pipa dengan ukuran yang cukup besar untuk menampung seluruh gambar:
Memanfaatkan beberapa perangkat dengan aplikasi ini memerlukan
beberapa langkah tambahan dalam penyiapan host dibandingkan dengan
contoh yang telah kita lihat sejauh ini. Saat membuat konteks, seseorang
harus menyediakan dua perangkat (satu perangkat CPU, dan satu perangkat
GPU), dan setiap perangkat memerlukan antrean perintahnya sendiri.
Selain itu, objek program sekarang akan digunakan untuk menghasilkan dua
kernel. Peluncuran kernel dilakukan dengan memasukkannya ke dalam
antrian perintah masing-masing: kernel produsen (konvolusi) akan
dimasukkan ke antrian perintah GPU, dan kernel konsumen (histogram)
akan dimasukkan ke antrian perintah CPU.
presentation title 20
A.6
UTILITY FUNCTIONS
Karena OpenCL dimaksudkan untuk menjadi sistem agnostik, beberapa
tugas umum tidak dapat dilakukan secara otomatis seperti yang biasa kita
lakukan saat menulis program C/C++ biasa. Kabar baiknya adalah setelah
diimplementasikan, mereka dapat digunakan kembali untuk semua aplikasi
OpenCL di masa mendatang.
A. REPORTING COMPILATION ERRORS
Ketika mencoba untuk mengkompilasi dan menautkan objek
program OpenCL kami (dengan clBuildProgram(), atau clCompileProgram()
dan clLinkProgram()), mungkin saja ada kesalahan dalam sumber OpenCL C
yang mencegah pembangunan yang berhasil. Dalam hal ini aplikasi host tidak
secara otomatis mencetak pesan kesalahan kompiler dan keluar. Sebaliknya,
panggilan API OpenCL gagal dengan nilai pengembalian yang sesuai, dan
terserah kepada programmer untuk mengambil output kompiler.
Ketika objek program OpenCL gagal dibangun, log build dibuat dan
disimpan dengan objek program. Log dapat diambil dari panggilan API
clGetProgramBuildInfo() dengan meneruskan argumen
CL_PROGRAM_BUILD_LOG ke parameter param_name. Serupa dengan
panggilan API lain yang telah kita lihat, clProgramBuildInfo() harus dipanggil
dua kali: pertama untuk mengetahui ukuran data yang dikembalikan, dan
kedua untuk benar-benar mengambil data setelah alokasi ruang yang cukup.
20XX
Example 21
A.6
UTILITY FUNCTIONS
B. CREATING A PROGRAM STRING
Di Bab 3, kita melihat bahwa objek program dibuat dari
larik karakter (const char **strings) saat menggunakan panggilan
API clCreateProgramWithSource(). Namun, menulis kode sumber
OpenCL C secara langsung sebagai array karakter sangat
merepotkan. Oleh karena itu, kasus penggunaan yang lebih umum
adalah membuat file terpisah yang berisi sumber OpenCL C, dan
membaca file tersebut menjadi string dalam program host.
.
2022

More Related Content

PDF
LN s07-machine vision-s2
DOCX
Laporan tugasgrafikakomputer merancangbangun3ddenganopeng-ldanvb6.docx
DOCX
Ayuk pcd
PDF
ASLI_ 16_MODUL PRAKTIKUM PENGOLAHAN CITRA DIGITAL v2023.pdf
DOCX
TM pengolahan citra digital
PDF
Scilab untuk elektronika dan instrumen [Mirza nur hidayat]
DOCX
TM pengolahan citra digital
PDF
Analisa Tutorial Open GL
LN s07-machine vision-s2
Laporan tugasgrafikakomputer merancangbangun3ddenganopeng-ldanvb6.docx
Ayuk pcd
ASLI_ 16_MODUL PRAKTIKUM PENGOLAHAN CITRA DIGITAL v2023.pdf
TM pengolahan citra digital
Scilab untuk elektronika dan instrumen [Mirza nur hidayat]
TM pengolahan citra digital
Analisa Tutorial Open GL

Similar to Opencl Example, Contoh-contoh ini menunjukkan langkah-langkah pemrograman yang diperlukan untuk menulis aplikasi OpenCL yang lengkap. (20)

DOCX
9 pengolahan citra
PDF
Pertemuan 3-instruksi-mesin-dan-program-bagian-23
PDF
Running Text on LCD ATMEGA 8535
PPTX
Makalah d2
PPTX
Pert.10 aritmatika
DOCX
Laporan pcd 01
PPTX
6. variabel, tipe data, dan operator pada vb
PDF
Pertemuan 2 Kuantitas,Kualitas Citra dan Pemograman Citra di Matlab.pdf
PDF
Llama Implementations from Scratch - Avalon AI.pdf
PPTX
Memodelkan Kekuatan Beton dengan ANN.pptx
DOCX
Buku speech processing_subp_pengkodean-sinyal-wicara-b
DOCX
Buku speech processing_subp_pengkodean-sinyal-wicara-b
PDF
LN s04-machine vision-s2
DOCX
Operasi dasar matlab job 1
PDF
Simulasi cfd
PDF
Panduan_Belajar_Mandiri_MATLAB.pdf
PDF
Tugas2 20914009
PDF
Statistik Manifestasi
DOCX
Sensor suhu LM 35
PPTX
tugas kampus komputasi numerik pemrograman octave
9 pengolahan citra
Pertemuan 3-instruksi-mesin-dan-program-bagian-23
Running Text on LCD ATMEGA 8535
Makalah d2
Pert.10 aritmatika
Laporan pcd 01
6. variabel, tipe data, dan operator pada vb
Pertemuan 2 Kuantitas,Kualitas Citra dan Pemograman Citra di Matlab.pdf
Llama Implementations from Scratch - Avalon AI.pdf
Memodelkan Kekuatan Beton dengan ANN.pptx
Buku speech processing_subp_pengkodean-sinyal-wicara-b
Buku speech processing_subp_pengkodean-sinyal-wicara-b
LN s04-machine vision-s2
Operasi dasar matlab job 1
Simulasi cfd
Panduan_Belajar_Mandiri_MATLAB.pdf
Tugas2 20914009
Statistik Manifestasi
Sensor suhu LM 35
tugas kampus komputasi numerik pemrograman octave
Ad

Opencl Example, Contoh-contoh ini menunjukkan langkah-langkah pemrograman yang diperlukan untuk menulis aplikasi OpenCL yang lengkap.

  • 2. A.1 Opencl Example Bab ini membahas beberapa contoh OpenCL dasar, yang memungkinkan untuk meringkas pemahaman tentang spesifikasi yang dibahas dalam Bab 3. Contoh-contoh ini menunjukkan langkah- langkah pemrograman yang diperlukan untuk menulis aplikasi OpenCL yang lengkap. Contoh yang dibahas di sini akan berfungsi sebagai dasar untuk membandingkan kode yang lebih dioptimalkan, yang dapat ditulis setelah bab selanjutnya dipelajari.
  • 3. presentation title 3 A.2. Histogram Histogram digunakan untuk menghitung atau memvisualisasikan frekuensi data (yaitu jumlah kemunculan) pada unit interval diskrit, yang disebut bin. Histogram memiliki banyak aplikasi dalam pemrosesan data dan gambar. Dalam contoh ini, kami akan membuat histogram frekuensi nilai piksel dalam gambar 256-bit. Secara konseptual, algoritma histogram itu sendiri sangat sederhana. Dalam kasus di mana setiap nilai sesuai dengan bin, histogram dapat dihitung sebagai berikut: 20XX
  • 4. presentation title 4 A.2. Histogram Dalam banyak kasus, memparalelkan algoritme untuk OpenCL sangat mirip dengan memparalelkan algoritme untuk CPU multithreaded meskipun perincian dekomposisi mungkin berbeda. Seperti algoritma CPU multithreaded pertama, algoritma OpenCL tidak akan efisien untuk memiliki nilai pembacaan item kerja dan menambah bin dari histogram bersama dalam memori global. Pendekatan terbaik kemudian membuat versi lokal dari histogram per kelompok kerja. Item kerja dalam grup kerja memiliki akses bersama ke memori lokal, yang pada arsitektur GPU dipetakan ke memori on-chip yang cepat. Seperti versi kedua dari algoritme CPU multithread, setelah work-group selesai membuat salinan lokal histogramnya, ia dapat melakukan satu lintasan penulisan atom ke histogram memori global bersama. Namun, menerapkan histogram per-kelompok kerja hadir dengan satu kerutan tambahan: yaitu sekarang memiliki kondisi balapan dalam memori lokal. Untuk GPU, akses atomik ke memori lokal cukup efisien. Pada GPU AMD Radeon, unit atom dibangun ke dalam penyimpanan scratchpad on-chip. Oleh karena itu, operasi atom pada memori lokal jauh lebih murah daripada akses atom ke memori global. 20XX
  • 5. presentation title 5 A.2. Histogram contoh berikut menggunakan operasi atom lokal saat menghasilkan histogram lokal. 20XX
  • 6. presentation title 6 A.2. Histogram Implementasi dari algoritma histogram seperti yang ditunjukkan diatas terdiri dari lima langkah: 1. Inisialisasi tempat histogram lokal ke nol (Baris 14). 2. Sinkronkan untuk memastikan bahwa semua pembaruan telah selesai (Baris 23). 3. Hitung histogram lokal (Baris 26). 4. Sinkronkan kembali untuk memastikan bahwa semua pembaruan telah selesai (Baris 35). 5. Tulis histogram lokal ke memori global (Baris 39). Langkah 1, 3, dan 5 mengilustrasikan teknik OpenCL umum untuk membaca data dari, atau menulis data ke lokasi bersama (memori global atau lokal). Pada langkah 1, kami melangkah dengan ukuran kelompok kerja untuk menginisialisasi setiap nilai dalam histogram lokal ke nol. Langkah 3 menggunakan teknik yang sama untuk membaca dari memori global, dan langkah 5 lagi menggunakan teknik untuk menulis dari memori lokal. Langkah 2 dan 4 menggunakan penghalang untuk menyinkronkan antar langkah, dan tentukan pagar memori untuk memastikan bahwa semua item kerja dalam kelompok kerja memiliki tampilan memori yang sama sebelum melanjutkan. 20XX
  • 7. presentation title 7 A.2. Histogram Agar pembaruan histogram global menghasilkan hasil yang benar, kita juga perlu menginisialisasi nilai histogram global ke nol. Cara paling mudah untuk menginisialisasi buffer adalah dengan menggunakan panggilan API host clEnqueueFillBuffer() setelah buffer dibuat. Panggilan ke clEnqueueFillBuffer() mirip dengan fungsi C memset(). Buffer parameter adalah objek memori yang akan diinisialisasi dengan data yang ditentukan oleh pola. Tidak seperti memset(), pola untuk clEnqueueFillBuffer() dapat ditentukan dalam skalar atau vektor integer atau tipe data titik mengambang yang didukung oleh OpenCL. Parameter pattern_size menentukan ukuran tipe yang memegang pola. Ukuran parameter digunakan untuk menentukan jumlah byte yang akan diinisialisasi, dan harus kelipatan dari pattern_size. Menyediakan offset memulai inisialisasi pada offset dalam buffer. 20XX
  • 8. presentation title 8 A.3. IMAGE ROTATION Rotasi adalah rutinitas pemrosesan gambar yang umum dengan aplikasi dalam pencocokan, penyelarasan, dan algoritma berbasis gambar lainnya. Input untuk rutinitas rotasi citra adalah citra, sudut rotasi , dan titik di mana rotasi dilakukan. Koordinat titik (x, y) jika diputar dengan sudut terhadap (x0, y0) menjadi (x’ , y’ ), seperti yang ditunjukkan oleh persamaan berikut: Dengan membuat setiap item kerja sesuai dengan lokasi keluaran, kita dapat secara intuitif memetakan ID global setiap item kerja ke (x’ , y’ ). Kami juga dapat menentukan (x0, y0), yang sesuai dengan pusat gambar, segera setelah kami memuat gambar dari disk. Oleh karena itu, kami memiliki dua persamaan dan dua yang tidak diketahui, yang memungkinkan kami untuk menghitung lokasi yang dibaca oleh setiap item kerja saat menghitung rotasi: Pseudocode OpenCL C : 20XX
  • 9. presentation title 9 A.3. IMAGE ROTATION Berikut ini menunjukkan implementasi kernel OpenCL yang melakukan rotasi gambar : Di kernel ini, kami menggunakan read_imagef() (Baris 38), karena kami bekerja dengan data floating-point. Seperti semua fungsi yang digunakan untuk mengakses gambar, read_imagef() mengembalikan tipe data vektor 4-lebar. Karena kita bekerja dengan gambar saluran tunggal (dijelaskan selanjutnya), kita hanya tertarik pada komponen pertama, yang dapat kita akses dengan menambahkan .x ke akhir pemanggilan fungsi (Baris 38). Panggilan untuk menulis ke gambar juga mengambil vektor 4-lebar terlepas dari tipe data sebenarnya, tetapi akan ditangani dengan tepat oleh perangkat keras. Oleh karena itu, pada pemanggilan write_imagef(), kita harus mentransmisikan hasilnya ke vektor float4 (Baris 41). 20XX
  • 10. presentation title 10 A.3. IMAGE ROTATION Memberikan CLK_NORMALIZED_COORDS_FALSE menentukan bahwa kita akan menggunakan pengalamatan berbasis piksel. OpenCL juga memungkinkan sejumlah mode pengalamatan digunakan untuk menangani akses di luar batas. Untuk contoh ini, kami menggunakan CL_ADDRESS_CLAMP, menetapkan bahwa nilai yang dihasilkan oleh akses di luar batas adalah 0 untuk saluran RG dan B, dan mengembalikan 0 atau 1 untuk saluran A (berdasarkan format gambar). Hasilnya adalah piksel di luar batas dikembalikan sebagai hitam. Akhirnya, sampler memungkinkan kita untuk menentukan mode penyaringan. Mode pemfilteran menentukan bagaimana nilai diperoleh dari koordinat yang disediakan oleh akses gambar. Opsi CLK_FILTER_NEAREST hanya mengembalikan elemen gambar yang paling dekat dengan koordinat yang disediakan. Atau, CLK_FILTER_LINEAR menyediakan interpolasi linier dari piksel di sekitarnya. Di versi OpenCL sebelumnya, ukuran konfigurasi item kerja global untuk NDRange harus kelipatan dari ukuran grup kerja di setiap dimensi. Di OpenCL 2.0, perangkat diperlukan untuk mendukung NDRanges yang kelompok kerjanya dapat berupa ukuran variabel di batas. Mengalokasikan objek gambar untuk menampung gambar input dan output dilakukan menggunakan panggilan clCreateImage() API. Gambar yang akan menyimpan tipe vektor empat elemen harus menggunakan CL_RGBA untuk urutan saluran dalam format gambar. Sebagai alternatif, dalam gambar di mana setiap piksel direpresentasikan sebagai nilai tunggal (misalnya piksel dari gambar skala abu-abu atau elemen matriks), data dapat ditentukan untuk hanya menggunakan satu saluran dengan menentukan CL_R untuk urutan saluran. Saat menentukan tipe data dalam format gambar, seseorang menentukan tipe integer dengan kombinasi penandatanganan dan ukuran. Misalnya, CL_SIGNED_INT32 adalah bilangan bulat bertanda 32-bit, dan CL_UNSIGNED_INT8 setara dengan karakter tidak bertanda dalam C. Data titik-mengambang presisi tunggal ditentukan oleh CL_FLOAT 20XX
  • 11. presentation title 11 A.3. IMAGE ROTATION Berikut ini menunjukkan kode host yang digunakan untuk membuat gambar input dan output untuk contoh ini. Setelah gambar dibuat, kami menggunakan panggilan API clEnqueueWriteImage() untuk mentransfer data input dari host ke objek gambar. 20XX
  • 12. presentation title 12 A.4. Image Convolution 20XX Dalam pemrosesan gambar, konvolusi adalah algoritma yang umum digunakan yang memodifikasi nilai setiap piksel dalam suatu gambar dengan menggunakan informasi dari piksel tetangga. Kernel konvolusi, atau filter, menjelaskan bagaimana setiap piksel akan dipengaruhi oleh tetangganya. Algoritma konvolusi bekerja dengan mengulangi setiap piksel dalam gambar sumber. Untuk setiap piksel sumber, filter dipusatkan di atas piksel, dan nilai filter mengalikan nilai piksel yang dihamparkannya. Sejumlah produk kemudian diambil untuk menghasilkan nilai piksel baru. Gambar berikut memberikan representasi visual untuk algoritma ini. Gambar (b) menunjukkan efek blurring filter adan Gambar (c) menunjukkan efek embossing filter pada gambar sumber yang sama seperti yang terlihat pada Gambar (a).
  • 13. presentation title 13 A.4. Image Convolution 20XX Di OpenCL, menggunakan objek memori gambar untuk mengimplementasikan konvolusi memiliki beberapa keunggulan dibandingkan implementasi menggunakan buffer. Pengambilan sampel gambar dilengkapi dengan opsi untuk menangani akses di luar batas secara otomatis dan juga menyediakan cache data dua dimensi yang dioptimalkan. Implementasi OpenCL dari kernel konvolusi cukup mudah, dan ditulis mirip dengan versi C. Dalam versi OpenCL, kami membuat satu item kerja per piksel keluaran, menggunakan paralelisme untuk menghapus dua loop dari luar. Tugas setiap item kerja adalah menjalankan dua loop terdalam, yang melakukan operasi penyaringan. Kernel OpenCL lengkap ditunjukkan dibawah ini :
  • 14. presentation title 14 A.4. Image Convolution 20XX Dalam contoh diatas, kami mendeklarasikan piksel (nilai yang dikembalikan oleh akses gambar) dan jumlah (data yang dihasilkan yang disalin ke gambar keluaran) sebagai tipe float4. Kami kemudian menggunakan komponen-x saat mengumpulkan nilai piksel yang difilter (Baris 45). Filter konvolusi adalah kandidat sempurna untuk memori konstan dalam contoh ini karena semua item kerja mengakses elemen yang sama setiap iterasi. Cukup menambahkan kata kunci _ _constant dalam signature fungsi (Baris 7) menempatkan filter dalam memori konstan.
  • 15. presentation title 15 A.4. Image Convolution 20XX Pada contoh sebelumnya, kami membuat sampler langsung dari dalam kernel. Dalam contoh ini, kami membuat sampler menggunakan API host dan meneruskannya sebagai argumen kernel. Untuk contoh ini, kita akan menggunakan C++ API (konstruktor sampler C++ memiliki parameter yang identik). The host API signature untuk membuat sampler di C adalah sebagai berikut: Dengan menggunakan C++ API, the signature adalah sebagai berikut: Sampler yang digunakan oleh kernel kami dapat dibuat sebagai berikut:
  • 16. presentation title 16 A.5 PRODUCER-CONSUMER 20XX Untuk beberapa aplikasi, produsen dan konsumen dapat beroperasi secara bersamaan, dengan data pemrosesan konsumen seperti yang dihasilkan oleh produsen. OpenCL 2.0 telah memperkenalkan objek memori pipa untuk memfasilitasi aplikasi konsumen produsen. Pipa memiliki potensi untuk menawarkan utilitas terlepas dari apakah kernel produsen-konsumen dijalankan secara serial atau bersamaan. Dalam contoh ini, akan menggunakan pipa untuk membuat aplikasi produsen-konsumen menggunakan kernel yaitu konvolusi dan histogram. Kernel konvolusi pertama-tama akan memproses gambar, kemudian ketika piksel keluaran dihasilkan, piksel tersebut akan diteruskan ke kernel histogram menggunakan pipa . Kernel konvolusi akan dijalankan pada GPU perangkat, dan kernel histogram akan dijalankan pada CPU perangkat. Mengeksekusi kernel pada beberapa perangkat juga akan memungkinkan eksekusi dua kernel secara bersamaan, dengan pipa yang digunakan untuk meneruskan data saat dihasilkan.
  • 17. presentation title 17 A.5 PRODUCER-CONSUMER 20XX Pipes adalah objek memori yang berisi data (disebut paket) yang diatur dengan struktur first in first out (FIFO). Memori yang dialokasikan untuk pipa ada di memori global, dan secara bersamaan dapat diakses oleh banyak kernel. Data yang disimpan dalam pipa tidak dapat diakses dari host. Untuk kernel tertentu, pipa dapat dibaca saja (_ _read_only) atau hanya tulis (_ _write_only), tetapi tidak dapat dibaca-tulis. Jika sebuah pipa tidak ditentukan sebagai hanya baca atau tulis saja, kompilator akan secara default hanya baca. Pipa dideklarasikan sebagai parameter kernel dengan menentukan pipa kata kunci, tipe akses, dan tipe data paket. Untuk mengakses pipa, OpenCL C menyediakan fungsi intrinsik read_pipe() dan write_pipe() dengan tanda tangan berikut:
  • 18. presentation title 18 A.5 PRODUCER-CONSUMER 20XX implementasi kernel untuk aplikasi kita, Secara khusus menargetkan kernel konsumen untuk CPU menggunakan hanya satu item kerja saat membuat histogram. Juga secara eksplisit menargetkan CPU, menempatkan histogram langsung di memori global. Meskipun data yang disimpan dalam pipa tidak dapat diakses dari host, API host masih diperlukan untuk membuat objek pipa. Panggilan API untuk membuat pipa adalah sebagai berikut:
  • 19. presentation title 19 A.5 PRODUCER-CONSUMER 20XX Dalam skenario ini, kami tidak akan berasumsi bahwa kedua kernel dijamin untuk berjalan secara bersamaan; oleh karena itu, kita akan membuat objek pipa dengan ukuran yang cukup besar untuk menampung seluruh gambar: Memanfaatkan beberapa perangkat dengan aplikasi ini memerlukan beberapa langkah tambahan dalam penyiapan host dibandingkan dengan contoh yang telah kita lihat sejauh ini. Saat membuat konteks, seseorang harus menyediakan dua perangkat (satu perangkat CPU, dan satu perangkat GPU), dan setiap perangkat memerlukan antrean perintahnya sendiri. Selain itu, objek program sekarang akan digunakan untuk menghasilkan dua kernel. Peluncuran kernel dilakukan dengan memasukkannya ke dalam antrian perintah masing-masing: kernel produsen (konvolusi) akan dimasukkan ke antrian perintah GPU, dan kernel konsumen (histogram) akan dimasukkan ke antrian perintah CPU.
  • 20. presentation title 20 A.6 UTILITY FUNCTIONS Karena OpenCL dimaksudkan untuk menjadi sistem agnostik, beberapa tugas umum tidak dapat dilakukan secara otomatis seperti yang biasa kita lakukan saat menulis program C/C++ biasa. Kabar baiknya adalah setelah diimplementasikan, mereka dapat digunakan kembali untuk semua aplikasi OpenCL di masa mendatang. A. REPORTING COMPILATION ERRORS Ketika mencoba untuk mengkompilasi dan menautkan objek program OpenCL kami (dengan clBuildProgram(), atau clCompileProgram() dan clLinkProgram()), mungkin saja ada kesalahan dalam sumber OpenCL C yang mencegah pembangunan yang berhasil. Dalam hal ini aplikasi host tidak secara otomatis mencetak pesan kesalahan kompiler dan keluar. Sebaliknya, panggilan API OpenCL gagal dengan nilai pengembalian yang sesuai, dan terserah kepada programmer untuk mengambil output kompiler. Ketika objek program OpenCL gagal dibangun, log build dibuat dan disimpan dengan objek program. Log dapat diambil dari panggilan API clGetProgramBuildInfo() dengan meneruskan argumen CL_PROGRAM_BUILD_LOG ke parameter param_name. Serupa dengan panggilan API lain yang telah kita lihat, clProgramBuildInfo() harus dipanggil dua kali: pertama untuk mengetahui ukuran data yang dikembalikan, dan kedua untuk benar-benar mengambil data setelah alokasi ruang yang cukup. 20XX
  • 21. Example 21 A.6 UTILITY FUNCTIONS B. CREATING A PROGRAM STRING Di Bab 3, kita melihat bahwa objek program dibuat dari larik karakter (const char **strings) saat menggunakan panggilan API clCreateProgramWithSource(). Namun, menulis kode sumber OpenCL C secara langsung sebagai array karakter sangat merepotkan. Oleh karena itu, kasus penggunaan yang lebih umum adalah membuat file terpisah yang berisi sumber OpenCL C, dan membaca file tersebut menjadi string dalam program host. . 2022