Google Summer of Code 2015 OpenCL image support for the r600g driver
Képek:
a
Min szeretnék dolgozni? Kapcsolatfelvétel a mentorral
Project proposal Célok Miért jó ez? Milestone-ok Architektúra vázlata
Proposalok elbírálása
Kapcsolatfelvétel a szervezettel Fejlesztési környezet Folyamatok Szokások
Kép balra:
OpenCL image support for the r600g driver
GPGPU Képek: AMD Accelerated Parallel Processing OpenCL Programming Guide
OpenCL image support for the r600g driver OpenCL: GPGPU keretrendszer GPU-side: OpenCL C nyelv kernel void vec_add(global float *a, global const float *b) { int i = get_global_id(0); a[i] += b[i]; }
OpenCL image support for the r600g driver OpenCL: GPGPU keretrendszer GPU-side: OpenCL C nyelv CPU-side: C, C++ lib [...] // inicializáció cl_program program = clCreateProgramWithSource(...); cl_kernel kernel = clCreateKernel(program, "vec_add", [...]); clSetKernelArg(kernel, 0, sizeof(cl_mem), &mem_buf_a); clSetKernelArg(kernel, 1, sizeof(cl_mem), &mem_buf_b); size_t work_size[] = {16}; clEnqueueNDRangeKernel(q, kernel, [...], work_size, [...]);
OpenCL image support for the r600g driver A GPU hatékonyan kezel képeket
OpenCL image support for the r600g driver A GPU hatékonyan kezel képeket Interpoláció Kép:
OpenCL image support for the r600g driver A GPU hatékonyan kezel képeket Interpoláció Swizzling (cache!) x = x1 x0 bits y = y1 y0 bits mem_addr = y1 x1 y0 x0 bits Kép:
OpenCL image support for the r600g driver A GPU hatékonyan kezel képeket Interpoláció Swizzling Formátum-konverzió XRedGreenBlue 15 bits RedGreenBlue 5 bits6 bits5 bits RedGreenBlue 8 bits
OpenCL image support for the r600g driver OpenCL image és sampler objektumok const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_NEAREST; kernel void red_to_green(read_only image2d_t input, write_only image2d_t output) { size_t x = get_global_id(0); size_t y = get_global_id(1); uint4 color = read_imageui(input, sampler, (int2)(x, y)); // do something with color write_imageui(output, (int2)(x, y), color); }
OpenCL image support for the r600g driver mesa: 3D, video, GPGPU libek gyűjteménye 3D rendering API-k (pl. OpenGL) Video gyorsító API-k (pl. VAAPI) Eszközillesztők (driverek) r600g: AMD R600, R700, Evergreen és Northern Islands GPU-k g szuffix: Gallium
Gallium 3D Függ-e az alábbitól? APIHWOS IgenNemNem* NemIgenNem Igen
OpenCL state tracker: clover API-szintű absztakciók menedzselése Buffer, image, sampler Adatmozgatás Események OpenCL C –> GPU asm (most: R600 ISA) Device Driver adja a targetet Clang+LLVM fordít Clang OpenCL frontend LLVM AMDGPU backend Feladat: Fordítsa le a képekkel kapcsolatos OpenCL kódot is!
LLVM Fordítóprogram-keretrendszer LLVM IR: ASM szintű gépfüggetlen nyelv SSA: Static Single = internal constant [14 x i8] c"hello, world\0A\00" declare define %argc, i8** %argv) nounwind { entry: %tmp1 = getelementptr [14 x i32 0, i32 0 %tmp2 = call i32 i8* %tmp1 ) nounwind i32 0 }
LLVM Front-end: nyelv -> LLVM Back-end: LLVM -> ? gépi kód ASM szövege Másik nyelv LLVM bitkód Bitkódok összelinkelhetőek Rengeteg optimalizációs algoritmus
OpenCL C -> R600 ISA Front-End: Clang Built-In Library: libclc LLVM bitkód library Feladat: Kép típus Képi builtinek Képek: AMD Accelerated Parallel Processing OpenCL Programming Guide
Device Driver: r600g API-szintű absztrakciók -> GPU-szintű fogalmak GPU „felparaméterezése”: regiszterek Kernel kezdőcíme Erőforrások kezdőcímei, metaadatai: memóriaterületek nézetei Nézetek VTX/TEX: csak olvasható nézet, vertex és texture bufferekre RAT (aka UAV): írható/olvasható nézet Van belőlük több (VTX0, VTX1, RAT5 stb.) Erőforrások leképezése Kernel input -> VTX0 Global bufferex -> VTX1, RAT0 read_only képek -> VTXn (n >= 2) write_only képek -> RATn (n >= 1)
Kép: Evergreen Family Instruction Set Architecture
Implementált feature-ök Képek metaadatai (dimenziók, pixelformátum) get_image_* Adatok küldése a kernelnek Képek olvasása és írása read_image* write_image* Csak 2D támogatott Sampler objektumok Csak kernelparaméterben Tesztek
Open-Source projektek mesa: maga a driver LLVM: OpenCL C fordításához libclc: OpenCL C beépített függvények piglit: tesztek Kevés patch került upstream-be (még)
Linkek Blog: zogi-gsoc2015.blogspot.comzogi-gsoc2015.blogspot.com GSoC: LLVM Language Reference: llvm.org/docs/LangRef.htmlllvm.org/docs/LangRef.html Evergreen ISA: developer.amd.com/wordpress/media/2012/10/AMD_Evergreen- Family_Instruction_Set_Architecture.pdf developer.amd.com/wordpress/media/2012/10/AMD_Evergreen- Family_Instruction_Set_Architecture.pdf