OpenCL: Setup & Hello World
Appearance
Install OpenCL (untuk Nvidia) <syntaxhighligh lang=bash> sudo pacman -S opencl-headers ocl-icd opencl-nvidia </syntaxhighlight> 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