کودا کیست؟ توضیح بده.
کودا به انگلیسی (CUDA) که مخفف عبارت انگلیسی Compute Unified Device Architecture است یک سکوی پردازش موازی و مدل برنامه‌نویسی است که توسط شرکت انویدیا به‌وجود آمده‌است و در واحدهای پردازش گرافیکی این شرکت پشتیبانی می‌شود. کودا به توسعه دهنده گان نرم‌افزار اجازه می‌دهد تا از یک GPU که ویژگی CUDA-enabled دارد برای هدف پردازش استفاده کنند، رویکردی که واحد پردازش گرافیکی همه منظوره (GPGPU) شناخته می‌شود. کودا به توسعه‌دهنده گان امکان دسترسی مستقیم به حافظه و مجموعه دستورالعمل در واحد پردازش گرافیکی را می‌دهد.سکوی کودا برای کار با زبان‌های برنامه‌نویسی مانند C و ++C و فرترن طراحی شده‌است. این دسترسی باعث می‌شود تا برای متخصصان استفاده از منابع GPU آسان‌تر شود برخلاف راه کارهای API دیگر چون DIRECT3D و OpenGL که نیاز به توانایی حرفه‌ای در برنامه‌نویسی گرافیک داشتند. همچین کودا از چارچوب‌هایی چون OpenACC و OpenCL پشتیبانی می‌کند.پیش زمینه.GPU به عنوان یک پردازنده خاص، درخواست‌های‌های بلادرنگ با کیفیت بالا گرافیک سه بعدی که از نظر وظایف محاسباتی فشرده هستند را مختصات‌دهی می‌کند. از سال ۲۰۱۲ میلادی GPUها به سیستم‌های چند هسته ای قدرتمندی ارتقا یافتند که قادر به دستکاری بلوک‌های بزرگی از داده‌ها هستند. این طراحی بسیار از هدف عامه CPU‌ها برای الگوریتم‌ها در مواقعی که پردازش موازی روی بلوک‌های داده انجام می‌شود مؤثرتر است. به عنوان مثال:قابلیت‌های برنامه‌نویسی.کودا توسط کتابخانه‌های مجهز شده کودا ،دستوردهنده کامپایلر مانند OpenACC و همین‌طور توسعه‌هایی استاندارد صنعتی از زبان‌هایی شامل C، ++C و فرترن برای توسعه‌دهندگان قابل دسترسی است. برنامه‌نویسان C++/C از '++CUDA C/C' استفاده می‌کنند که کامپایل شده با "nvcc" است.nvcc یک کامپایلر C++/C بر پایه LLVM شرکت انویدیا است. برنامه نویسان فرترن نیز می‌توانند از 'CUDA Fortran' استفاده کنند که کامپایل شده با PGI CUDA Fortran Complier شرکت The Portland Group است.علاوه بر کتابخانه‌ها، دستوردهنده‌های کامپایلر و ++CUDA C/C و CUDA Fortran، سکو کودا از سایر رابط‌های محاسباتی شامل موارد زیر پشتیبانی می‌کند.همچنین لفافه سوم شخص (Third party wrappers) برای زبان‌هایی مانند پرل (Perl)، پایتون (Python)، آر (R) ،فرترن (FORTRAN)، جاوا (Java)، روبی (Ruby)، هسکل (Haskell)، متلب (Matlab) ،آی دی ال (IDL)، لوآ (Lua) و نیز به‌طور پیشفرض متمتیکا (Mathematica) در دسترس هستند.در صنعت بازی‌های کامپیوتری ،GPUها تنها برای رندر کردن گرافیک نیست بلکه در محاسبات فیزیکی بازی (اثرات فیزیکی شبیه دود، آتش، ترشحات و آوار) نیز هستند. مثال‌هایی نظیر فیز-اکس و گلوله شامل این مورد هستند. کودا همچنین برای کاربردهای شتاب‌دهی غیر گرافیکی در زیست‌شناسی محاسباتی ،رمزنگاری و حوزه‌های دیگر نیز استفاده می‌شود.کودا هم یک API سطح پایین و هم یک API سطح بالا فراهم می‌کند. SDK اولیه کودا در ۱۵ فوریه ۲۰۰۷ برای ویندوز مایکروسافت و لینوکس انتشار عمومی شد. پشتیبانی در سیستم‌عامل مک در نسخه دوم اضافه شد که جای نسخه تست ۱۴ فوریه ۲۰۰۸ را می‌گیرد. کودا با تمامی GPUهای از سری G8x به بعد شامل جی‌فورس ،کوادرو و تسلا (گرافیک) کار می‌کند. کودا با بیشتر سیستم‌عامل‌های استاندارد کار می‌کند. انویدیا می‌گوید برنامه‌هایی که برای سری G8x توسعه‌یافته‌اند همچنین بدون تغییر روی نسل‌های آینده کارت‌های گرافیک بسته به سازگاری دودویی کارخواهند کرد.مزایا.کودا چندین برتری در برابر محاسبات عمومی سنتی روی GPUها (در کل منظور GPGPU) که از واسط‌های گرافیکی استفاده می‌کنند، دارد.هسته های کودا (CUDA).هسته های کودا(CUDA) در کارت گرافیک ها یکی از بحث برانگیز ترین و جزو اجزای مهم و تاثیر گذار بخش اطلاعات فنی کارت های گرافیک شرکت انویدیا به شمار میرودهسته ی کودا چیزی شبیه کارت گرافیک است که مسئولیت پردازش تصاویر را بر عهده دارد با مقدار اندکی تفاوت دارای پیچیدگی معماری کمتری است اما در مقدار گسترده تری در کارت گرافیک قرار میگیرد ب طور طبیعی پردازنده های معمولی دارای 2 الی 16 هسته است اما این تعداد در هسته های کودا به عدد 100 تا میرسد که عدد قابل توجهی برای یک هسته کارت گرافیک است امروزه هسته های کارت های گرافیک مدرن و جدید به هزار یا بیشتر از آن میرسد که عدده بی نظیری محسوب میشود. کاربرد در دنیای بازی های کامپیوتری.به‌صورت خلاصه به این نکته میتوان اشاره کرد که کار هسته کودا این است که در انجام کار به‌صورت موازی عمل میکنند (پردازش موازی)در صورتی که دارای دو یا چهار یا هشت هسته باشد و زمانی که پردازش به‌صورت جداگانه در هسته های متفاوت انجام میشود قسمت های مختلف تاثیر بسزایی در اجرای بازی مختلف دارد به‌صورتی که توانایی اجرای آنها را به نحوه چشمگیری افزایش دهد مخصوصا در اجرا و پردازش بازی مختلف کامپیوتری شخصیت های داستانی و ... به‌صورت مجزا در هسته ی آن اجرا و به نمایش دراورده میشود تا فعالیتی که فرد به آن مشغول است به نحوه بهتری انجام شود.GPUهای پشتیبانی شده.جدول قدرت محاسبه (نسخه‌های پشتیبانی شده کودا) مرتب شده با GPU و کارت گرافیک که همچنین از طریق انویدیا مستقیماً قابل دسترسی است.'*' - OEM- محصولات به تنهاییدستگاه‌هایی که کودا را پشتیبانی می‌کنند:جهت مطالعه تخصصی در مورد نسخه‌های مختلف و مقایسه دقیق آن‌ها به مقاله زبان اصلی مراجعه کنید.نمونه کد.این نمونه کد به زبان ++C یک بافت را از یک عکس به یک آرایه در GPU بارگذاری(Load) می‌کند.texture&lt;float, 2, cudaReadModeElementType&gt; tex;void foo() cudaArray* cu_array; // Allocate array cudaChannelFormatDesc description = cudaCreateChannelDesc&lt;float&gt;(); cudaMallocArray(&amp;cu_array, &amp;description, width, height); // Copy image data to array cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice); // Set texture parameters (default) tex.addressMode[0] = cudaAddressModeClamp; tex.addressMode[1] = cudaAddressModeClamp; tex.filterMode = cudaFilterModePoint; tex.normalized = false; // do not normalize coordinates // Bind the array to the texture cudaBindTextureToArray(tex, cu_array); // Run kernel dim3 blockDim(16, 16, 1); dim3 gridDim((width + blockDim.x - 1)/ blockDim.x, (height + blockDim.y - 1) / blockDim.y, 1); kernel«&lt; gridDim, blockDim, 0 »&gt;(d_data, height, width); // Unbind the array from the texture cudaUnbindTexture(tex);} //end foo()__global__ void kernel(float* odata, int height, int width) unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; if (x &lt; width &amp;&amp; y &lt; height) { float c = tex2D(tex, x, y); odata[y*width+x] = c;