OpenCL API-k áttekintése

A teljes OpenCL C API

C++

A C elemek C++-os megfelelői

C C++
cl_platform cl::Platform
cl_device cl::Device
cl_context cl::Context
cl_program cl::Program
cl_kernel cl::Kernel

Platformok lekérdezése

std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);

Eszközök lekérdezése

std::vector<cl::Device> devices;
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices);

Kontextus létrehozása

cl::Context context(devices);
std::vector<cl::Device> contextDevices = context.getInfo<CL_CONTEXT_DEVICES>();

Eszközadatok lekérdezése

for (const cl::Device& device : contextDevices) {
    std::string name = device.getInfo<CL_DEVICE_NAME>();
    std::cout << "Device name: " << name << std::endl;
}

Hibakezelés

try {
    // ...
} catch (cl::Error e) {
    std::cout << e.what() << "(code: " << e.err() << ")" << std::endl;
}

C++ példák

Tekintsük át a https://github.com/KhronosGroup/OpenCL-CLHPP/tree/main/examples oldalon lévő példákat!

C++ AMP

Accelerated Massive Parallelism: C++ AMP Overview

Java

Több alternatív megközelítéssel is találkozni Java-ban.

Aparapi

  • https://aparapi.com/
  • Az AMD adta ki 2010-ben.
  • Csak AMD/ATI videókártyákkal működik.
  • A kernelek definiálását magasabb szinten teszi lehetővé.

Kernel készítése Java-ban

Nézzük meg, hogy hogyan tudunk kernelt definiálni és futtatni: Getting started!

JavaCL

A C elemek JavaCL-es megfelelői

C JavaCL
cl_platform CLPlatform
cl_device CLDevice
cl_context CLContext
cl_program CLProgram
cl_kernel CLKernel

Platformok lekérdezése

CLPlatform[] platforms = JavaCL.listPlatforms();

Eszközök lekérdezése

CLDevice[] devices = platforms[0].listAllDevices(true);

Kontextus létrehozása

CLContext context = JavaCL.createBestContext();

Command Queue létrehozása

CLQueue queue = context.createDefaultQueue((CLDevice.QueueProperties[])null);

Program létrehozása

CLProgram program = context.createProgram("... Kernel source");

JavaCL demo-k

Tekintsük át a demo-kat: JavaCL demo-k!

C#

Vektorok összeadása

Tekintsük át a vektorok összeadásához készített programot: VectorAdd.cs

Python

A C elemek PyOpenCL-es megfelelői

C PyOpenCL
cl_platform Platform
cl_device Device
cl_context Context
cl_program Program
cl_kernel Kernel

Platformok lekérdezése

import pyopencl as cl

for platform in cl.get_platforms():
    print(platform.get_info(cl.platform_info.NAME))

Eszközök lekérdezése

devices = platform.get_devices()

Kontextus létrehozása

context = cl.Context(devices)

Command Queue létrehozása

queue = cl.CommandQueue(
    context,
    devices[0],
    cl.command_queue_properties.PROFILING_ENABLE)

PyOpenCL dokumentáció

Tekintsük át a PyOpenCL dokumentációját: https://documen.tician.de/pyopencl/!

Feladatok

1. OpenCL verziók

Vizsgáljuk meg, hogy milyen változásokon ment keresztül az OpenCL az egyes verziókban!

2. További nyelvek

Vizsgáljunk meg további programozási nyelveket (pl.: Haskell), amelyekkel szintén lehet OpenCL-t használni.

3. Saját API tervezés

A C (host API) alapján próbáljon meg egy magas szintű nyelven példákat adni, hogy hogyan lenne egyszerűbb az OpenCL használata.