كودا

CUDA تلفظ كودا هي اختصار لعبارة Compute Unified Device Architecture هي معمارية للحوسبة المتوازية وضعتها شركة إنفيديا. كودا هو محرك الحساب في وحدة معالجة الرسومات التي يستطيع المبرمجون التحكم بها باستخدام لغات البرمجة القياسية. يستخدم المبرمجون عادة 'سي لكودا' ('C for CUDA') لبرمجة خوارزميات ليتم تنفيذها على وحدات معالجة الرسوميات. تدعم معمارية كودا مجموعة واسعة من واجهات الحساب بما في ذلك أوبن سي أل، دايركت كومبيوت كما يوجد مغلفات تنتجها أطراف أخرى تدعم بايثون، فورتران، جافا وماتلاب.

تحتوي أحدث برامج تشغيل وحدات الرسوميات على جميع العناصر الضرورية لبرنامج كودا. يعمل برنامج كودا مع جميع وحدات معالجة الرسومات من إنتاج شركة إنفيديا من سلسلة G8X فصاعدا، بما في ذلك جي-فورس، كوادرو وسلسلة تسلا. يوفر برنامج كودا للمطورين الوصول إلى مجموعة الأوامر الأصلية والذاكرة لعناصر الحساب المتوازي في وحدات معالجة الرسوميات الداعمة لكودا. باستخدام برنامج كودا، تصبح أحدث وحدات معالجة الرسومات من إنفيديا مفتوحة بفعالية وحدة المعالجة المركزية. لكن على عكس وحدات المعالجة المركزية، فإن وحدات معالجة الرسومات لها معمارية متوازية "متعددة النوى"، ولكل نواة القدرة على إجراء الآلاف من العمليات في وقت واحد. وإذا كان البرنامج مناسب لمثل هذا النوع من العمليات، فيمكن لوحدة معالجة الرسوميات عندها تقديم فوائد كبيرة فيما يتعلق بالأداء.

 مزايا 
كودا له العديد من المزايا المتفوقة على وحدات معالجة الرسومات التقليدية باستخدام واجهات برمجة التطبيقات.
 قراءة مبعثرة للذاكرة.
 الذاكرة المشتركة. قراءة وكتابة أسرع إلى وحدة معالجة الرسوميات
 الدعم الكامل للعمليات سواء على الأعداد الصحيحة أو على البتات.

 وحدات معالجة الرسوميات المدعومة 
جدول يوضح أنواع معالجات الرسوميات التي تدعم كودا.

    Nvidia GeForce
  GeForce GTX 295
  GeForce GTX 285
  GeForce GTX 280
  GeForce GTX 275
  GeForce GTX 260
  GeForce GTS 250
  GeForce GT 220
  GeForce G 105M
  GeForce G210
  GeForce 9800 GX2
  GeForce 9800 GTX+
  GeForce 9800 GTX
  GeForce 9800 GT
  GeForce 9600 GSO
  GeForce 9600 GT
  GeForce 9500 GT
  GeForce 9400 GT
  GeForce 9400 mGPU
  GeForce 9300 mGPU
  GeForce 8800 Ultra
  GeForce 8800 GTX
  GeForce 8800 GTS
  GeForce 8800 GT
  GeForce 8800 GS
  GeForce 8600 GTS
  GeForce 8600 GT
  GeForce 8600 mGT
  GeForce 8500 GT
  GeForce 8400 GS
  GeForce 8300 mGPU
  GeForce 8200 mGPU
  GeForce 8100 mGPU

   Nvidia GeForce Mobile
  GeForce GTX 280M
  GeForce GTX 260M
  GeForce GTS 260M
  GeForce GTS 250M
  GeForce GTS 160M
  GeForce GT 240M
  GeForce GT 230M
  GeForce GT 220M
  GeForce G210M
  GeForce 9800M GTX
  GeForce 9800M GTS
  GeForce 9800M GT
  GeForce 9800M GS
  GeForce 9700M GTS
  GeForce 9700M GT
  GeForce GT 130M
   GeForce GT 120M
    GeForce 9650M GT
    GeForce 9650M GS
    GeForce 9600M GT
    GeForce 9600M GS
    GeForce 9500M GS
    GeForce 9500M G
    GeForce 9400M G
    GeForce 9300M GS
    GeForce 9300M G
    GeForce 9200M GS
    GeForce 9100M G
    GeForce 8800M GTS
    GeForce 8700M GT
    GeForce 8600M GT
    GeForce 8600M GS
    GeForce 8400M GT
    GeForce 8400M GS
    GeForce 8400M G
    GeForce 8200M G

    Nvidia Quadro
    Quadro FX 5800
    Quadro FX 5600
    Quadro FX 4800
    Quadro FX 4700 X2
    Quadro FX 4600
    Quadro FX 3800
    Quadro FX 3700
    Quadro FX 1800
    Quadro FX 1700
    Quadro FX 580
    Quadro FX 570
    Quadro FX 380
    Quadro FX 370
    Quadro NVS 290
    Quadro NVS 295
    Quadro NVS 420
    Quadro NVS 450

    Quadro Plex 1000 Model IV
    Quadro Plex 1000 Model S4

   Nvidia Quadro Mobile
    Quadro FX 3700M
    Quadro FX 3600M
    Quadro FX 2700M
    Quadro FX 1700M
    Quadro FX 1600M
    Quadro FX 770M
    Quadro FX 570M
    Quadro FX 370M
    Quadro FX 360M
    Quadro NVS 320M
    Quadro NVS 160M
    Quadro NVS 150M
    Quadro NVS 140M
    Quadro NVS 135M
    Quadro NVS 130M

   Nvidia Tesla
    Tesla S1070
    Tesla C1060
    Tesla C870
    Tesla D870
    Tesla S870

 مثال 
هذا مثال في لغة C++ يحمل صورة في مصفوفة في وحدة المعالجة المركزية:

cudaArray* cu_array;
texture<float, 2> tex;

// Allocate array
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaMallocArray(&cu_array, &description, width, height);

// Copy image data to array
cudaMemcpy(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice);

// Bind the array to the texture
cudaBindTextureToArray(tex, cu_array);

// Run kernel
dim3 blockDim(16, 16, 1);
dim3 gridDim(width / blockDim.x, height / blockDim.y, 1);
kernel<<<gridDim, blockDim, 0>>>(d_odata, width, height);
cudaUnbindTexture(tex);

__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;
   float c = tex2D(tex, x, y);
   odata[y*width+x] = c;
}

 مراجع 

 وصلات خارجية 

 برنامج كودا إنفيديا الموقع الرسمي

تصنيف:برمجيات إنفيديا
تصنيف:عتاد الرسوميات
تصنيف:إنفيديا
تصنيف:بطاقات عرض مرئي
تصنيف:حوسبة متوازية
تصنيف:رسوميات الحاسوب
تصنيف:عتاد ألعاب فيديو
تصنيف:محركات فيزيائية حاسوبية