کودا

**کودا** به انگلیسی (CUDA) که مخفف عبارت انگلیسی Compute Unified Device Architecture است یک سکوی پردازش موازی و مدل برنامه‌نویسی است که توسط شرکت انویدیا به‌وجود آمده‌است و در واحدهای پردازش گرافیکی این شرکت پشتیبانی می‌شود. کودا به توسعه دهنده گان نرم‌افزار اجازه می‌دهد تا از یک GPU که ویژگی CUDA-enabled دارد برای هدف پردازش استفاده کنند، رویکردی که واحد پردازش گرافیکی همه منظوره (GPGPU) شناخته می‌شود. کودا به توسعه‌دهنده گان امکان دسترسی مستقیم به حافظه و مجموعه دستورالعمل در واحد پردازش گرافیکی را می‌دهد.

سکوی کودا برای کار با زبان‌های برنامه‌نویسی مانند C و ++C و فرترن طراحی شده‌است. این دسترسی باعث می‌شود تا برای متخصصان استفاده از منابع GPU آسان‌تر شود برخلاف راه کارهای API دیگر چون DIRECT3D و OpenGL که نیاز به توانایی حرفه‌ای در برنامه‌نویسی گرافیک داشتند. همچین کودا از چارچوب‌هایی چون OpenACC و OpenCL پشتیبانی می‌کند.

## پیش زمینه
GPU به عنوان یک پردازنده خاص، درخواست‌های‌های بلادرنگ با کیفیت بالا گرافیک سه بعدی که از نظر وظایف محاسباتی فشرده هستند را مختصات‌دهی می‌کند. از سال ۲۰۱۲ میلادی GPUها به سیستم‌های چند هسته ای قدرتمندی ارتقا یافتند که قادر به دستکاری بلوک‌های بزرگی از داده‌ها هستند. این طراحی بسیار از هدف عامه CPU‌ها برای الگوریتم‌ها در مواقعی که پردازش موازی روی بلوک‌های داده انجام می‌شود مؤثرتر است. به عنوان مثال:
* الگوریتم ارسال برچسب
* الگوریتم مرتب‌سازی سریع روی لیست‌های بزرگ
* تبدیل موجک سریع دوبعدی
* شبیه‌سازی دینامیک مولکولی

## قابلیت‌های برنامه‌نویسی
بندانگشتی|300px|راست|'''مثال جریان پردازشی کودا'''۱. کپی داده‌ها از حافظه اصلی به حافظه GPU2. CPU به GPU دستور پردازش می‌دهد3.GPU به‌طور موازی در هر هسته اجرا می‌کند۴. کپی اطلاعات از حافظه GPU به حافظه اصلی
کودا توسط کتابخانه‌های مجهز شده کودا ،دستوردهنده کامپایلر مانند 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، سکو کودا از سایر رابط‌های محاسباتی شامل موارد زیر پشتیبانی می‌کند.
* OpenCL گروه Khronos
* DirectCompute مایکروسافت
* محاسبات سایه زنی OpenGL
* C++ AMP
همچنین لفافه سوم شخص (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) می‌کند.

```cuda
texture<float, 2, cudaReadModeElementType> tex;

void foo()
{
  cudaArray* cu_array;

  // Allocate array
  cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
  cudaMallocArray(&cu_array, &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<<< gridDim, blockDim, 0 >>>(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 < width && y < height) {
      float c = tex2D(tex, x, y);
      odata[y*width+x] = c;
   }
}
```


## منابع

* Wikipedia contributors, "CUDA" , Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/wiki/CUDA

* Wikipedia contributors, "What is CUDA core?" , گیمستان , فروشگاه قطعات کامیپوتری , "هسته های کودا چیست؟" نوشته مهندس محمد رضا زینلی

## جستارهای وابسته
* واحد پردازش گرافیکی
* انویدیا
* محاسبات همه‌منظوره بر روی واحد پردازش گرافیکی
* رایانش موازی

رده:رایانش موازی
رده:سخت‌افزار بازی‌های ویدئویی
رده:سخت‌افزارهای گرافیک
رده:کارت گرافیک
رده:محاسبات همه‌منظوره بر روی واحد پردازش گرافیکی
رده:موتورهای فیزیک رایانه‌ای
رده:نرم‌افزارهای انویدیا