OpenCL API-k áttekintése
A teljes OpenCL C API
C++
-
A
cl
névtér használata. cl::string
éscl::vector
típusok.- Hibakezelés kivétel objektumokkal.
- Objektumhoz kötött funkciók (metódusok formájában).
cl
és std
tárolók
https://stackoverflow.com/questions/13787012/why-should-i-use-clvector
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
.jar
fájlok formájában érhető el: https://code.google.com/archive/p/javacl/downloads
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#
- A Java-hoz hasonlóan nem túl elterjedt a használata OpenCL esetében.
- https://www.nuget.org/packages/OpenCL.Net
Vektorok összeadása
Tekintsük át a vektorok összeadásához készített programot: VectorAdd.cs
Python
- A PyOpenCL tekinthető a hivatalos változatnak: https://pypi.org/project/pyopencl/
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.