Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

GPU & GPU Programlama Dili OpenCL Caglar Ozbek Department of Elec. & Telecom. Engin. Dogus University.

Benzer bir sunumlar


... konulu sunumlar: "GPU & GPU Programlama Dili OpenCL Caglar Ozbek Department of Elec. & Telecom. Engin. Dogus University."— Sunum transkripti:

1 GPU & GPU Programlama Dili OpenCL Caglar Ozbek Department of Elec. & Telecom. Engin. Dogus University

2 Konu Başlıkları 2 GPU’larin tanimi ve ozellikleri. GPGPU Nedir? Neden GPU? GPU programlama dilleri -Nvidia CUDA -OpenCL OpenCL Vector Toplama ornegi. Gecmıste Atlas’da GPU ile ilgili neler yapildi. OpenCL ustunde neler yaptim?

3 GPU  GPU ( Graphics Processing Unit)  Grafik isleme birimi, Ekran Karti olarak goruntunun islendigi ve monitore verildigi cihaz olarak bilinir.  GPU lar aslen grafik canlandirma ve oyunlar icin gelistirilmislerdir.  Ev kullanicilari icin oyun amacli kullanilirken,profesyonel kullanicilar CAD uyugulamarinda sik kullanirlar.  Piyasadaki buyuk oyuncular Nvidia, AMD/ATI, INTEL dir. 3

4 Introduction to GPU (2)  GPU Programlama dilleri eskiden sadece Grafik programlama dili olarak gecerdi ve oldukca zordu.  Sadece Profesyonellere yonelik bir dil olup ev kullancilari sadece urunu kullanmakla yetinemkteydi.  Ilerleyen yillarla genel amacli GPU kullanimi desteklemek amaciyala GPGPU (General Purpose Graphic Prcessin Unit) ortaya cikti.  Bu sayede artik agir islem yuklu olan hesaplamalar GPU lar kullanilarak da hesaplanabilecekti. 4

5 Neden GPU??  Cok esnek ve guclu islemciler olarak gelistirildirler..(Ozellikle Nvidia) -Performans -Gelecek -Programlanabilirlik -Sonuclarda Duyarlilik -Kelepir -Enerji Tuketimi -Heterojen Programlama 5

6 PERFORMANS  GPU islem yapabilme kapasitesi her gecen yil exponansiyel olarak artmaktadir CPU larin yillik gelisme orani x1.5 CPU larin 10 yillik gelisme orani x60 GPU larin yillik gelisme orani x2 GPU larin 10 yillik gelisme orani x1000  2006 da CPU lara gore yaklasik 10 kat daha performansli calisan GPU lar gunumuzde yaklasik 50 kat performans artisi saglamaktadirlar.  Tesla S870 = 1.38 TFlop/s  Nvidia GTX 280 = 622 GFlop/s 6

7 GELECEK  Nvidia bunyesinde bulununan unlu bilim adami William Dally’e gore ** Grafik Cipleri 5000 cekirdege sahip olacak ** Yaklasik 20 TFLOP islem yapabilme kapasitesine sahip olacak ** 11 nm uretim teknolojisiyle uretilecek (Bu sayede transistor sayilari akil almaz rakamlara ulasak) 7

8 PROGRAMLANABILIRLIK  Eskiden GPU Programlama dilleri cok zor olsada artik Genel Amacli kullamilabilen GPU larla birlikte programlama dili her kesimden kullaniciya hitap etmektedir.  GPU mimarileri ticari kaygilardan oturu sirketler tarafindan gizli tutulmaktadirlar..Ama mimariden bagimsiz olarak programlanabilirler,  GPU programlama frameworklerine bakildiginda *C / C++ / C # * MATLAB * FORTRAN * OCTAVE Gibi programlama dillerini destekledigi gorulebilir. 8

9 DUYARLILIK  GPU programlamanin ilk ciktigi yillarda single precision olmasi dezavantajlarindan biri olsa da suan duble precision dir..  Pipeline lar boyunca 32-bit floating point i destekler..  Kullanildigi cogu alanda sagladigi duyarlilik orani yeterlidir… 9

10 KELEPIR  PC ‘lerin fiyatlarini belirleyen temel faktor CPU laridir.. -CPU un yetersiz ise PC ni degistir. -GPU un yetersiz ise son donem Nvidia modellerini 200$ almak mumkun. 10  CPU larin gelisimi kucuk adimlarla saglansa bile ENERJI tuketimi ayni oranda artmaktadir.  GPU larda ise enerji tuketimi CPU lara oranla cok azdir. ENERJI TUKETIMI

11 Heterojen Programlama Heterojen Programlama, en yüksek verimi alabilmek için uygulamaların uygulamanın tipine göre PC’nin ana iki işlemcisi olan CPU ve GPU’dan ayrı ayrı faydalanmaları gerektiği fikrini temel alır 11

12 NEDEN GPU’lar Hizla Gelismektedirler  GPU’larin mimari dogasi geregiyle transistor sayisinin arttirilmasi durumunu desteklemektedir..  Oyun sektoru dunya pazarinda yer tutan en onemli yatirimlari bu amaca yatirmaktadir.  Nvidia, AMD.Intel gibi buyuk sirketler artik CPU larin gelisiminden yana degIL GPU gelisimine destek vermektedirler. 12

13 Neden GPU’lar Hizlidir??  GPU larda data isleme sureci icin daha cok transistor kullanilmaktadir. Data akisi ve bellekleme zaman kaybedilecek islerden arindirilmistir.  GPU lar data akis control mekanizmasindan odun vererek chip uzerinde data cok islemci barindirirlar.  GPU Onbellek leri kucuk olmasindan kaynakli data cekme yazma gecikme suresini kisaltmaktadir. 13 Transistor = ALU

14 GPU larin Kullanildiklari Alanlar –Image And Volume Processing –Scientific Computing: physically-based simulation, linear system solution, –Monte Carlo Methods 14

15 GPU Programming Language 15

16 CUDA & OpenCL  OpenCL and CUDA GPGPU lar icin yaratilmis frameworklerdir.  Bu frameworkler hem GPU uzerinde is yapacak kernel kodunu kosturmak icin komutlar icerir hem de CPU uzerinden kernel kodunu cagiracak komular icerir.  Bu iki framework un de mimarileri ver calisma prensipleri benzerdir..Fakat onemli bir noktada ayrilmaktadirlar. 16

17 CUDA (Compute Unified Device Architecture)  CUDA suan en populer frameworktur.  Acik kaynak bir dil degildir ve her turlu degisimden, gelisimden Nvidia sorumludur.  Ne yazikki donanim spesifik olma ozelligi tasimaktadir. Ve sadece CUDA lisansli Nvidia urunleri uzerinde calisir.  Son gelismeler isiginda Ocelot frameworku ile diger marka donanimlarda kullanilabilme ozelligi taninmistir fakat performans dususu beklenmelidir.Ocelot  CUDA genel anlamda c ve c++ dilleri uzerinde kurulmusur. 17

18 CUDA BELLEK MIMARISI Local Memory  Thread Shared Memory  Threads in Block Global Memory  Bloks in Device Hiz = Local > Shared > Global > Constant Memory > texture Memory 18

19 Ornegin amaci: –Basit bir ornek fakat concept olarak CUDA anlasilacaktir Tam olarak ne Yapiyor? –En buyuk elementi p olan array’in taranmasi(any of 0 to 9) –Bu array’de kac tane 3 bulunmaktadir? - Bloktaki her thread 4 eleman tarayacaktir. 16 elemanli bu array bir seferde bir blok tarafindan taranacaktir. 3657352609639172 threadIdx.x = 0 examines in_array elements 0, 4, 8, 12 threadIdx.x = 1 examines in_array elements 1, 5, 9, 13 threadIdx.x = 2 examines in_array elements 2, 6, 10, 14 threadIdx.x = 3 examines in_array elements 3, 7, 11, 15 } CUDA Programlama Modeli Örnek Kod

20 MAIN PROGRAM: Initialization CPU üzerinde input ve output için bellek ayırımı yapılır Input icin sayılar atanır. Host Fonksiyonu çağırılır Her thread den alınan outputlar için son output hesaplanır. Sonuc ekrana bastırılır. HOST FUNCTION: GPU uzerınde input ve output değerini kopyalamak için bellekler ayrılır. İnput değerleri bu belleğe kopyalanır. Grid/block ayarlanır Global function çağırılır. GPU dan alınan output değerı Host a kopyalanır. GLOBAL FUNCTION: Thread ler bütün arayı ilk olarak tarar. Device fonksiyonu çağırılır ki 3 ile karşılaştırma yapsın Local sonuc hesaplanır DEVICE FUNCTION: 3 ile karşılaştırma yapar Eğer sayı 3 ise 1 döndür, değilse 0

21 OpenCL (Open Computing Language)  OpenCL belli bir standarda ulasmis ve populerligi her gecen gun artan bir framework’tur.  OpenCL CUDA gibi sadece spesifik bir donanimda calismak yerine butun markalarin GPU larinda calismaktadirlar. --Ortak bir calismanin sonucudur. Apple onculuk etmistir. NVIDIA, Intel, AMD, IBM tarafindan gelistirilmistir. Suan Khronos grubunun controlundedir.  In OpenCL in data yi paralel isleyecek kismi yani kernel codunun C diliyle yazilmasi gerekmektedir.  OpenCL programciya yazdigi kodun her ortamda calisabildigi bir platform sunar.. (CPUs,GPUs,DSPs …) 21

22 OpenCL Hardware Gorunumu * Bir host bir ya da birden fazla GPU ile baglantili olabilir. * Her GPU birden fazla Compute Unit’e sahiptir. * Her Compute Unit bircok Processing element e sahiptir. 22 Example: Tesla C1060 30 Compute Units x 8 Processing Elements = 240 Processing Elements

23 OpenCL Platform Model Private Memory -Per work-item Local Memory -Shared within a workgroup Global/Constant Memory -Visible to all workgroups Host Memory -On the CPU WorkgroupWork- 23

24 OpenCL & CUDA Differences  MAIN DIFFERENCES: a)Donanim bagimliligi b)Terminoloji c)Performans a) Daha once belirtildigi uzere CUDA  Nvidia bagimliligi vardir. b)Mimarilerinde Terminolojik farkliliklar vardir. Cuda Term  OpenCL Term GPU Device Shared Memory Local Memory Block / Thread Work Group / Wok Item 24

25 25 c) Nvidia Donaniminin uzerinde arastirmlarin tecrubelerine gore OpenCL in performansinin %10 daha dusuk oldugu belirtilmistir..  Pazarlama Stratejisi DIFFERENCES (2) c)Performans

26 OpenCL Software Model 26 Host Program Kernels *PC nin cihazlarini sorgulama *Sorgu sonucuna gore icerik yaratma *Icerige bagli hedef bellek bolumlendirmesinin yapilmasi *Kernel ‘in yaratilmasi ve compile edilmesi *Senkronizasyon icin komut orgusunun yapilmasi *OpenCL kaynaklarinin silinmesi,temizlenmesi *C diliyle yazilan ana islem barindiran parca

27 Vector Addition Kernel Code __kernel void vector_add(__global const int *A, __global const int *B, __global int *C) { // Get the index of the current element to be processed int i = get_global_id(0); // Do the operation C[i] = A[i] + B[i]; } 27

28 28 Host Code int main(void) { // 2 tane Input vectoru yaratıyoruz. int i; const int LIST_SIZE = 10; float *A = (float*)malloc(sizeof(int)*LIST_SIZE); float *B = (float*)malloc(sizeof(int)*LIST_SIZE); for(i = 0; i < LIST_SIZE; i++) { A[i] = i; B[i] = i+5; } // Kernel source kodunu source_str nın ıcıne gomuyoruz. FILE *fp; char *source_str; size_t source_size;

29 29 // Platform ve cıhaz bılgılerı alınır. cl_platform_id platform_id = NULL; cl_device_id device_id = NULL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms); ret = clGetDeviceIDs( platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices); // OpenCL ıcerıklerı yaratılır. cl_context context = clCreateContext( NULL, 1, &device_id, NULL, NULL, &ret); // Komut orgusu olusturulır. cl_command_queue command_queue = clCreateCommandQueue(context, device_id, 0, &ret); // Devıce uzerınde her deger ıcın ara bellekler olsturulur. cl_mem a_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, LIST_SIZE * sizeof(int), NULL, &ret); cl_mem b_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, LIST_SIZE * sizeof(int), NULL, &ret); cl_mem c_mem_obj = clCreateBuffer(context, CL_MEM_WRITE_ONLY, LIST_SIZE * sizeof(int), NULL, &ret);

30 30 // A ve B ınput vectorlerımızın degerlerı GPU uzerındekı olusturulan ara belleklere yazılır ret = clEnqueueWriteBuffer(command_queue, a_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), A, 0, NULL, NULL); ret = clEnqueueWriteBuffer(command_queue, b_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), B, 0, NULL, NULL); // Kernel kaynagından program olusturulur. cl_program program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret); // Program buıld edılır. ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); // Toplama yapacak OpenCL kernelı yaratılır. cl_kernel kernel = clCreateKernel(program, "vector_add", &ret); // Kernel kaynagındakı argumanlar tanıtılır. ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&a_mem_obj); ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&b_mem_obj); ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&c_mem_obj);

31 31 // OpenCL kernelı execute edılır. ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL); // GPU uzerındekı ara bellekte bulunan sonuc degerlerı Local varıable olan C ye yazılır. float *C = (float*)malloc(sizeof(int)*LIST_SIZE); ret = clEnqueueReadBuffer(command_queue, c_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), C, 0, NULL, NULL); // sonucları goruntulenır. for(i = 0; i < LIST_SIZE; i++) printf("%f + %f = %f\n", A[i], B[i], C[i]); // Hafızada yer tutan bolumler bosaltılır.. ret = clFlush(command_queue); ret = clFinish(command_queue); ret = clReleaseKernel(kernel); ret = clReleaseProgram(program); ret = clReleaseMemObject(a_mem_obj); ret = clReleaseMemObject(b_mem_obj); ret = clReleaseMemObject(c_mem_obj); ret = clReleaseCommandQueue(command_queue); ret = clReleaseContext(context); free(A); free(B); free(C); return 0; }

32 GPUs & ATLAS Experiment  2011 Subat ayinda Edinburg Universitesi onculugunde GPU uygulamari Atlas Deneyi ‘inde Test edilmistir.. * ATLAS Trigerinin Level 2 software sisteminde bulunan Track Reconstruction IDScan algoritmasinin Z-finder bolumunde Nvidia CUDA kullanilmistir. *High level Trigger systemininde eventlerin reconstruct edilmesi surecinde kullanilan Kalman Filter methodunun hizini arttirmak icin Nvidia CUDA kullanilmistir. 32 https://twiki.cern.ch/twiki/bin/view/Main/AtlasEdinburghGPUComputing

33 Proje Sonuclari (Nvidia CUDA)  IZ finder algorithm yaziliminda, CUDA streamleri kullanilarak CPU sonuclarina gore x35 kat performans artisi (hizlanma) gorulmustur. 33 Goruldugu gibi eger agir islem yuku olan bir program varsa ve iyi optimize sekilde GPU programlama dillerine uygulanmissa Sonuc mukemmel.

34 Proje Sonuclari (2)  CUDA nin Kalman Filter methoduna uygulandigi bolumde ise Event sayisinin 3000 track seviyesinde x5 kat arttigi gozlemlenmistur.. 34

35 Bu Projenin Arkasindaki Kisitlamalar Nelerdi?? Tabiki Proje Donanimi!!! **Cunku proje Donanim bakimindan spesifik calisan CUDA Programlama dilinin ustune kuruluydu. Bu nedenle butun donanim Nvidia idi. 35

36 OpenCL Zamani… Bu hardware kisitlamalari nedeniyle ATLAS deneyinde her platformda kusursuz calisan OpenCL in kullanilmasi kesinlikle dusunulebilir.. 36

37 Bu gune kadar ben neler yaptim??  Oncelikle belirtmek gerekirki GPU dillerinin performans arttirdigini gorebilmek ancak agir islem yuku olan code lara uygulanmasi optimize sekilde uygulanarak gorulebilir. My OpenCL algorithms: **Hello world (Data parallel => H-e-l-l-o-w-o-r-l-d ) **Vector Addition **Vector Multiplication **Proof Code of GPUs’ Data Parallel Working Principle **Proof Code of GPUs’ Task Parallel Working Principle **Unoptimized Pi calculation **Moving Average ( still not working) 37

38 OpenCL Vector Addition 38

39 Nvidia CUDA Vector Addition 39 For same calculation OpenCL RESULT ~10% Performance Increase

40 OpenCL Vector Multiplication 40

41 Nvidia CUDA Vector Multiplication 41 For the same Caculation OpenCL RESULT ~10 % Performance Increase

42 Pi Calculation Comparison btw C++ & OpenCL 42 Simple C++ Code with 1M loop 0.125 second0.390 second On the very simple Pi calculation code, we could not observe the efficiency due to the structure of the C++ code… Unoptimize OpenCL code

43 43 #include using namespace std; static long double num_steps=8000000; double step; int main () { long double i;long double x,pi,sum=0.0; step=1.0/(double)num_steps; for (i=0;i<num_steps; i++) { x=(i+0.5)*step; sum=sum+4.0/(1.0+x*x); } pi=step*sum; cout<< " pi = " << pi <<endl; return 0; } Görüldüğü gibi; *Komutlar birbirine bağımlıdır *Loop içinde son değere kadar sonuçlar birbirlerini etkilemektedirler. *Bu Code OpenCL e uygulamak için uygun durumda değildir. İlk önce OpenCL'e uygulanacak kodun yapısı anlaşılmalıdır.Eğer doğru code doğru şekilde OpenCL e uygulaz ise PERFORMANS düşer.

44 44 Teşekkürler


"GPU & GPU Programlama Dili OpenCL Caglar Ozbek Department of Elec. & Telecom. Engin. Dogus University." indir ppt

Benzer bir sunumlar


Google Reklamları