كودا

من ويكيبيديا، الموسوعة الحرة
اذهب إلى: تصفح، ‏ ابحث

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

تحتوي أحدث برامج تشغيل وحدات الرسوميات على جميع العناصر الضرورية لبرنامج كودا. يعمل برنامج كودا مع جميع وحدات معالجة الرسومات من إنتاج شركة إنفيديا من سلسلة 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;
}

وصلات خارجية[عدل]