OpenCL modul 2. óra: Első rész
OpenCL API fontos eljárások 3 Példaprojekt Üres Lekérdezések OpenGL / OpenCL együttműködés
Hasznos linkek http://www.khronos.org/registry/cl/sdk/1.1/docs/man/ xhtml/ Webes specifikáció http://www.khronos.org/registry/cl/specs/opencl- 1.1.pdf PDF formátumú specifikáció https://code.google.com/p/opencl-book-samples/ Az OpenCL Programming Guide könyv példakódjai
cl_int clgetplatformids( cl_int num_entries, cl_platform_id *platforms, cl_uint *num_platforms); num_entries: platforms: num_platforms: lekérdezendő elemek száma platform-azonosítók platformok száma C++ vector<platform> platforms; Platform::get(&platforms);
cl_int clgetplatforminfo( cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); platform: param_name: param_value_size: param_value: param_value_size_ret: a kiválasztott platform azonosítója a lekérdezendő információ információ max mérete (byte) az információ tárolója a visszaadott információ mérete
param_name: a lekérdezendő információ cl_platform_info CL_PLATFORM_PROFILE CL_PLATFORM_VERSION CL_PLATFORM_NAME CL_PLATFORM_VENDOR CL_PLATFORM_EXTENSIONS Használat C C++ try { ret = clgetplatforminfo(platform_id, CL_PLATFORM_NAME, sizeof(string), string, NULL); platform.getinfo<cl_platform_name >(); } catch(error error) { }
cl_int clgetdeviceids( cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices) device_type: a lekérdezendő eszközök típusa cl_device_type CL_DEVICE_TYPE_CPU CL_DEVICE_TYPE_GPU CL_DEVICE_TYPE_ACCELERATOR CL_DEVICE_TYPE_DEFAULT CL_DEVICE_TYPE_ALL C++ vector<device> devices; platform.getdevices(cl_device_type_default, &devices);
01_Empty Feladat 1: Listázd ki minden platform nevét! Feladat 2: Listázd ki mindegyik platformhoz, hogy hány eszközt tartalmaz!
cl_int clgetdeviceinfo( cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) C++ string name = device.getinfo<cl_device_name>();
cl_device_info CL_DEVICE_TYPE CL_DEVICE_COMPILER_AVAILABLE CL_DEVICE_NAME CL_DEVICE_VENDOR CL_DEVICE_VERSION CL_DEVICE_EXTENSIONS C++ string name = device.getinfo<cl_device_name>();
cl_device_info CL_DEVICE_MAX_COMPUTE_UNITS CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS CL_DEVICE_MAX_WORK_ITEM_SIZES CL_DEVICE_MAX_WORK_GROUP_SIZE CL_DEVICE_AVAILABLE
cl_device_info CL_DEVICE_MAX_PARAMETER_SIZE CL_DEVICE_MAX_MEM_ALLOC_SIZE CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE CL_DEVICE_MAX_CONSTANT_ARGS CL_DEVICE_GLOBAL_MEM_SIZE CL_DEVICE_LOCAL_MEM_SIZE CL_DEVICE_IMAGE_SUPPORT
01_Empty Feladat3: Listázd ki mindegyik eszköz nevét és globális memóriájának méretét! 02_Queries
cl_context clcreatecontext( const cl_context_properties *props, cl_uint num_devices, const cl_device_id *devices, void (*pfn_notify)(...), void *user_data, cl_int *errcode_ret); props: tulajdonság érték lista CL_CONTEXT_PLATFORM cl_platform_id num_devices: a kontextushoz tartozó eszközök száma device: a kontextushoz tartozó eszközök listája pfn_notify: callback függvény a hibakezeléshez user_data: felhasználói információ a pfn_notify függvény kapja meg errcode_ret: hiba információ
cl_context clcreatecontext( const cl_context_properties *props, cl_uint num_devices, const cl_device_id *devices, void (*pfn_notify)(...), void *user_data, cl_int *errcode_ret); props: cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0 }; tulajdonság érték lista C++ Context context( CL_DEVICE_TYPE_GPU, cps );
cl_context clcreatecontext( const cl_context_properties *props, cl_uint num_devices, const cl_device_id *devices, void (*pfn_notify)(...), void *user_data, cl_int *errcode_ret); pfn_notify: callback függvény a hibakezeléshez aszinkron hibajelzéshez szálbiztos implementáció kell a függvényhez Paraméterek: const char* errinfo: const void* private_info: size_t cb: void *user_data: a hiba szövege implementáció függő hibakereső adat a private_info mérete (byte) felhasználói információ
clretaincontext(cl_context context) Referencia-számláló növelése clreleasecontext(cl_context context) Referencia-számláló csökkentése clgetcontextinfo(cl_context context, ); cl_context_info CL_CONTEXT_REFERENCE_COUNT CL_CONTEXT_DEVICES CL_CONTEXT_PROPERTIES
02_Queries (Kontextus létrehozása)
cl_command_queue clcreatecommandqueue( cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret); properties CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE CL_QUEUE_PROFILING_ENABLE
Implicit szinkronizáció Eseményre várakozás cl_int clenqueuewaitforevents( cl_command_queue queue, cl_uint num_events, const cl_event *event_list); Explicit szinkronizáció Barrier cl_int clenqueuebarrier(cl_command_queue queue);
Minden hívás elküldése az eszközre cl_int clflush(cl_command_queue queue); Minden hívás fusson le az eszközön cl_int clfinish(cl_command_queue queue);
clretaincommandqueue(cl_command_queue queue) Referencia-számláló növelése clreleasecommandqueue(cl_command_queue queue) Referencia-számláló csökkentése clgetcommandqueueinfo( cl_command_queue queue, cl_command_queue_info param_name, ) cl_command_queue_info CL_QUEUE_CONTEXT CL_QUEUE_DEVICE CL_QUEUE_PROPERTIES CL_QUEUE_REFERENCE_COUNT
Buffer objektum lineáris memória terület skalár, vektor, struktúra típus pointeren keresztül címezhető Image objektum 2D, 3D memória terület előre definiált textúra formátumok samplereken keresztül címezhető
cl_mem clcreatebuffer( cl_context context, cl_mem_flags flags, size_t size, // a buffer mérete (byte) void *host_ptr, // előre lefoglalt memória terület cl_int *errcode_ret) cl_mem_flags CL_MEM_READ_WRITE CL_MEM_WRITE_ONLY CL_MEME_READ_ONLY CL_MEM_USE_HOST_PTR CL_MEM_ALLOC_HOST_PTR CL_MEME_COPY_HOST_PTR
cl_int clenqueuereadbuffer( cl_command_queue command_queue, cl_mem buffer, // az olvasandó memória objektum cl_bool blocking_read, // bevárja-e az olvasás befejeztét? size_t offset, // az olvasandó memória offszete size_t cb, // az olvasandó méret void *ptr, // az olvasás célja cl_uint numeventsinwaitlist, // bevárandó események száma const cl_event *event_wait_list, // bevárandó események cl_event *event) // az olvasás végét jelző esemény cl_int clenqueuewritebuffer(cl_command_queue command_queue, );
cl_int clenqueuecopybuffer( cl_command_queue command_queue, cl_mem src_buffer, // a másolandó memória cl_mem dst_buffer, // a cél memória size_t src_offset, // a másolandó memória offszete size_t dst_offset, // a cél memória offszete size_t cb, // a másolandó memória mérete cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
cl_int clretainmemobject(cl_mem memobj) Referencia-számláló növelése cl_int clreleasememobject(cl_mem memobj) Referencia-számláló csökkentése cl_int clgetmemobjectinfo(cl_mem memobj, cl_mem_info param_name, ) Memória objektum információk cl_mem_info CL_MEM_TYPE, CL_MEM_FLAGS, CL_MEM_SIZE, CL_MEM_MAP_COUNT, CL_MEM_HOST_PTR, CL_MEM_REFERENCE_COUNT, CL_MEM_CONTEXT, CL_MEM_ASSOCIATED_MEMOBJECT, CL_MEM_OFFSET
Program objektum Kontextus információk Program forrása vagy bináris reprezentáció Az utolsó sikeresen lefordított program Fordítási információk fordítási opciók Log Kernel objektumok száma
cl_program clcreateprogramwithsource( cl_context context, cl_uint count, // a források száma const char **strings, // a program forrása const size_t *lengths, // a források hossza cl_int *errcode_ret)
cl_program clcreateprogramwithbinary( cl_context context, cl_uint num_devices, const cl_device_id *device_list, // a program álltal használt eszközök const size_t *lengths, const unsigned char **binaries, // az eszközökhöz tartozó bináris kód cl_int *binary_status, // sikeres volt-e a betöltés cl_int *errcode_ret)
cl_int clbuildprogram( cl_program program, // a fordítandó program objektum cl_uint num_devices, // az eszközök száma a fordításhoz const cl_device_id *device_list, // a céleszközök listája const char* options, // programfordítási opciók void (*pfn_notify)(...), void *user_data)
Matematikai viselkedés -cl-single-precision-constant -cl-denorms-are-zero Fordító viselkedés -w -Werror Optimalizáció -cl-opt-disable -cl-strict-aliasing -cl-mad-enable -cl-no-signed-zeros -cl-unsafe-math-optimizations -cl-finite-math-only -cl-fast-relaxed-math OpenCL 1.1 Reference / 5.6.3 Build Options
cl_int clgetprogrambuildinfo( cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) cl_program_build_info CL_PROGRAM_BUILD_STATUS CL_PROGRAM_BUILD_OPTIONS CL_PROGRAM_BUILD_LOG stb. OpenCL 1.1 Reference / 5.6.3 Build Options
cl_int clretainprogram(cl_program program) cl_int clreleaseprogram(cl_program program) cl_int clgetprograminfo( cl_program program, cl_program_info param_name, ) cl_program_info CL_PROGRAM_DEVICES CL_PROGRAM_SOURCE CL_PROGRAM_BINARIES stb.
cl_kernel clcreatekernel( cl_program program, const char *kernel_name, cl_int *errcode_ret) cl_int clgetkernelinfo( cl_kernel kernel, cl_kernel_info param_name, ) cl_kernel_info CL_KERNEL_FUNCTION_NAME CL_KERNEL_NUM_ARGS CL_KERNEL_PROGRAM
cl_int clsetkernelarg( cl_kernel kernel, cl_uint arg_index, // az állítandó paraméter indexe size_t arg_size, // mérete const void *arg_value) // értéke OpenCL C kernel code kernel void hello(const int count, global float* data) { } C clsetkernelarg(hellokernel_id, 0, sizeof(int), datacount); clsetkernelarg(hellokernel_id, 1, sizeof(dataptr), &dataptr); C++ hellokernel.setarg(0, datacount); hellokernel.setarg(1, sizeof(dataptr), &dataptr);
cl_int clgetkernelworkgroupinfo( cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info pname, ) cl_kernel_work_group_info CL_KERNEL_WORK_GROUP_SIZE CL_KERNEL_COMPILE_WORK_GROUP_SIZE CL_KERNEL_LOCAL_MEM_SIZE
cl_int clenqueuendrangekernel( cl_command_queue queue, cl_kernel kernel, cl_uint work_dim, // az NDRange dimenziója const size_t *global_work_offset, // NULL const size_t *global_work_size, // a teljes problématér mérete const size_t *local_work_size, // egy munka csoport mérete cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) cl_int clenqueuetask (cl_command_queue queue, ) cl_int clenqueuenativekernel (cl_command_queue queue, )
03_GLCL_Interoperation Textúra módosítása VBO módosítása Feladat: Hullámforma textúra kirajzolása Feladat: Mandelbrot halmaz Házi: 3D hullám
Köszönöm a figyelmet!