Jump to content

OpenCL: Setup & Hello World

From Haidhi Wiki
Revision as of 08:25, 2 January 2026 by SanzSkuy (talk | contribs)

Install OpenCL (untuk Nvidia)

sudo pacman -S opencl-headers ocl-icd opencl-nvidia

main.cpp

#include <CL/cl.h>
#include <iostream>
#include <vector>

const char* kernelSource = R"(
__kernel void vector_add(__global const float* a,
                         __global const float* b,
                         __global float* c) {
    int gid = get_global_id(0);
    c[gid] = a[gid] + b[gid];
}
)";

int main() {
    const int ARRAY_SIZE = 1024;
    
    // Host data
    std::vector<float> a(ARRAY_SIZE, 1.0f);
    std::vector<float> b(ARRAY_SIZE, 2.0f);
    std::vector<float> c(ARRAY_SIZE);
    
    // Get platform
    cl_platform_id platform;
    clGetPlatformIDs(1, &platform, nullptr);
    
    // Get device
    cl_device_id device;
    clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, nullptr);
    
    // Create context
    cl_context context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, nullptr);
    
    // Create command queue
    cl_command_queue queue = clCreateCommandQueue(context, device, 0, nullptr);
    
    // Create buffers
    cl_mem bufA = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                  sizeof(float) * ARRAY_SIZE, a.data(), nullptr);
    cl_mem bufB = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                                  sizeof(float) * ARRAY_SIZE, b.data(), nullptr);
    cl_mem bufC = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
                                  sizeof(float) * ARRAY_SIZE, nullptr, nullptr);
    
    // Create program
    cl_program program = clCreateProgramWithSource(context, 1, &kernelSource, nullptr, nullptr);
    clBuildProgram(program, 1, &device, nullptr, nullptr, nullptr);
    
    // Create kernel
    cl_kernel kernel = clCreateKernel(program, "vector_add", nullptr);
    
    // Set arguments
    clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufA);
    clSetKernelArg(kernel, 1, sizeof(cl_mem), &bufB);
    clSetKernelArg(kernel, 2, sizeof(cl_mem), &bufC);
    
    // Execute kernel
    size_t globalSize = ARRAY_SIZE;
    clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &globalSize, nullptr, 0, nullptr, nullptr);
    
    // Read results
    clEnqueueReadBuffer(queue, bufC, CL_TRUE, 0, sizeof(float) * ARRAY_SIZE, c.data(), 0, nullptr, nullptr);
    
    // Verify results
    std::cout << "OpenCL Hello World - Vector Addition\n";
    std::cout << "First 5 results: ";
    for (int i = 0; i < 5; i++) {
        std::cout << c[i] << " ";
    }
    std::cout << "\nExpected: 3.0 for all elements\n";
    
    // Cleanup
    clReleaseMemObject(bufA);
    clReleaseMemObject(bufB);
    clReleaseMemObject(bufC);
    clReleaseKernel(kernel);
    clReleaseProgram(program);
    clReleaseCommandQueue(queue);
    clReleaseContext(context);
    
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(opencl_hello C CXX)

set(CMAKE_C_STANDARD 11)

find_package(OpenCL REQUIRED)

add_executable(main main.cpp)

target_link_libraries(opencl_hello OpenCL::OpenCL)

Lalu cara run

mkdir build && cd build
cmake ..
make
./main