 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények.

Slides:



Advertisements
Hasonló előadás
 Folyékony anyagok  Füstszerű jelenségek  Felhők  Festékek.
Advertisements

Tester Developer Architect Project Manager Business Analyst Designer Database Professional.
Nyereményjátékok és a Facebook - aki mer, az nyer!?”
21 Years of Partnership and Innovation 1989 Citrix Systems founded 2010 Citrix signed licensing agreement with Microsoft for NT Server Introduced Independent.
2 8 Kiadás éve / Platform Server (1000’s of users) Workgroup (Dozens of users) Desktop (Single User) Laptop Tablet PC Windows CE.
System Statistical Functions. CPU Tesztelése SELECT AS busy Vissza adja milliszekundumban, mennyi időt töltött munkával a szerverünk indítás.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Bevezetés a tárgyakhoz Tárgyak  Objects are the containers for values of a specified type  Objects are either signals, variables or constants  Once.
FelültöltésVHDL Felültöltés (Overloading) n Áttekintés n Példák.
 Lineáris egyenlet  algebrai egyenlet  konstansok és első fokú ismeretlenek  pl.: egyenes egyenlete  Lineáris egyenletrendszer  lineáris egyenletek.
 Adat- és feladat párhuzamos modell  Az ISO C99 szabvány részhalmaza  párhuzamos kiegészítésekkel  Numerikus műveletek az IEEE754 alapján  Beágyazott.
 CUDA mint architektúra  Párhuzamos feldolgozásra optimalizált architektúra  CUDA mint GPGPU keretrendszer  Runtime és Driver API  CUDA C/C++  NVCC.
 Bővítmény rendszer  Az OpenGL bővítményeihez hasonló  A specifikiáció természetes fejlődése ▪ Gyártó specifikus bővítmény ▪ Általános bővítmények.
 Gauss szűrő uniform sampler2D colorMap; const float kernel[9] = float[9]( 1.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 2.0, 1.0); out vec4 outColor; void main(){
 Fény fotonok szimulációja  Nem változtatja meg a frekvenciát ütközéskor  Homogén és inhomogén közegben.
Socket programozás Példák
Neo4j bevezető Rácz Gábor
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
TRANZIENS ADATTÁROLÁS State objektum Egy alkalmazásszintű gyűjtemény (Dictionary), mely Tombstone esetén megőrzi tartalmát a memóriában kulcs/érték párokként.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
Programozás II. 3. Gyakorlat C++ alapok.
Delegátumok C#-ban Krizsán Zoltán iit 1.0.
Course Situation and Event Driven Models for Multilevel Abstraction Based Virtual Engineering Spaces Óbuda University John von Neumann Faculty of Informatics.
Hogyan (mivel és mit) naplózzunk?
Oracle multimédia Kiss Attila Információs Rendszerek Tanszék
VFP xBase adatkezelés - munkaterületek - DML - DDL - navigáció - eljárások, függvények - vezérlési szerkezetek - változók - képernyő IO - mintaprogram.
A megértés körei Binzberger Viktor Budapest Műszaki és Gazdaságtudományi Egyetem Filozófia és Tudománytörténet Tanszék.
PHP VI Adatbázisok, MySQL
PHP V Osztályok, Objektumok. Osztály class Person { var $name; // tulajdonság, változó function getName() { // metódus, tagfüggvény return $this->name;
PHP II. Tömbök, sztringek
Multimédiás programok készítése Macromedia Director fejlesztői környezetben 4. előadás Készítette: Kosztyán Zsolt
Edge Transport Routing and AV/AS Enterprise Network External SMTP servers Phone system (PBX or VOIP) Client Access Client connectivity Web services.
Windows Server 2008 { PowerShell }
Alertet indíthat egy: SQL Server esemény (LOG) SQL Server performancia érték WMI events Alert végezhet: Operátor értesítést JOB indítás (válasz az eseményre)
Prog1, C a gyakorlatban Magasszintű programozási nyelvek 1 mérnök informatikus BSc előadás Bátfai Norbert egyetemi tanársegéd
Projektmunka az NI-nál
Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése: Virtuális.
WAP, WML Felhasznált források: Developer’s Guide v1.2 (Nokia WAP Toolkit) WML Reference v1.1.
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 1 13.Állományok, bejegyzések 14.Folyamok 15.Közvetlen hozzáférésű állomány.
Hasznos ismeretek Hogyan bővítsük ismereteinket AVRDUDEflags -E noreset.
Könyvtár, csomag és alprogramokVHDL Könyvtár, csomag és alprogram n Library és use n Package n Alprogramok –Procedure –Function –Resolution function Egy.
A D programozási nyelv Angeli Dávid. Nagy vonalakban  C++  
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Motor IIII. Vezérlés Szécsi László. Letöltés diák: //l09-engine4.ppt.
Pozitron-Emission Tomography Reconstruction (A computer graphics view) Szirmay-Kalos László.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for.
Kamera, 3D, transzformációk Szécsi László. Math.zip kibontása az Egg projectkönyvtárba – float2, foat3, float4 típusok, HLSL-ben megszokott műveletekkel.
Geometry instancing Szécsi László. copy-paste-rename gg009-Gui folder vcxproj, filters átnevezés solution/add existing project rename project working.
User interface Szécsi László. Egg projectben DXUTgui.cpp – CDXUTDialogResourceManager::CDXUTDialogReso urceManager() m_SpriteBufferBytes11 = 0; ezt kihagyták,
 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.
 Kvantált kép fényesség értékei: G [ 0, Gmax ]  G fényességű pontok száma: P(G)
GPGPU labor XII. Tomográfiás rekonstrukció. Kezdeti teendők Tantárgy honlapja, Monte Carlo szimuláció A labor kiindulási alapjának letöltése (lab12_base.zip),
GPGPU labor X. Monte Carlo módszerek. Kezdeti teendők Tantárgy honlapja, Monte Carlo módszerek A labor kiindulási alapjának letöltése (lab10_base.zip),
GPGPU labor IX. Lineáris egyenletrendszerek megoldása.
GPGPU Labor 15.. Párhuzamos primitívek Map Reduce Scan Histogram Compact.
GPGPU labor II. GPU mint vektor processzor. Kezdeti teendők Tantárgy honlapja, Bevezetés – Alap könyvtárak letöltése Tantárgy honlapja, GPU mint vektor.
HTTP kommunikáció Androidon HttpClient-en keresztűl HttpPost/HttpGet objektum használatával HttpClient execute metódusának meghívása.
- Group Policy - Group Policy Preferences - Group Policy 4x5 - Optimális munkakörnyezet – az első lépcsőfok.
P árhuzamos és Elosztott Rendszerek Operációs Rendszerei Rövid András
A Visual Basic nyelvi elemei
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
GPGPU – CUDA 1..
OpenCL bővítmények.
Script nyelvek előadás
Lineáris egyenletrendszerek megoldása
OpenCL bevezetés II..
Függvénysablonok használata
Előadás másolata:

 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények

 Platformok lekérdezése  num_entries: lekérdezendő platformok száma  platforms: platformok azonosítója  num_platforms: lekérdezett platformok száma cl_int clGetPlatformIDs(cl_int num_entries, cl_platform_id *platforms, cl_uint *num_platforms)

 Platformok lekérdezése  lekérdezzük a paraméterek számát  lefoglaljuk a a megfelelő méretű memóriát  lekérdezzük a paramétereket cl_uint num_platforms = 0; clGetPlatformIDs(0, NULL, &num_platforms) cl_platform_id *platforms = new cl_platform_id[num_platforms]; clGetPlatformIDs(num_platforms, platforms, NULL);

 Platform információk  platform: a kiválasztott platform azonosítója  param_name: a lekérdezendő információ  param_value_size: információ max mérete (byte)  param_value: az információ tárolója  param_value_size_ret: a visszaadott információ mérete 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 információk  CL_PLATFORM_PROFILE ▪ FULL_PROFILE ▪ EMBEDDED_PROFILE  CL_PLATFORM_VERSION  CL_PLATFORM_NAME  CL_PLATFORM_VENDOR  CL_PLATFORM_EXTENSIONS

 A platformon elérhető eszközök  device_type: a lekérdezendő eszközök típusa ▪ CL_DEVICE_TYPE_CPU ▪ CL_DEVICE_TYPE_GPU ▪ CL_DEVICE_TYPE_ACCELERATOR ▪ CL_DEVICE_TYPE_DEFAULT ▪ CL_DEVICE_TYPE_ALL cl_int clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices)

 Eszköz információk  device: a lekérdezendő eszköz azonosítója  param_ name: a lekérdezendő információ ... 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)

 Általános eszköz információk  CL_DEVICE_TYPE  CL_DEVICE_COMPILER_AVAILABLE  CL_DEVICE_NAME  CL_DEVICE_VENDOR  CL_DEVICE_VERSION  CL_DRIVER_VERSION  CL_DEVICE_EXTENSIONS

 Számítási információk  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

 Memória információk  CL_DEVICE_MAX_PARAMETER_SIZE  CL_DEVICE_GLOBAL_MEM_SIZE  CL_DEVICE_MAX_MEM_ALLOC_SIZE  CL_DEVICE_LOCAL_MEM_SIZE  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE  CL_DEVICE_MAX_CONSTANT_ARGS  CL_DEVICE_IMAGE_SUPPORT

 Kontextus létrehozása  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 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)

 Kontextus létrehozása  pfn_notify: callback függvény a hibakezeléshez ▪ aszinkron hibajelzés a kontextusban ▪ szál biztos implementáció szükséges (thread-safe) ▪ paraméterei ▪ const char* errinfo: a hiba szövege ▪ const void* private_info: implementáció függő hibakereső adat ▪ size_t cb: a private_info mérete (byte) ▪ void *user_data: felhasználói 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)

 Kontextus létrehozása  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)

 Kontextus számláló növelése  Kontextus számláló csökkentése  Kontextus információk  param_value ▪ CL_CONTEXT_REFERENCE_COUNT ▪ CL_CONTEXT_DEVICES ▪ CL_CONTEXT_PROPERTIES cl_int clRetainContext(cl_context context) cl_int clReleaseContext(cl_context context) cl_int clGetContextInfo(cl_context context, cl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Parancs sor létrehozása  properties ▪ CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ▪ CL_QUEUE_PROFILIN_ENABLE cl_command_queue clCreateCommandQueue(cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret)

 Parancs sor számláló növelése  Parancs sor számláló csökkentése  Parancs sor információk  param_value ▪ CL_QUEUE_CONTEXT ▪ CL_QUEUE_DEVICE ▪ CL_QUEUE_PROPERTIES cl_int clRetainCommandQueue(cl_command_queue queue) cl_int clReleaseCommandQueue(cl_command_queue queue) cl_int clGetCommandQueueInfo(cl_command_queue queue, cl_command_queue_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Eseményre várakozás  implicit szinkronizáció  Barrier  explicit szinkronizáció cl_int clEnqueueWaitForEvents(cl_command_queue queue, cl_uint num_events, const cl_event *event_list) cl_int clEnqueueBarrier(cl_command_queue queue)

 Parancs sor ürítés  minden hívás eljutott az eszközig  minden hívás lefutott cl_int clFlush(cl_command_queue queue) cl_int clFinish(cl_command_queue queue)

 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ő

 Memória objektum létrehozása  size: a buffer mérete (byte)  host_ptr: előre lefoglalt memória terület cl_mem clCreateBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret)

 Memória objektum létrehozása  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_mem clCreateBuffer(... cl_mem_flags flags,...)

 Memória objektum olvasása  buffer: az olvasandó memória objektum  blocking_read: bevárja-e az olvasás befejeztét cl_int clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Memória objektum olvasása  offset: az olvasandó memória ofszete  cb: az olvasandó méret  ptr: az olvasás célja cl_int clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Memória objektum olvasása  num_events_in_wait_list: bevárandó események száma  event_wait_list: bevárandó események  event: az olvasás végét jelző esemény cl_int clEnqueueReadBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Memória objektum írása  A paraméterek hasonlóak az olvasáshoz cl_int clEnqueueWriteBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Memória objektum másolása  src_buffer, src_offset: a másolandó memória  dst_buffer, dst_offset: a cél memória  cb: a másolandó memória mérete cl_int clEnqueueCopyBuffer(cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Memória objektum számláló növelése  Memória objektum számláló csökkentése  Memória objektum információk  param_value ▪ CL_MEM_TYPE ▪ CL_MEM_SIZE ▪ CL_MEM_MAP_COUNT cl_int clRetainMemObject(cl_mem memobj) cl_int clReleaseMemObject(cl_mem memobj) cl_int clGetMemObjectInfo(cl_mem memobj, cl_mem_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Memória objektum mappelése  map_flags ▪ CL_MAP_READ ▪ CL_MAP_WRITE void* clEnqueueMapBuffer(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event, cl_int *errcode_ret)

 Memória objektum mappelése  buffer: a kimappelendő memória objektum  mapped_ptr: host pointer a mappelt memóriára cl_int clEnqueueUnmapBuffer(cl_command_queue command_queue, cl_mem buffer, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 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

 Program objektum létrehozása  strings: a program forrása  lengths: a források hossza  count: a források száma cl_program clCreateProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret)

 Program objektum létrehozása  device_list: a program álltal használt eszközök  binaries: az eszközökhöz tartozó bináris kód  binary_status: sikeres volt-e a betöltés cl_program clCreateProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret)

 Program objektum számláló növelése  Program objektum számláló csökkentése  Program objektum információk  param_value ▪ CL_PROGRAM_DEVICES ▪ CL_PROGRAM_SOURCE ▪ CL_PROGRAM_BINARIES cl_int clRetainProgram(cl_program program) cl_int clReleaseProgram(cl_program program) cl_int clGetProgramInfo(cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Program fordítása  program: a fordítandó program objektum  num_devices: az eszközök száma a fordításhoz  device_list: a céleszközök listája cl_int clBuildProgram(cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char* options, void (*pfn_notify)(...), void *user_data)

 Program fordítási opciók  Preprocesszor ▪ -D name ▪ -D name = definition ▪ -I dir  Matematikai viselkedés ▪ -cl-single-precision-constant ▪ -cl-denorms-are-zero  Fordító viselkedés ▪ -w ▪ -Werror

 Program fordítási opciók  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

 Fordítási információk  CL_PROGRAM_BUILD_STATUS  CL_PROGRAM_BUILD_OPTIONS  CL_PROGRAM_BUILD_LOG  Fordító törlése  A fordító törölhető a memóriából  Csak tanács, új program esetén betöltődik ismét cl_int clUnloadCompiler(void) 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)

 Kernel objektum létrehozása  kernel_name: a létrehozandó kernel neve  Kernel objektum számláló növelése  Kernel objektum számláló csökkentése cl_kernel clCreateKernel(cl_program program, const char *kernel_name, cl_int *errcode_ret) cl_int clRetainKernel(cl_kernel kernel) cl_int clReleaseKernel(cl_kernel kernel)

 Kernel objektum információk  param_name ▪ CL_KERNEL_FUNCTION_NAME ▪ CL_KERNEL_NUM_ARGS ▪ CL_KERNEL_PROGRAM cl_int clGetKernelInfo(cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Kernel paraméterek  arg_index: a beállítandó paraméter indexe  arg_size: a beállítandó paraméter mérete  arg_value: a beállítandó paraméter értéke cl_int clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value)

 Kernel paraméterek  Kernel  Paraméter beállítás __kernel void sampleKernel(const float count, __global float* data){... } clSetKernelArg(sampleKernel, 0, sizeof(float), fData); clSetKernelArg(sampleKernel, 1, sizeof(dataPtr), &dataPtr);

 Munkacsoport paraméterek  pname ▪ CL_KERNEL_WORK_GROUP_SIZE ▪ CL_KERNEL_COMPILE_WORK_GROUP_SIZE ▪ CL_KERNEL_LOCAL_MEM_SIZE cl_int clGetKernelWorkGroupInfo(cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info pname, size_t param_value_size, void *param_value, size_t *param_value_size_ret)

 Kernel futtatás  work_dim: az NDRange dimenziója  global_work_offset: NULL  global_work_size: a teljes problématér mérete  local_work_size: egy munka csoport mérete cl_int clEnqueueNDRangeKernel(cl_command_queue queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

 Host program void square(){ cl_kernel squareKernel = createKernel(program, "square"); const int data_size = 1024; float* inputData = (float*)malloc(sizeof(float) * data_size); for(int i = 0; i < data_size; ++i){ inputData[i] = i; } cl_mem clInputData = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * data_size, NULL, NULL); clEnqueueWriteBuffer(commands, clInputData, CL_TRUE, 0, sizeof(float) * data_size, inputData, 0, NULL, NULL) ); //...

 Host program float* data = (float*)malloc(sizeof(float)*data_size); cl_mem clData = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * data_size, NULL, NULL); clSetKernelArg(squareKernel, 0, sizeof(cl_mem), &clInputData); clSetKernelArg(squareKernel, 1, sizeof(cl_mem), &clData); clSetKernelArg(squareKernel, 2, sizeof(int), &data_size); size_t workgroupSize = 0; clGetKernelWorkGroupInfo(squareKernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(workgroupSize), &workgroupSize, NULL); clEnqueueNDRangeKernel(commands, squareKernel, 1, NULL, &workSize, &workgroupSize, 0, NULL, NULL) ); clFinish(commands);

 Host program clEnqueueReadBuffer(commands, clData, CL_TRUE, 0, sizeof(float) * data_size, data, 0, NULL, NULL); int wrong = 0; for(int i = 0; i < data_size; ++i){ if(data[i] != inputData[i] * inputData[i]){ wrong++; } std::cout << "Wrong squares: " << wrong << std::endl; clReleaseKernel(squareKernel); free(data); free(inputData); }

 OpenCL program __kernel void square(__global float* inputData, __global float* outputData, const int data_size){ __private int id = get_global_id(0); outputData[id] = inputData[id] * inputData[id]; }