Google Summer of Code 2015 OpenCL image support for the r600g driver
Képek: http://www.google-melange.com
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: http://goo.gl/snp5l4
OpenCL image support for the r600g driver
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: http://goo.gl/escxdy
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: http://www.slideshare.net/shripadthite/jobtalk
OpenCL image support for the r600g driver A GPU hatékonyan kezel képeket Interpoláció Swizzling Formátum-konverzió X Red Green Blue 1 5 bits 5 bits 5 bits Red Green Blue 5 bits 6 bits 5 bits Red Green Blue 8 bits 8 bits 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
https://en.wikipedia.org/wiki/gallium3d
Gallium 3D Függ-e az alábbitól? API HW OS Igen Nem Nem* Nem Igen Nem Igen Igen 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 Assignment @.str = internal constant [14 x i8] c"hello, world\0a\00" declare i32 @printf(i8*,...) define i32 @main(i32 %argc, i8** %argv) nounwind { entry: %tmp1 = getelementptr [14 x i8]* @.str, i32 0, i32 0 %tmp2 = call i32 (i8*,...)* @printf( 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.com GSoC: www.google-melange.com LLVM Language Reference: llvm.org/docs/langref.html Evergreen ISA: developer.amd.com/wordpress/media/2012/10/amd_evergreen- Family_Instruction_Set_Architecture.pdf