<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenCL%3A_Hello_World_%28lengkap%29</id>
	<title>OpenCL: Hello World (lengkap) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenCL%3A_Hello_World_%28lengkap%29"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=OpenCL:_Hello_World_(lengkap)&amp;action=history"/>
	<updated>2026-11-01T19:55:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=OpenCL:_Hello_World_(lengkap)&amp;diff=543&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;== Core Concepts OpenCL == === Platform &amp; Device === * Platform = driver OpenCL (dari vendor seperti NVIDIA, AMD, Intel) * Device = hardware fisik (GPU, CPU, dll)  === Context === * Seperti &quot;workspace&quot; yang manage semua OpenCL objects * Menghubungkan host (CPU) dengan device (GPU)  === Command Queue === * Antrian tugas yang akan dieksekusi di device * Commands berjalan secara asinkron  === Memory Buffers === * Data harus di-copy dari RAM (host) ke VRAM (device) * Tiga je...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=OpenCL:_Hello_World_(lengkap)&amp;diff=543&amp;oldid=prev"/>
		<updated>2026-01-07T08:04:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;== Core Concepts OpenCL == === Platform &amp;amp; Device === * Platform = driver OpenCL (dari vendor seperti NVIDIA, AMD, Intel) * Device = hardware fisik (GPU, CPU, dll)  === Context === * Seperti &amp;quot;workspace&amp;quot; yang manage semua OpenCL objects * Menghubungkan host (CPU) dengan device (GPU)  === Command Queue === * Antrian tugas yang akan dieksekusi di device * Commands berjalan secara asinkron  === Memory Buffers === * Data harus di-copy dari RAM (host) ke VRAM (device) * Tiga je...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Core Concepts OpenCL ==&lt;br /&gt;
=== Platform &amp;amp; Device ===&lt;br /&gt;
* Platform = driver OpenCL (dari vendor seperti NVIDIA, AMD, Intel)&lt;br /&gt;
* Device = hardware fisik (GPU, CPU, dll)&lt;br /&gt;
&lt;br /&gt;
=== Context ===&lt;br /&gt;
* Seperti &amp;quot;workspace&amp;quot; yang manage semua OpenCL objects&lt;br /&gt;
* Menghubungkan host (CPU) dengan device (GPU)&lt;br /&gt;
&lt;br /&gt;
=== Command Queue ===&lt;br /&gt;
* Antrian tugas yang akan dieksekusi di device&lt;br /&gt;
* Commands berjalan secara asinkron&lt;br /&gt;
&lt;br /&gt;
=== Memory Buffers ===&lt;br /&gt;
* Data harus di-copy dari RAM (host) ke VRAM (device)&lt;br /&gt;
* Tiga jenis: READ_ONLY, WRITE_ONLY, READ_WRITE&lt;br /&gt;
&lt;br /&gt;
=== Program &amp;amp; Kernel ===&lt;br /&gt;
* Program = kumpulan kernel code yang sudah di-compile&lt;br /&gt;
* Kernel = fungsi yang dijalankan parallel di device&lt;br /&gt;
&lt;br /&gt;
=== Execution ===&lt;br /&gt;
* Kernel dijalankan oleh banyak work-items secara parallel&lt;br /&gt;
* Setiap work-item seperti thread yang memproses 1 elemen&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
=== 1. discover hardware (Platform &amp;amp; Device) ===&lt;br /&gt;
* Cari platform (driver) dan device (hardware)&lt;br /&gt;
&lt;br /&gt;
=== 2. create context ===&lt;br /&gt;
* Buat environment untuk manage OpenCL objects&lt;br /&gt;
&lt;br /&gt;
=== 3. command queue ===&lt;br /&gt;
* Buat antrian untuk submit commands ke device&lt;br /&gt;
&lt;br /&gt;
=== 4. allocate memory ===&lt;br /&gt;
* Buat buffers di device memory&lt;br /&gt;
* Copy data dari host ke device&lt;br /&gt;
&lt;br /&gt;
=== 5. create &amp;amp; build program ===&lt;br /&gt;
* Load kernel source code&lt;br /&gt;
* Compile untuk device&lt;br /&gt;
&lt;br /&gt;
=== 6. create kernel &amp;amp; set arguments ===&lt;br /&gt;
* Ambil kernel function dari program&lt;br /&gt;
* Set parameter yang diperlukan&lt;br /&gt;
&lt;br /&gt;
=== 7. execute kernel ===&lt;br /&gt;
* Enqueue kernel untuk dijalankan parallel&lt;br /&gt;
&lt;br /&gt;
=== 8. read results ===&lt;br /&gt;
* Copy hasil dari device memory ke host memory&lt;br /&gt;
&lt;br /&gt;
=== 9. cleanup ===&lt;br /&gt;
* Release semua resources&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#define CL_TARGET_OPENCL_VERSION 300&lt;br /&gt;
#include &amp;lt;CL/cl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;streambuf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Fungsi helper untuk membaca source code kernel dari file&lt;br /&gt;
std::string readKernelSource(const char* filename) {&lt;br /&gt;
    std::ifstream file(filename);&lt;br /&gt;
    if (!file.is_open()) {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    std::string source((std::istreambuf_iterator&amp;lt;char&amp;gt;(file)), std::istreambuf_iterator&amp;lt;char&amp;gt;());&lt;br /&gt;
    file.close();&lt;br /&gt;
    return source;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    const std::string kernelPath = &amp;quot;/home/haidhi/Documents/learn/opencl/opencl/vector_add.cl&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 1. PLATFORM &amp;amp; DEVICE - Hardware Discovery&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // PLATFORM: Representasi dari OpenCL implementation (driver dari vendor seperti NVIDIA, AMD, Intel)&lt;br /&gt;
    // Satu sistem bisa punya multiple platform (misal: Intel CPU + NVIDIA GPU)&lt;br /&gt;
    cl_platform_id platform; &lt;br /&gt;
    &lt;br /&gt;
    // DEVICE: Hardware fisik yang akan menjalankan komputasi (GPU, CPU, FPGA, dll)&lt;br /&gt;
    cl_device_id device; &lt;br /&gt;
    &lt;br /&gt;
    cl_int err; &lt;br /&gt;
&lt;br /&gt;
    // Ambil platform pertama yang tersedia&lt;br /&gt;
    err = clGetPlatformIDs(1, &amp;amp;platform, NULL); &lt;br /&gt;
    if (err != CL_SUCCESS) {&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;Error getting platform IDs&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        return 1;&lt;br /&gt;
    }   &lt;br /&gt;
&lt;br /&gt;
    // Coba cari GPU dulu, kalau gagal pakai CPU&lt;br /&gt;
    // CL_DEVICE_TYPE_GPU: Cari device tipe GPU&lt;br /&gt;
    // CL_DEVICE_TYPE_CPU: Fallback ke CPU kalau GPU tidak ada&lt;br /&gt;
    err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &amp;amp;device, NULL);&lt;br /&gt;
    if (err != CL_SUCCESS) {&lt;br /&gt;
        err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &amp;amp;device, NULL);&lt;br /&gt;
        if (err != CL_SUCCESS) {&lt;br /&gt;
            std::cerr &amp;lt;&amp;lt; &amp;quot;Error getting device IDs&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
            return 1;&lt;br /&gt;
        }&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Using CPU device&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    } else {&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Using GPU device&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }   &lt;br /&gt;
&lt;br /&gt;
    // Query informasi device (nama device)&lt;br /&gt;
    char deviceName[128];&lt;br /&gt;
    clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Device: &amp;quot; &amp;lt;&amp;lt; deviceName &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 2. CONTEXT - Execution Environment&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // CONTEXT: Environment yang manage semua OpenCL objects (memory, queues, programs)&lt;br /&gt;
    // Seperti &amp;quot;workspace&amp;quot; atau &amp;quot;session&amp;quot; untuk operasi OpenCL&lt;br /&gt;
    // Context menghubungkan host (CPU) dengan device (GPU/CPU)&lt;br /&gt;
    cl_context context = clCreateContext(nullptr, 1, &amp;amp;device, nullptr, nullptr, nullptr);&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 3. COMMAND QUEUE - Task Scheduler&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // COMMAND QUEUE: Antrian yang menerima commands untuk dieksekusi di device&lt;br /&gt;
    // Commands dieksekusi secara asinkron dan bisa out-of-order (tergantung properties)&lt;br /&gt;
    // Seperti &amp;quot;to-do list&amp;quot; untuk device yang akan diproses secara berurutan&lt;br /&gt;
    cl_command_queue queue = clCreateCommandQueueWithProperties(&lt;br /&gt;
        context,&lt;br /&gt;
        device,&lt;br /&gt;
        nullptr,  // nullptr = default properties (in-order execution)&lt;br /&gt;
        nullptr&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 4. HOST MEMORY - Data di CPU&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // Data input/output yang ada di memori CPU (RAM)&lt;br /&gt;
    const int ARRAY_SIZE = 1024; &lt;br /&gt;
    std::vector&amp;lt;float&amp;gt; a(ARRAY_SIZE, 2.0f);  // Array a: semua isi 2.0&lt;br /&gt;
    std::vector&amp;lt;float&amp;gt; b(ARRAY_SIZE, 3.0f);  // Array b: semua isi 3.0&lt;br /&gt;
    std::vector&amp;lt;float&amp;gt; c(ARRAY_SIZE);         // Array c: untuk hasil&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 5. DEVICE MEMORY - Buffer Objects di GPU/Device&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // BUFFER: Memory object yang ada di device memory (VRAM untuk GPU)&lt;br /&gt;
    // Data harus di-copy dari host memory ke device memory sebelum diproses&lt;br /&gt;
    &lt;br /&gt;
    // Buffer A: READ_ONLY, copy data dari host ke device saat dibuat&lt;br /&gt;
    cl_mem bufA = clCreateBuffer(&lt;br /&gt;
        context, &lt;br /&gt;
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,  // Flags: read-only + copy data&lt;br /&gt;
        sizeof(float) * ARRAY_SIZE,                // Ukuran buffer&lt;br /&gt;
        a.data(),                                  // Source data dari host&lt;br /&gt;
        nullptr&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    // Buffer B: READ_ONLY, copy data dari host ke device&lt;br /&gt;
    cl_mem bufB = clCreateBuffer(&lt;br /&gt;
        context,&lt;br /&gt;
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,&lt;br /&gt;
        sizeof(float) * ARRAY_SIZE, &lt;br /&gt;
        b.data(), &lt;br /&gt;
        nullptr&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    // Buffer C: WRITE_ONLY, hanya untuk output (tidak perlu copy data)&lt;br /&gt;
    cl_mem bufC = clCreateBuffer(&lt;br /&gt;
        context,&lt;br /&gt;
        CL_MEM_WRITE_ONLY,        // Flags: write-only (untuk hasil)&lt;br /&gt;
        sizeof(float) * ARRAY_SIZE, &lt;br /&gt;
        nullptr,                   // Tidak ada initial data&lt;br /&gt;
        nullptr&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 6. PROGRAM - Compiled Kernel Code&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // PROGRAM: Container untuk kernel code yang sudah di-compile&lt;br /&gt;
    // Source code (.cl file) harus dibaca, di-compile, dan di-load ke device&lt;br /&gt;
    &lt;br /&gt;
    // Baca kernel source code dari file&lt;br /&gt;
    const std::string kernelSource = readKernelSource(kernelPath.c_str());&lt;br /&gt;
    const char* sourceCStr = kernelSource.c_str();&lt;br /&gt;
    size_t sourceSize = kernelSource.length();&lt;br /&gt;
    cl_int program_err;&lt;br /&gt;
&lt;br /&gt;
    // Create program dari source code&lt;br /&gt;
    cl_program program = clCreateProgramWithSource(context, 1, &amp;amp;sourceCStr, &amp;amp;sourceSize, &amp;amp;program_err);&lt;br /&gt;
    &lt;br /&gt;
    // Compile program untuk device yang dipilih&lt;br /&gt;
    // Seperti compile C++ code, tapi untuk GPU/device&lt;br /&gt;
    clBuildProgram(program, 1, &amp;amp;device, nullptr, nullptr, nullptr);&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 7. KERNEL - Fungsi yang Dijalankan di Device&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // KERNEL: Function yang akan dieksekusi di device secara parallel&lt;br /&gt;
    // Satu instance kernel dijalankan untuk setiap work-item (seperti thread)&lt;br /&gt;
    &lt;br /&gt;
    // Ambil kernel bernama &amp;quot;vector_mul&amp;quot; dari program&lt;br /&gt;
    cl_kernel kernel = clCreateKernel(program, &amp;quot;vector_mul&amp;quot;, nullptr);&lt;br /&gt;
    &lt;br /&gt;
    // Set arguments untuk kernel (seperti passing parameter ke function)&lt;br /&gt;
    clSetKernelArg(kernel, 0, sizeof(cl_mem), &amp;amp;bufA);  // Arg 0: input buffer A&lt;br /&gt;
    clSetKernelArg(kernel, 1, sizeof(cl_mem), &amp;amp;bufB);  // Arg 1: input buffer B&lt;br /&gt;
    clSetKernelArg(kernel, 2, sizeof(cl_mem), &amp;amp;bufC);  // Arg 2: output buffer C&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 8. EXECUTION - Jalankan Kernel&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // NDRange: N-Dimensional Range - menentukan berapa banyak work-item yang dijalankan&lt;br /&gt;
    // Global size: Total jumlah work-items (threads) yang akan dijalankan&lt;br /&gt;
    size_t globalSize = ARRAY_SIZE;  // 1024 work-items = 1 work-item per elemen array&lt;br /&gt;
    &lt;br /&gt;
    // Enqueue kernel untuk dieksekusi&lt;br /&gt;
    // 1D execution: 1024 work-items akan dijalankan parallel&lt;br /&gt;
    // Setiap work-item memproses 1 elemen array&lt;br /&gt;
    clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &amp;amp;globalSize, nullptr, 0, nullptr, nullptr);&lt;br /&gt;
&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 9. TRANSFER RESULTS - Copy dari Device ke Host&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // Read hasil dari device memory (bufC) ke host memory (c.data())&lt;br /&gt;
    // CL_TRUE: blocking read (tunggu sampai selesai)&lt;br /&gt;
    clEnqueueReadBuffer(queue, bufC, CL_TRUE, 0, sizeof(float) * ARRAY_SIZE, c.data(), 0, nullptr, nullptr);&lt;br /&gt;
    &lt;br /&gt;
    // Print hasil&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;First 5 results: &amp;quot;;&lt;br /&gt;
    for (int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; c[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;  // Harusnya: 2.0 * 3.0 = 6.0&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    &lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // 10. CLEANUP - Release semua OpenCL resources&lt;br /&gt;
    // ============================================================&lt;br /&gt;
    // Penting untuk release memory dan objects untuk hindari memory leak&lt;br /&gt;
    clReleaseMemObject(bufA);&lt;br /&gt;
    clReleaseMemObject(bufB);&lt;br /&gt;
    clReleaseMemObject(bufC);&lt;br /&gt;
    clReleaseKernel(kernel);&lt;br /&gt;
    clReleaseProgram(program);&lt;br /&gt;
    clReleaseCommandQueue(queue);&lt;br /&gt;
    clReleaseContext(context);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>