190 likes | 377 Views
به نام خدا. استفاده عمومیاز پردازندههای گرافیکی GPGPU تهیه کننده: منصور صفری استاد راهنما: مهندس مه لقا افراسیابی بهار 1392. فهرست. معماری پردازندهها تفاوت پردازندههای گرافیکی با پردازندههای اصلی ( GPU vs CPU ) برنامه نویسی موازی
E N D
استفاده عمومیاز پردازندههای گرافیکی GPGPU تهیه کننده: منصورصفری • استاد راهنما: • مهندس مه لقا افراسیابی بهار 1392
فهرست • معماری پردازندهها • تفاوت پردازندههای گرافیکی با پردازندههای اصلی (GPU vs CPU) • برنامه نویسی موازی • پردازشهای مناسب برای اجرا با پردازندههای گرافیکی • چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی • نتیجهگیری Hamedan University of Technology 3 GPGPU
معماری پردازندهها Instruction fetcher Memory • حداقل واحدهای مورد نیاز برای محقق شدن فرآیند پردازش واحدهای حافظه، کنترل و محاسبه و منطق هستند. • دستورالعملها و دادههایی که در حافظه نگهداری میشوند توسط واحد کنترل خوانده شده و مورد بررسی قرار میگیرند. • واحد محاسبه و منطق با توجه به فرمانهای صادر شده از واحد کنترل پردازش مناسب را بر روی دادهها انجام داده با تکمیل فرآیند پردازش نتایج در واحد حافظه باز نویسی میشوند. Instruction decoder Registers ALU Hamedan University of Technology 4 GPGPU
تفاوت پردازندههای گرافیکی با پردازندههای اصلی • امروزه تقریبا تمامیپردازندههایی که در سیستمها استفاده میشوند بیش از یک هسته محاسباتی دارند. CPUهای امروزی بین 2 تا 8 هسته محاسباتی دارند که هرکدام میتواند با سرعت بسیار بالا محاسبات را انجام دهد. • بزرگترین تفاوت CPUها با GPUها در تعداد هستههای محاسباتی (ALU) است. امروزه در GPUها بیش از 512 هسته محاسباتی وجود دارد. Hamedan University of Technology 5 GPGPU
تفاوت پردازندههای گرافیکی با پردازندههای اصلی معماری GPUها (NVIDIA – Fermi) Hamedan University of Technology 6 GPGPU
برنامه نویسی موازی • تمامیسیستمعاملها و سختافزارهای کنونی از قابلیتهای چند برنامگی(multi process) و اجرای چند نخی (multi thread) پشتیبانی میکنند و با آنها سازگاری کامل دارند. با این شرایط تنها عاملی که تعیین میکند یک برنامه به صورت موازی (چند نخی) اجرا شود یا به صورت تک نخی (single thread) ساختار داخلی خود برنامه است. Hamedan University of Technology 7 GPGPU
برنامه نویسی موازی • جدای از قابلیتهایی که سیستم عاملها برای اجرای همزمان برنامهها دارند CPUهای چند هسته ای نیز میتوانند چند پردازش را به صورت واقعا همزمان اجرا کنند. به اینگونه که دستورالعملها به صورت همزمان به هستههای مختلف CPU داده میشود و پردازش میشوند. Hamedan University of Technology 8 GPGPU
پردازشهای مناسب برای اجرا با پردازندههای گرافیکی • از آنجایی که برتری GPUها از نظر تعداد واحدهای ALU نسبت به CPUها کاملا مشهود است و همچنین به این نتیجه رسیدیم که با داشتن تعداد بیشتر ALU میتوان تعداد بیشتری پردازش را به صورت همزمان اجرا کرد، میتوان دریافت که GPUها میتوانند در اجرای انواع خاصی از برنامهها با اختلاف بسیار زیادی از CPUها پیشی بگیرند. Hamedan University of Technology 9 GPGPU
پردازشهای مناسب برای اجرا با پردازندههای گرافیکی • الگوریتمهای بسیار زیادی وجود دارند که در اجرای آنها محاسبات نسبتا ساده ای باید بارها روی حجم بسیار زیادی از دادهها انجام پذیرند. شبیه سازی وقایع فیزیکی، پردازش تصویر، جستجوهای کلان و هرگونه محاسباتی که به طور کلی با ماتریسها یا بردارها در ارتباط هستند را میتوان از این نوع الگوریتمها دانست. • اینگونه الگوریتمها و یا برنامهها را براحتی میتوان به گونه ای نوشت که به قسمتهای زیادی تقسیم شوند و به صورت همزمان به اجرا درآیند. زیرا قسمتهای بسیار زیادی از محاسبات در این برنامهها هیچگونه وابستگی به نتیجه یا خاتمه محاسبات قسمت دیگر ندارند. • برای مثال ضرب دو ماتریس: Hamedan University of Technology 10 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی • تاکنون ابزارها و کامپایلرهای متفاوتی برای برنامهنویسی GPGPU ارائه شده است.هنوز اختلافات بسیار زیادی بین شرکتهای سازنده GPUها و برنامه نویسان این زمینه وجود. تنها سازندگان GPUها یعنی Nvidia و AMD هرکدام کامپایلرهای خاص خود را ارائه کردهاند که این کار را برای برنامه نویسان دشوار میکند ولی هر دو این کمپانیها از OpenCL پشیبانی میکنند. Hamedan University of Technology 11 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی • قاعده کلی در GPGPU به این صورت است که CPU (HOST) دستورالعملها (KERNELS) را به بخشهای مختلف GPU (یا به طور کلی DEVICE) میدهد و نتایج را پس میگیرد Hamedan University of Technology 12 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی در اینجا برنامه جمع دو عدد را با زبان C و با استفاده از CUDA C مشاهده میکنید. __global__ void add( int*a, int*b, int*c){ *c = *a + *b; } Intmain( void ) { Inta, b, c; // host copies of a, b, c Int*dev_a, *dev_b, *dev_c; // device copies of a, b, c Intsize = sizeof( int); // we need space for an integer // allocate device copies of a, b, c cudaMalloc( (void**)&dev_a, size ); cudaMalloc( (void**)&dev_b, size ); cudaMalloc( (void**)&dev_c, size ); a = 2; b = 7; Hamedan University of Technology 13 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی // copy inputs to device cudaMemcpy( dev_a, &a, size, cudaMemcpyHostToDevice); cudaMemcpy( dev_b, &b, size, cudaMemcpyHostToDevice); // launch add() kernel on GPU, passing parameters add<<< 1, 1 >>>( dev_a, dev_b, dev_c); // copy device result back to host copy of c cudaMemcpy( &c, dev_c, size, cudaMemcpyDeviceToHost); cudaFree( dev_a); cudaFree( dev_b); cudaFree( dev_c); Return 0; } Hamedan University of Technology 14 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی در کدی که مشاهده کردیم تنها دو عدد با هم جمع میشدند، در کدی که در ادامه آمده است آرایه ای از اعداد با هم جمع خواهند شد. __global__ void add( int*a, int*b, int*c ) { c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x]; } #define N 512 intmain( void ) { int*a, *b, *c; // host copies of a, b, c int*dev_a, *dev_b, *dev_c; // device copies of a, b, c intsize = N *sizeof( int); // we need space for 512 integers // allocate device copies of a, b, c cudaMalloc( (void**)&dev_a, size ); cudaMalloc( (void**)&dev_b, size ); cudaMalloc( (void**)&dev_c, size ); a = (int*)malloc( size ); b = (int*)malloc( size ); c = (int*)malloc( size ); random_ints( a, N ); random_ints( b, N ); Hamedan University of Technology 15 GPGPU
چگونگی استفاده از پردازندههای گرافیکی برای پردازشهای عمومی // copy inputs to device cudaMemcpy( dev_a, a, size, cudaMemcpyHostToDevice); cudaMemcpy( dev_b, b, size, cudaMemcpyHostToDevice); // launch add() kernel with N parallel blocks add<<< N, 1 >>>( dev_a, dev_b, dev_c); // copy device result back to host copy of c cudaMemcpy( c, dev_c, size, cudaMemcpyDeviceToHost); free( a ); free( b ); free( c ); cudaFree( dev_a); cudaFree( dev_b); cudaFree( dev_c); return 0; } Hamedan University of Technology 16 GPGPU
نتیجهگیری • استفاده از GPGPU در پردازشهای وابسته به شبکه • استفاده از GPGPU در آنتی ویروسها • استفاده از GPGPUدر برنامههای پردازش سیگنال و پردازش تصویر • استفاده از GPGPU در سرعت بخشیدن به پایگاههای داده Hamedan University of Technology 17 GPGPU
منابع • Matthew Scarpino, OpenCL in Action: Manning Publications Co, 2012. • Jason Sanders, Edward Kandrot. CUDA by example: NVIDIA Co, 2012. • CUDA - NVIDIA Developer Zone (https://developer.nvidia.com/category/zone/cuda-zone) • OpenACC Home (www.openacc-standard.org) Hamedan University of Technology 19 GPGPU