جهات الاتصال

مقارنة عدد معالجات cuda. CUDA نعرضها: تقنية NVIDIA CUDA. تاريخ تطوير كودا

وهو مصمم لترجمة كود المضيف (الرئيسي ، كود التحكم) ورمز الجهاز (كود الجهاز) (ملفات بامتداد .cu) إلى ملفات كائنات مناسبة لبناء البرنامج النهائي أو المكتبة في أي بيئة برمجة ، على سبيل المثال ، في NetBeans.

تستخدم بنية CUDA نموذج ذاكرة الشبكة والترابط العنقودي وتعليمات SIMD. ينطبق ليس فقط على حوسبة الرسومات عالية الأداء ، ولكن أيضًا على الحوسبة العلمية المختلفة باستخدام بطاقات رسومات nVidia. يستخدم العلماء والباحثون CUDA على نطاق واسع في مجموعة متنوعة من المجالات ، بما في ذلك الفيزياء الفلكية والبيولوجيا الحاسوبية والكيمياء ونمذجة ديناميكيات السوائل والتفاعلات الكهرومغناطيسية والتصوير المقطعي المحوسب والتحليل الزلزالي والمزيد. لدى CUDA القدرة على الاتصال بالتطبيقات التي تستخدم OpenGL و Direct3D. CUDA هو برنامج متعدد الأنظمة الأساسية لأنظمة التشغيل مثل Linux و Mac OS X و Windows.

في 22 مارس 2010 ، أصدرت nVidia مجموعة أدوات CUDA 3.0 التي تضمنت دعم OpenCL.

ادوات

ظهرت منصة CUDA لأول مرة في السوق مع إصدار الجيل الثامن من شريحة NVIDIA G80 وأصبحت موجودة في جميع السلاسل اللاحقة من رقائق الرسوم المستخدمة في عائلات مسرعات GeForce و Quadro و NVidia Tesla.

كانت السلسلة الأولى من الأجهزة التي تدعم CUDA SDK ، G8x ، تحتوي على معالج متجه أحادي الدقة 32 بت باستخدام CUDA SDK كواجهة برمجة تطبيقات (يدعم CUDA النوع C المزدوج ، ولكن الآن تم تخفيض دقته إلى عائم 32 بت هدف). تدعم معالجات GT200 اللاحقة دقة 64 بت (فقط من أجل SFU) ، لكن الأداء أسوأ بكثير من دقة 32 بت (نظرًا لوجود وحدتي SFU فقط لكل تيار متعدد المعالجات ، وهناك ثمانية معالجات قياسية) . تنظم وحدة معالجة الرسومات (GPU) تعدد مؤشرات الترابط للأجهزة ، مما يسمح باستخدام جميع موارد وحدة معالجة الرسومات. وبالتالي ، يفتح الاحتمال تحويل وظائف المسرع المادي إلى مسرّع رسومات (مثال على التنفيذ هو nVidia PhysX). أيضًا ، هناك فرص واسعة لاستخدام المعدات الرسومية للكمبيوتر لإجراء عمليات حسابية معقدة غير رسومية: على سبيل المثال ، في علم الأحياء الحسابي وفي فروع العلوم الأخرى.

مزايا

مقارنة بالنهج التقليدي لتنظيم الحوسبة للأغراض العامة من خلال قدرات واجهات برمجة التطبيقات الرسومية ، تتمتع بنية CUDA بالمزايا التالية في هذا المجال:

قيود

  • جميع الوظائف المنفذة على الجهاز لا تدعم العودية (في CUDA Toolkit 3.1 تدعم المؤشرات والتكرار) ولها بعض القيود الأخرى

وحدات معالجة الرسومات ومسرعات الرسومات المدعومة

يتم تقديم قائمة الأجهزة من الشركة المصنعة للمعدات Nvidia مع الدعم الكامل المعلن لتقنية CUDA على موقع Nvidia الرسمي على الويب: CUDA-Enabled GPU Products.

في الواقع ، في سوق أجهزة الكمبيوتر الشخصي اليوم ، تدعم الأجهزة الطرفية التالية تقنية CUDA:

إصدار المواصفات GPU بطاقات الفيديو
1.0 G80 ، G92 ، G92b ، G94 ، G94b GeForce 8800GTX / Ultra، 9400GT، 9600GT، 9800GT، Tesla C / D / S870، FX4 / 5600، 360M، GT 420
1.1 G86 ، G84 ، G98 ، G96 ، G96b ، G94 ، G94b ، G92 ، G92b GeForce 8400GS / GT ، 8600GT / GTS ، 8800GT / GTS ، 9600 GSO ، 9800GTX / GX2 ، GTS 250 ، GT 120/30/40 ، FX 4/570 ، 3/580 ، 17/18/3700 ​​، 4700x2 ، 1xxM ، 32 / 370 م ، 3/5 / 770 م ، 16/17/27/28/36/37/3800 م ، NVS420 / 50
1.2 GT218 ، GT216 ، GT215 GeForce 210، GT 220/40، FX380 LP، 1800M، 370 / 380M، NVS 2 / 3100M
1.3 GT200 ، GT200b GeForce GTX 260 و GTX 275 و GTX 280 و GTX 285 و GTX 295 و Tesla C / M1060 و S1070 و Quadro CX و FX 3/4/5800
2.0 GF100 ، GF110 GeForce (GF100) GTX 465، GTX 470، GTX 480، Tesla C2050، C2070، S / M2050 / 70، Quadro Plex 7000، Quadro 4000، 5000، 6000، GeForce (GF110) GTX 560 TI 448، GTX570، GTX580، GTX590
2.1 GF104 ، GF114 ، GF116 ، GF108 ، GF106 GeForce 610M، GT 430، GT 440، GTS 450، GTX 460، GTX 550 Ti، GTX 560، GTX 560 Ti، 500M، Quadro 600، 2000
3.0 GK104 ، GK106 ، GK107 GeForce GTX 690 و GTX 680 و GTX 670 و GTX 660 Ti و GTX 660 و GTX 650 Ti و GTX 650 و GT 640 و GeForce GTX 680MX و GeForce GTX 680M و GeForce GTX 675MX و GeForce GTX 670MX و GTX 660M و GeForce GT 650M GeForce GT 645M ، GeForce GT 640M
3.5 GK110
Nvidia GeForce Desktop
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
البطاقة GeForce GTX 560 Ti
GeForce GTX 560
البطاقة GeForce GTX 550 Ti
GeForce GTX 520
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTS 450
البطاقة GeForce GTX 295
البطاقة GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
جيفورس 210
GeForce GTS 150
GeForce GT 130
GeForce GT 120
GeForce G100
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 ملي وحدة معالجة الرسومات
GeForce 9300 مللي أمبير
GeForce 8800 GTS 512
GeForce 8800 GT
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400 GS
Nvidia GeForce Mobile
GeForce GTX 580M
البطاقة GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
GeForce GTX 485M
GeForce GTX 480M
البطاقة GeForce GTX 470M
GeForce GTX 460M
GeForce GT 445M
GeForce GT 435M
GeForce GT 425M
GeForce GT 420M
GeForce GT 415M
البطاقة GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 360M
GeForce GTS 350M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 240M
GeForce GT 130M
GeForce G210M
GeForce G110M
GeForce G105M
GeForce 310 م
GeForce 305M
GeForce 9800M GTX
GeForce 9800M GT
GeForce 9800M GTS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650M GS
GeForce 9600M GT
GeForce 9600M GS
GeForce 9500M GS
جي فورس 9500 م جي
GeForce 9300M GS
جي فورس 9300 م جي
GeForce 9200M GS
بطاقة GeForce 9100M G
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600M GS
GeForce 8400M GT
GeForce 8400M GS
نفيديا تيسلا *
تسلا C2050 / C2070
تسلا M2050 / M2070 / M2090
تسلا S2050
تسلا S1070
تسلا M1060
تسلا C1060
تسلا C870
تسلا D870
تسلا S870
سطح المكتب Nvidia Quadro
كوادرو 6000
كوادرو 5000
كوادرو 4000
كوادرو 2000
كوادرو 600
كوادرو اف اكس 5800
كوادرو اف اكس 5600
كوادرو اف اكس 4800
كوادرو اف اكس 4700 اكس 2
كوادرو اف اكس 4600
كوادرو اف اكس 3700
كوادرو اف اكس 1700
كوادرو اف اكس 570
كوادرو اف اكس 470
كوادرو FX 380 الملف الشخصي المنخفض
كوادرو اف اكس 370
كوادرو FX 370 الملف الشخصي المنخفض
كوادرو سي اكس
كوادرو NVS 450
كوادرو NVS 420
كوادرو NVS 290
كوادرو بليكس 2100 دي 4
كوادرو بليكس 2200 دي 2
كوادرو بليكس 2100 اس 4
نموذج Quadro Plex 1000 IV
Nvidia Quadro لأجهزة الكمبيوتر المحمولة
كوادرو 5010 م
كوادرو 5000 م
كوادرو 4000 م
كوادرو 3000 م
كوادرو 2000 م
كوادرو 1000 م
كوادرو اف اكس 3800 م
كوادرو اف اكس 3700 م
كوادرو اف اكس 3600 م
كوادرو اف اكس 2800 م
كوادرو اف اكس 2700 م
كوادرو اف اكس 1800 م
كوادرو اف اكس 1700 م
كوادرو اف اكس 1600 م
كوادرو اف اكس 880 ام
كوادرو FX 770M
كوادرو اف اكس 570 م
كوادرو اف اكس 380 م
كوادرو اف اكس 370 م
كوادرو اف اكس 360 م
كوادرو NVS 5100M
كوادرو NVS 4200M
كوادرو NVS 3100M
كوادرو NVS 2100 م
كوادرو NVS 320M
كوادرو NVS 160M
كوادرو NVS 150M
كوادرو NVS 140M
كوادرو NVS 135M
كوادرو NVS 130M
  • تتيح لك طرز Tesla C1060 و Tesla S1070 و Tesla C2050 / C2070 و Tesla M2050 / M2070 و Tesla S2050 إجراء حسابات على وحدة معالجة الرسومات بدقة مضاعفة.

ميزات ومواصفات الإصدارات المختلفة

دعم الميزات (الميزات غير المدرجة هي
مدعوم لجميع قدرات الحوسبة)
القدرة الحسابية (الإصدار)
1.0 1.1 1.2 1.3 2.x

كلمات 32 بت في الذاكرة العالمية
لا نعم

قيم الفاصلة العائمة في الذاكرة العالمية
عدد صحيح من الدوال الذرية التي تعمل على
كلمات 32 بت في الذاكرة المشتركة
لا نعم
تعمل atomicExch () على 32 بت
قيم الفاصلة العائمة في الذاكرة المشتركة
عدد صحيح من الدوال الذرية التي تعمل على
كلمات 64 بت في الذاكرة العالمية
وظائف التصويت الاعوجاج
عمليات النقطة العائمة مزدوجة الدقة لا نعم
تعمل الدوال الذرية على 64 بت
القيم الصحيحة في الذاكرة المشتركة
لا نعم
تعمل الإضافة الذرية للفاصلة العائمة
كلمات 32 بت في الذاكرة العالمية والمشتركة
_ballot ()
_threadfence_system ()
_syncthreads_count () ،
_syncthreads_and () ،
_syncthreads_or ()
وظائف السطح
شبكة ثلاثية الأبعاد من كتلة الخيط
المواصفات الفنية القدرة الحسابية (الإصدار)
1.0 1.1 1.2 1.3 2.x
الأبعاد القصوى لشبكة كتل الخيوط 2 3
البعد x- أو y- أو z الأقصى لشبكة كتل الخيط 65535
الأبعاد القصوى لكتلة الخيط 3
البعد x- أو y الأقصى للكتلة 512 1024
البعد z الأقصى للكتلة 64
الحد الأقصى لعدد الخيوط لكل كتلة 512 1024
حجم الاعوجاج 32
الحد الأقصى لعدد الكتل المقيمة لكل متعدد المعالجات 8
أقصى عدد من الاعوجاج المقيمة لكل متعدد المعالجات 24 32 48
العدد الأقصى من الخيوط المقيمة لكل متعدد المعالجات 768 1024 1536
عدد التسجيلات 32 بت لكل معالج متعدد 8 ك 16 ك 32 ك
الحد الأقصى لمقدار الذاكرة المشتركة لكل متعدد المعالجات 16 كيلو بايت 48 كيلو بايت
عدد بنوك الذاكرة المشتركة 16 32
مقدار الذاكرة المحلية لكل موضوع 16 كيلو بايت 512 كيلو بايت
حجم ذاكرة ثابت 64 كيلو بايت
مجموعة عمل ذاكرة التخزين المؤقت لكل معالج متعدد للذاكرة الثابتة 8 كيلو بايت
مجموعة عمل ذاكرة التخزين المؤقت لكل معالجات متعددة لذاكرة الملمس يعتمد على الجهاز ، بين 6 كيلو بايت و 8 كيلو بايت
أقصى عرض للنسيج 1D
8192 32768
أقصى عرض للنسيج 1D
مرجع مرتبط بالذاكرة الخطية
2 27
أقصى عرض وعدد الطبقات
للحصول على مرجع نسيج ذو طبقات أحادية الأبعاد
8192 × 512 16384 × 2048
أقصى عرض وارتفاع للثنائي الأبعاد
إشارة نسيج ملزمة
الذاكرة الخطية أو مجموعة CUDA
65536 × 32768 65536 × 65535
الحد الأقصى للعرض والارتفاع والعدد
من الطبقات لمرجع نسيج ثنائي الأبعاد
٨١٩٢ × ٨١٩٢ × ٥١٢ ١٦٣٨٤ × ١٦٣٨٤ × ٢٠٤٨
أقصى عرض وارتفاع وعمق
لمرجع نسيج ثلاثي الأبعاد مرتبط بالخطي
الذاكرة أو مجموعة CUDA
2048 × 2048 × 2048
أقصى عدد من القوام ذلك
يمكن ربطها بنواة
128
أقصى عرض لسطح 1D
مرجع مرتبط بمصفوفة CUDA
لا
أيد
8192
أقصى عرض وارتفاع لـ 2D
مرجع السطح المرتبط بمصفوفة CUDA
٨١٩٢ × ٨١٩٢
الحد الأقصى لعدد الأسطح التي
يمكن ربطها بنواة
8
أقصى عدد من التعليمات لكل
نواة
2 مليون

مثال

CudaArray * cu_array ؛ الملمس< float , 2 >تكس. // تخصيص مصفوفة cudaMalloc (& cu_array، cudaCreateChannelDesc< float>()، عرض ارتفاع)؛ // نسخ بيانات الصورة إلى مصفوفة cudaMemcpy (cu_array ، image ، width * height ، cudaMemcpyHostToDevice) ؛ // ربط المصفوفة بالنسيج cudaBindTexture (tex ، cu_array) ؛ // تشغيل kernel dim3 blockDim (16 ، 16 ، 1) ؛ dim3 gridDim (العرض / blockDim.x ، الارتفاع / blockDim.y ، 1) ؛ نواة<<< gridDim, blockDim, 0 >>> (d_odata ، العرض ، الارتفاع) ؛ cudaUnbindTexture (تكس) ؛ __global__ نواة باطلة (عائم * odata ، ارتفاع int ، عرض int) (بدون إشارة int x = blockIdx.x * blockDim.x + threadIdx.x ؛ بدون إشارة int y = blockIdx.y * blockDim.y + threadIdx.y ؛ عائم c = texfetch (tex، x، y)؛ odata [y * width + x] = c؛)

استيراد pycuda.driver مثل استيراد drv numpy drv.init () dev = drv.Device (0) ctx = dev.make_context () mod = drv.SourceModule ( "" __global__ void multiply_them (float * dest، float * a، float * b) (const int i = threadIdx.x؛ dest [i] = a [i] * b [i]؛) "" ") multiply_them = mod.get_function ("multiply_them") a = numpy.random .randn (400) .astype (numpy.float32) b = numpy.random .randn (400) .astype (numpy.float32) dest = numpy.zeros_like (أ) multiply_them (drv.Out (dest)، drv.In (a)، drv.In (b)، block = (400، 1، 1)) print dest-a * b

كودا كمادة في الجامعات

اعتبارًا من ديسمبر 2009 ، يتم تدريس نموذج برمجة CUDA في 269 جامعة حول العالم. في روسيا ، يتم تدريس دورات CUDA التدريبية في جامعة سانت بطرسبرغ للفنون التطبيقية ، جامعة ولاية ياروسلافل التي تحمل اسم V.I. ديميدوف ، موسكو ، نيجني نوفغورود ، سانت بطرسبرغ ، تفير ، قازان ، نوفوسيبيرسك ، جامعة ولاية نوفوسيبيرسك التقنية الحكومية أومسك وبيرم ، الجامعة الدولية لطبيعة المجتمع وجامعة مان "دوبنا" ، جامعة إيفانوفو الحكومية لهندسة الطاقة ، جامعة بيلغورود الحكومية ، MSTU لهم. بومان ، RKhTU لهم. منديليف ، مركز الكمبيوتر العملاق الأقاليمي RAS ،. بالإضافة إلى ذلك ، في ديسمبر 2009 ، تم الإعلان عن إطلاق أول مركز علمي وتعليمي روسي "الحوسبة المتوازية" ، يقع في مدينة دوبنا ، وتشمل مهامه التدريب والاستشارات في حل مشكلات الحوسبة المعقدة على وحدة معالجة الرسومات.

في أوكرانيا ، يتم تدريس دورات CUDA في معهد كييف لتحليل النظم.

الروابط

الموارد الرسمية

  • منطقة كودا (الروسية) - الموقع الرسمي لـ CUDA
  • CUDA GPU Computing - منتديات الويب الرسمية المخصصة لحوسبة CUDA

موارد غير رسمية

توم هاردوير
  • ديمتري تشيكانوف. nVidia CUDA: حوسبة GPU أم موت وحدة المعالجة المركزية؟ ... Tom "s Hardware (22 يونيو 2008) أرشفة
  • ديمتري تشيكانوف. nVidia CUDA: معايير GPU للسوق السائد. Tom "s Hardware (19 أيار (مايو) 2009). ||| UNTRANSLATED_CONTENT_START ||| March 4، 2012. ||| UNTRANSLATED_CONTENT_END ||| تم الاسترجاع 19 مايو ، 2009.
iXBT.com
  • أليكسي بيريلو. NVIDIA CUDA - الحوسبة غير الرسومية على وحدات معالجة الرسومات. الجزء 1. iXBT.com (23 سبتمبر 2008). مؤرشفة من الأصلي في 4 مارس 2012. تم استرجاعه في 20 يناير 2009.
  • أليكسي بيريلو. NVIDIA CUDA - الحوسبة غير الرسومية على وحدات معالجة الرسومات. الجزء 2 . iXBT.com (22 أكتوبر 2008). - أمثلة على تنفيذ NVIDIA CUDA. مؤرشفة من الأصلي في 4 مارس 2012. تم استرجاعه في 20 يناير 2009.
مصادر أخرى
  • بوريسكوف أليكسي فيكتوروفيتش.أساسيات كودا (20 يناير 2009). مؤرشفة من الأصلي في 4 مارس 2012. تم استرجاعه في 20 يناير 2009.
  • فلاديمير فرولوف.مقدمة في تقنية كودا. مجلة الشبكة "رسومات الحاسوب والوسائط المتعددة" (19 ديسمبر 2008). مؤرشفة من الأصلي في 4 مارس 2012. تم استرجاعه في 28 أكتوبر 2009.
  • إيغور أوسكولكوف. NVIDIA CUDA هي تذكرة ميسورة التكلفة لعالم الحوسبة الكبيرة. Computerra (30 أبريل 2009). تم الاسترجاع 3 مايو ، 2009.
  • فلاديمير فرولوف.مقدمة في CUDA Technology (1 أغسطس 2009). مؤرشفة من الأصلي في 4 مارس 2012. تم استرجاعه في 3 أبريل 2010.
  • GPGPU.ru. استخدام كروت الشاشة للحوسبة
  • ... مركز الحوسبة المتوازية

ملاحظاتتصحيح

أنظر أيضا

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

لكن في الآونة الأخيرة ، تحولت شعلة الحوسبة الموازية إلى السوق الشامل ، بطريقة أو بأخرى مرتبطة بالألعاب ثلاثية الأبعاد. أجهزة الحوسبة المتوازية متعددة النوى للأغراض العامة المستخدمة في الرسومات ثلاثية الأبعاد تحقق أعلى أداء لا يمكن لمعالجات الأغراض العامة القيام به. بالطبع ، يتم تحقيق السرعة القصوى فقط في عدد من المهام الملائمة ولها بعض القيود ، ولكن هذه الأجهزة بدأت بالفعل في الاستخدام على نطاق واسع في المناطق التي لم تكن مخصصة لها في الأصل. ومن الأمثلة الممتازة على مثل هذا المعالج المتوازي المعالج Cell ، الذي طوره تحالف Sony-Toshiba-IBM والمستخدم في Sony PlayStation 3 ، بالإضافة إلى جميع بطاقات الفيديو الحديثة من رواد السوق - Nvidia و AMD.

لن نتطرق اليوم إلى الخلية ، على الرغم من أنها ظهرت في وقت سابق وهي معالج عالمي بقدرات ناقلات إضافية ، فإننا لا نتحدث عنها اليوم. بالنسبة لمسرعات الفيديو ثلاثية الأبعاد ، قبل بضع سنوات ، ظهرت أولى تقنيات حسابات الأغراض العامة غير الرسومية ، GPGPU (حساب الأغراض العامة على وحدات معالجة الرسومات). بعد كل شيء ، تحتوي رقائق الفيديو الحديثة على مئات من وحدات التنفيذ الرياضي ، ويمكن استخدام هذه القوة لتسريع العديد من التطبيقات الحسابية المكثفة بشكل كبير. وتتميز الأجيال الحالية من وحدات معالجة الرسومات (GPU) بالمرونة الكافية للهندسة المعمارية التي ، جنبًا إلى جنب مع لغات البرمجة عالية المستوى وبنى البرامج والأجهزة مثل تلك التي تمت مناقشتها في هذه المقالة ، تكشف عن هذه الاحتمالات وتجعلها أكثر سهولة في الوصول إليها.

كان الدافع وراء تطوير GPCPU ظهور برامج تظليل سريعة ومرنة بدرجة كافية قادرة على تنفيذ شرائح الفيديو الحديثة. قرر المطورون أن يجعلوا وحدة معالجة الرسومات لا تحسب فقط الصورة في التطبيقات ثلاثية الأبعاد ، بل تُستخدم أيضًا في الحسابات المتوازية الأخرى. في GPGPU ، تم استخدام واجهات برمجة التطبيقات الرسومية لهذا: OpenGL و Direct3D ، عندما تم نقل البيانات إلى شريحة الفيديو في شكل مواد ، وتم تحميل برامج الحساب في شكل تظليل. تتمثل عيوب هذه الطريقة في التعقيد العالي نسبيًا للبرمجة ، وانخفاض سرعة تبادل البيانات بين وحدة المعالجة المركزية ووحدة معالجة الرسومات ، والقيود الأخرى ، والتي سنناقشها أدناه.

تطورت حوسبة GPU وتتطور بسرعة كبيرة. وفي المستقبل ، طورت الشركتان الرئيسيتان لشرائح الفيديو ، Nvidia و AMD ، وأعلنت عن المنصات المقابلة التي تسمى CUDA (Compute Unified Device Architecture) و CTM (بالقرب من المعدن أو AMD Stream Computing) ، على التوالي. على عكس نماذج برمجة GPU السابقة ، تم إجراء ذلك من خلال الوصول المباشر إلى إمكانيات أجهزة بطاقات الفيديو. الأنظمة الأساسية غير متوافقة مع بعضها البعض ، CUDA هو امتداد للغة البرمجة C ، و CTM هي آلة افتراضية تنفذ كود التجميع. بدلاً من ذلك ، أزال كلا النظامين بعض القيود المهمة لنماذج GPGPU السابقة باستخدام خط أنابيب الرسومات التقليدي وواجهات Direct3D أو OpenGL المقابلة.

بالطبع ، يبدو أن المعايير المفتوحة التي تستخدم OpenGL هي الأكثر قابلية للنقل والشاملة ، فهي تسمح باستخدام نفس الكود لرقائق الفيديو من مختلف الشركات المصنعة. لكن مثل هذه الأساليب لها الكثير من العيوب ، فهي أقل مرونة بكثير وغير ملائمة للاستخدام. بالإضافة إلى ذلك ، فهي لا تسمح باستخدام القدرات المحددة لبعض بطاقات الفيديو ، مثل الذاكرة المشتركة (المشتركة) السريعة الموجودة في معالجات الحوسبة الحديثة.

هذا هو السبب في أن Nvidia أصدرت منصة CUDA - لغة برمجة تشبه C مع مترجمها ومكتباتها الخاصة بحوسبة GPU. بالطبع ، كتابة الكود الأمثل لرقائق الفيديو ليست بهذه البساطة على الإطلاق وتتطلب هذه المهمة عملاً يدويًا طويلاً ، لكن CUDA يكشف فقط عن جميع الاحتمالات ويمنح المبرمج مزيدًا من التحكم في إمكانيات الأجهزة الخاصة بوحدة معالجة الرسومات. من المهم أن تدعم رقائق G8x و G9x و GT2xx المستخدمة في سلسلة بطاقات الرسوم Geforce 8 و 9 و 200 دعم Nvidia CUDA ، وهو واسع الانتشار. حاليًا ، تم إصدار الإصدار الأخير من CUDA 2.0 ، والذي يقدم بعض الميزات الجديدة ، على سبيل المثال ، دعم حسابات الدقة المزدوجة. يتوفر CUDA على أنظمة تشغيل Linux و Windows و MacOS X 32 بت و 64 بت.

الفرق بين CPU و GPU في العمليات الحسابية المتوازية

واجهت الزيادة في وتيرة المعالجات الشاملة قيودًا مادية واستهلاكًا عاليًا للطاقة ، ويتزايد أدائها بشكل متزايد بسبب وضع العديد من النوى في شريحة واحدة. تحتوي المعالجات التي تم بيعها الآن على ما يصل إلى أربعة مراكز فقط (لن يكون المزيد من النمو سريعًا) وهي مصممة للتطبيقات العادية ، وتستخدم MIMD - دفق متعدد من التعليمات والبيانات. يعمل كل مركز بشكل منفصل عن الآخر ، وينفذ تعليمات مختلفة لعمليات مختلفة.

ظهرت قدرات المتجهات المتخصصة (SSE2 و SSE3) للمتجهات المكونة من أربعة مكونات (النقطة العائمة أحادية الدقة) والمتجهات المكونة من مكونين (الدقة المزدوجة) في المعالجات ذات الأغراض العامة بسبب المتطلبات المتزايدة لتطبيقات الرسومات ، في المقام الأول. هذا هو السبب في أن استخدام وحدات معالجة الرسومات بالنسبة لبعض المهام يكون أكثر ربحية ، لأنها صُنعت من أجلهم في الأصل.

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

الأهم من ذلك ، أن هذه النوى متعددة المعالجات في وحدة معالجة الرسومات هي نوى SIMD (دفق تعليمات واحد ، تدفقات بيانات متعددة). وتقوم هذه النوى بتنفيذ نفس التعليمات في نفس الوقت ، أسلوب البرمجة هذا شائع للخوارزميات الرسومية والعديد من المشكلات العلمية ، ولكنه يتطلب برمجة محددة. لكن هذا النهج يسمح لك بزيادة عدد وحدات التنفيذ بسبب تبسيطها.

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

يحاول مصممو وحدة المعالجة المركزية الحصول على أكبر عدد ممكن من التعليمات للتشغيل بالتوازي قدر الإمكان لتحسين الأداء. لهذا الغرض ، بدءًا من معالجات Intel Pentium ، ظهر تنفيذ superscalar ، والذي يضمن تنفيذ تعليمتين في كل ساعة ، وميز Pentium Pro نفسه بتنفيذ تعليمات خارج الترتيب. لكن التنفيذ المتوازي لتيار متسلسل من التعليمات له قيود أساسية معينة وبزيادة عدد وحدات التنفيذ ، لا يمكن تحقيق زيادة متعددة في السرعة.

بالنسبة لشرائح الفيديو ، يكون العمل بسيطًا ومتوازيًا في البداية. تأخذ شريحة الفيديو مجموعة من المضلعات كمدخلات ، وتنفذ جميع العمليات الضرورية ، وتخرج وحدات البكسل عند الإخراج. تعتبر معالجة المضلعات والبكسل مستقلة ، ويمكن معالجتها بالتوازي ، بشكل منفصل عن بعضها البعض. لذلك ، نظرًا للتنظيم المتوازي الأولي للعمل في وحدة معالجة الرسومات ، يتم استخدام عدد كبير من وحدات التنفيذ ، والتي يسهل تحميلها ، على عكس التدفق المتسلسل للتعليمات لوحدة المعالجة المركزية. بالإضافة إلى ذلك ، يمكن لوحدات معالجة الرسومات الحديثة أيضًا تنفيذ أكثر من تعليمات لكل دورة ساعة (إصدار مزدوج). وبالتالي ، فإن بنية Tesla ، في ظل بعض الظروف ، تطلق عمليات MAD + MUL أو MAD + SFU في وقت واحد.

تختلف وحدة معالجة الرسومات عن وحدة المعالجة المركزية أيضًا من حيث الوصول إلى الذاكرة. في وحدة معالجة الرسومات (GPU) ، يتم توصيله ويمكن التنبؤ به بسهولة - إذا تمت قراءة نص النسيج من الذاكرة ، فسيأتي الوقت بعد فترة للتكسيل المجاورة أيضًا. نعم ، ونفس الشيء أثناء التسجيل - تتم كتابة البكسل في المخزن المؤقت للإطار ، وبعد بضع دورات على مدار الساعة ، سيتم تسجيل العنصر الموجود بجواره. لذلك ، يختلف تنظيم الذاكرة عن التنظيم المستخدم في وحدة المعالجة المركزية. وشريحة الفيديو ، على عكس المعالجات العامة ، لا تحتاج ببساطة إلى ذاكرة تخزين مؤقت كبيرة ، ولا تتطلب التركيبات سوى عدد قليل (حتى 128-256 في وحدات معالجة الرسومات الحالية).

وفي حد ذاته ، يختلف العمل مع الذاكرة لوحدة معالجة الرسومات ووحدة المعالجة المركزية إلى حد ما. لذلك ، لا تحتوي جميع المعالجات المركزية على وحدات تحكم ذاكرة مدمجة ، وعادة ما تحتوي جميع وحدات معالجة الرسومات على العديد من وحدات التحكم ، حتى ثماني قنوات 64 بت في شريحة Nvidia GT200. بالإضافة إلى ذلك ، يتم استخدام ذاكرة أسرع على بطاقات الفيديو ، ونتيجة لذلك ، فإن شرائح الفيديو لديها عرض نطاق ترددي أكبر بعدة مرات ، وهو أمر مهم أيضًا للحسابات المتوازية التي تعمل مع تدفقات بيانات ضخمة.

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

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

هناك العديد من الاختلافات في دعم multithreading كذلك. تقوم وحدة المعالجة المركزية (CPU) بإجراء 1-2 من سلاسل العمليات الحسابية لكل نواة معالج ، ويمكن لشرائح الفيديو أن تدعم ما يصل إلى 1024 مؤشر ترابط لكل معالجات متعددة ، والتي يوجد منها العديد في الشريحة. وإذا كان التبديل من مؤشر ترابط إلى آخر لوحدة المعالجة المركزية يكلف مئات الدورات ، فإن وحدة معالجة الرسومات تقوم بتبديل عدة خيوط في دورة واحدة.

بالإضافة إلى ذلك ، تستخدم وحدات المعالجة المركزية كتل SIMD (يتم تنفيذ تعليمات واحدة على بيانات متعددة) لحساب المتجهات ، وتستخدم شرائح الفيديو SIMT (تعليمات واحدة وخيوط متعددة) للمعالجة العددية للتدفقات. لا تتطلب SIMT من المطور تحويل البيانات إلى متجهات ، وتسمح بالتفرع التعسفي في التدفقات.

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

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

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

نتيجة لجميع الاختلافات الموضحة أعلاه ، فإن الأداء النظري لرقائق الفيديو يتجاوز بشكل كبير أداء وحدة المعالجة المركزية. تقدم Nvidia هذا الرسم البياني لنمو أداء وحدة المعالجة المركزية ووحدة معالجة الرسومات على مدار السنوات القليلة الماضية:

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

المحاولات الأولى لاستخدام حوسبة GPU

لقد حاولوا استخدام شرائح الفيديو في حسابات رياضية متوازية لفترة طويلة. كانت المحاولات الأولى لمثل هذا التطبيق بدائية للغاية وكانت تقتصر على استخدام بعض ميزات الأجهزة مثل التنقيط والتخزين المؤقت Z. لكن في هذا القرن ، مع ظهور أدوات التظليل ، بدأوا في تسريع حسابات المصفوفة. في عام 2003 ، في SIGGRAPH ، تم تخصيص قسم منفصل لحوسبة GPU ، وتم تسميته GPGPU (حساب الأغراض العامة على GPU).

أشهر BrookGPU هو مترجم لغة البرمجة المتدفقة Brook المصمم لأداء العمليات الحسابية غير الرسومية على وحدة معالجة الرسومات. قبل ظهوره ، اختار المطورون الذين يستخدمون قدرات رقائق الفيديو للحوسبة واحدة من اثنين من واجهات برمجة التطبيقات الشائعة: Direct3D أو OpenGL. أدى هذا إلى تقييد استخدام وحدات معالجة الرسومات بشكل خطير ، نظرًا لاستخدام التظليل والأنسجة في الرسومات ثلاثية الأبعاد ، والتي لا يُطلب من المتخصصين في البرمجة المتوازية معرفتها ، فهم يستخدمون الخيوط والنوى. كان Brook قادرًا على المساعدة في تسهيل مهمتهم. هذه الامتدادات المتدفقة للغة C ، التي تم تطويرها في جامعة ستانفورد ، أخفت واجهة برمجة التطبيقات ثلاثية الأبعاد من المبرمجين وقدمت شريحة الفيديو على أنها معالج مساعد موازٍ. قام المترجم بتحليل ملف .br باستخدام كود C ++ وملحقاته ، مما أدى إلى إنتاج رمز مرتبط بمكتبة DirectX أو OpenGL أو x86.

بطبيعة الحال ، كان لدى Brook العديد من العيوب ، والتي توقفنا عندها ، والتي سنتحدث عنها بمزيد من التفصيل أدناه. ولكن حتى مجرد ظهورها تسبب في تدفق كبير لاهتمام نفس Nvidia و ATI لمبادرة الحوسبة على وحدات معالجة الرسومات ، حيث أدى تطوير هذه القدرات إلى تغيير السوق بشكل خطير في المستقبل ، وفتح قطاع جديد بالكامل منه - أجهزة الكمبيوتر المتوازية القائمة على شرائح الفيديو.

بعد ذلك ، انضم بعض الباحثين من مشروع Brook إلى فريق تطوير Nvidia لتقديم إستراتيجية الحوسبة المتوازية للأجهزة والبرمجيات ، مما فتح حصة سوقية جديدة. والميزة الرئيسية لمبادرة Nvidia هذه هي أن المطورين يدركون جيدًا جميع إمكانيات وحدات معالجة الرسومات الخاصة بهم بأدق التفاصيل ، ولا داعي لاستخدام واجهة برمجة تطبيقات الرسومات ، ويمكنك العمل مع الأجهزة مباشرةً باستخدام برنامج التشغيل. كانت نتيجة جهود هذا الفريق هي Nvidia CUDA (هندسة الكمبيوتر الموحدة للجهاز) ، وهي بنية جديدة للأجهزة والبرامج للحوسبة المتوازية على وحدة معالجة الرسومات Nvidia التي تتناولها هذه المقالة.

تطبيقات الحوسبة المتوازية GPU

لفهم فوائد نقل الحسابات إلى شرائح الفيديو ، إليك متوسط ​​الأرقام التي حصل عليها الباحثون حول العالم. في المتوسط ​​، عند نقل الحوسبة إلى وحدة معالجة الرسومات ، يكون التسارع في العديد من المهام من 5 إلى 30 مرة ، مقارنة بالمعالجات السريعة للأغراض العامة. يتم تحقيق أكبر الأرقام (بترتيب تسارع 100 ضعف وأكثر!) في رمز غير مناسب تمامًا للحسابات باستخدام كتل SSE ، ولكنه مناسب تمامًا لوحدة معالجة الرسومات.

هذه مجرد أمثلة على تسريع الكود التركيبي على وحدة معالجة الرسومات مقابل رمز SSE المتجه على وحدة المعالجة المركزية (وفقًا لـ Nvidia):

  • الفحص المجهري الإسفار: 12x ؛
  • الديناميات الجزيئية (حساب القوة غير المرتبطة): 8-16x ؛
  • الكهرباء الساكنة (تكديس كولوم المباشر ومتعدد المستويات): 40-120x و 7x.

وهذه اللوحة التي تحبها Nvidia كثيرًا ، حيث تظهرها في جميع العروض التقديمية ، والتي سنتناولها بمزيد من التفصيل في الجزء الثاني من المقالة ، والمخصص لأمثلة محددة من التطبيقات العملية لحوسبة CUDA:

كما ترى ، فإن الأرقام جذابة للغاية ، ومكاسب 100-150x مثيرة للإعجاب بشكل خاص. في المقالة التالية حول CUDA ، سنقوم بتفصيل بعض هذه الأرقام بالتفصيل. الآن دعنا ندرج التطبيقات الرئيسية التي تُستخدم فيها حوسبة GPU حاليًا: تحليل ومعالجة الصور والإشارات ، ومحاكاة الفيزياء ، والرياضيات الحسابية ، وعلم الأحياء الحسابي ، والحسابات المالية ، وقواعد البيانات ، وديناميات الغاز والسائل ، والتشفير ، والعلاج الإشعاعي التكيفي ، وعلم الفلك ، ومعالجة الصوت والمعلوماتية الحيوية والمحاكاة البيولوجية ورؤية الكمبيوتر واستخراج البيانات والسينما الرقمية والتلفزيون والمحاكاة الكهرومغناطيسية وأنظمة المعلومات الجغرافية والتطبيقات العسكرية وتخطيط التعدين والديناميات الجزيئية والتصوير بالرنين المغناطيسي والشبكات العصبية والبحوث الأوقيانوغرافية وفيزياء الجسيمات والبروتين محاكاة الطي ، كيمياء الكم ، تتبع الأشعة ، التصور ، الرادار ، محاكاة المكامن ، الذكاء الاصطناعي ، تحليل بيانات الأقمار الصناعية ، الاستكشاف الزلزالي ، الجراحة ، الموجات فوق الصوتية ، مؤتمرات الفيديو.

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

ميزات Nvidia CUDA

تقنية CUDA هي بنية حوسبة للبرامج والأجهزة من Nvidia تستند إلى امتداد للغة C ، مما يجعل من الممكن تنظيم الوصول إلى مجموعة من التعليمات الخاصة بمسرع الرسومات وإدارة ذاكرته عند تنظيم الحوسبة المتوازية. تساعد CUDA في تنفيذ الخوارزميات القابلة للتنفيذ على وحدات معالجة الرسومات من الجيل الثامن من مسرعات الفيديو Geforce (سلسلة Geforce 8 و Geforce 9 و Geforce 200) ، بالإضافة إلى Quadro و Tesla.

على الرغم من أن تعقيد برمجة GPU باستخدام CUDA مرتفع جدًا ، إلا أنه أقل من حلول GPGPU السابقة. تتطلب مثل هذه البرامج تقسيم التطبيق بين عدة معالجات متعددة مماثلة لبرمجة MPI ، ولكن دون تقسيم البيانات المخزنة في ذاكرة الفيديو المشتركة. ونظرًا لأن برمجة CUDA لكل متعدد المعالجات تشبه برمجة OpenMP ، فإنها تتطلب فهمًا جيدًا لتنظيم الذاكرة. ولكن ، بالطبع ، يعتمد تعقيد التطوير والنقل إلى CUDA بشكل كبير على التطبيق.

تحتوي مجموعة أدوات التطوير على العديد من أمثلة التعليمات البرمجية وهي موثقة جيدًا. ستستغرق عملية التعلم حوالي أسبوعين إلى أربعة أسابيع لمن هم على دراية بالفعل بـ OpenMP و MPI. تعتمد واجهة برمجة التطبيقات على لغة C الموسعة ، ولترجمة التعليمات البرمجية من هذه اللغة ، تتضمن CUDA SDK مترجم سطر أوامر nvcc استنادًا إلى مترجم Open64 مفتوح المصدر.

دعنا نسرد الخصائص الرئيسية لـ CUDA:

  • حل الأجهزة والبرامج الموحدة للحوسبة المتوازية على رقائق الفيديو Nvidia ؛
  • مجموعة واسعة من الحلول المدعومة ، من المحمول إلى multichip
  • لغة البرمجة C القياسية ؛
  • مكتبات التحليل الرقمي القياسية FFT (تحويل فورييه السريع) و BLAS (الجبر الخطي) ؛
  • تبادل البيانات الأمثل بين وحدة المعالجة المركزية ووحدة معالجة الرسومات ؛
  • التفاعل مع واجهات برمجة تطبيقات الرسومات OpenGL و DirectX ؛
  • دعم أنظمة التشغيل 32 و 64 بت: Windows XP و Windows Vista و Linux و MacOS X ؛
  • القدرة على التطور بمستوى منخفض.

فيما يتعلق بدعم نظام التشغيل ، يجب إضافة أن جميع توزيعات Linux الرئيسية مدعومة رسميًا (Red Hat Enterprise Linux 3.x / 4.x / 5.x ، SUSE Linux 10.x) ، ولكن وفقًا لبيانات المتحمسين ، CUDA يعمل بشكل رائع مع التجميعات الأخرى: Fedora Core و Ubuntu و Gentoo وما إلى ذلك.

تتضمن بيئة تطوير CUDA (مجموعة أدوات CUDA) ما يلي:

  • مترجم nvcc
  • مكتبات FFT و BLAS ؛
  • المحلل.
  • مصحح أخطاء gdb لوحدة معالجة الرسومات ؛
  • برنامج تشغيل CUDA المتضمن مع برامج تشغيل Nvidia القياسية
  • دليل البرمجة
  • CUDA Developer SDK (المصدر والمرافق والوثائق).

في أمثلة التعليمات البرمجية المصدر: الفرز بتوني متوازي ، تبديل المصفوفة ، تجميع البادئة المتوازية للمصفوفات الكبيرة ، التفاف الصورة ، تحويل الموجة المنفصلة ، مثال على التفاعل مع OpenGL و Direct3D ، باستخدام مكتبات CUBLAS و CUFFT ، حساب سعر الخيار (صيغة بلاك Scholes ، نموذج ذو الحدين ، طريقة مونت كارلو) ، مولد الأرقام العشوائية المتوازية Mersenne Twister ، حساب مخطط بياني كبير للصفيف ، تقليل الضوضاء ، مرشح سوبل (إيجاد الحدود).

فوائد وقيود CUDA

من وجهة نظر المبرمج ، خط أنابيب الرسومات عبارة عن مجموعة من مراحل المعالجة. تولد الكتلة الهندسية مثلثات ، وتولد الكتلة النقطية وحدات البكسل المعروضة على الشاشة. يبدو نموذج برمجة GPGPU التقليدي كما يلي:

لنقل العمليات الحسابية إلى وحدات معالجة الرسومات في إطار مثل هذا النموذج ، يلزم اتباع نهج خاص. ستتطلب إضافة متجهين حتى من ناحية العناصر رسم الشكل على الشاشة أو إلى مخزن مؤقت خارج الشاشة. الشكل نقطي ، يتم حساب لون كل بكسل وفقًا للبرنامج المحدد (تظليل البكسل). يقوم البرنامج بقراءة بيانات الإدخال من الأنسجة لكل بكسل ، ويضيفها ويكتب إلى المخزن المؤقت للإخراج. وكل هذه العمليات العديدة ضرورية لما يتم كتابته بلغة برمجة عادية في مشغل واحد!

لذلك ، فإن استخدام GPGPU للحوسبة ذات الأغراض العامة له قيود في شكل صعوبة كبيرة في تدريب المطورين. وهناك قيود أخرى كافية ، لأن تظليل البكسل هو مجرد صيغة لاعتماد لون البكسل النهائي على إحداثياته ​​، ولغة تظليل البكسل هي لغة لكتابة هذه الصيغ بصيغة تشبه C. تعد تقنيات GPGPU المبكرة خدعة صعبة لاستغلال قوة وحدة معالجة الرسومات ، ولكن دون أي راحة. يتم تمثيل البيانات هناك بالصور (القوام) ، ويتم تمثيل الخوارزمية من خلال عملية التنقيط. يجب أيضًا ملاحظة ذاكرة محددة جدًا ونموذج تنفيذ.

تختلف بنية أجهزة وبرمجيات Nvidia الخاصة بحوسبة GPU عن نماذج GPGPU السابقة من حيث أنها تسمح لك بكتابة برامج GPU في لغة C حقيقية مع بناء جملة قياسي ، ومؤشرات ، والحاجة إلى الحد الأدنى من الامتدادات للوصول إلى موارد الحوسبة لرقائق الفيديو. تعد CUDA مستقلة عن واجهات برمجة تطبيقات الرسومات ، وتحتوي على بعض الميزات المصممة خصيصًا للحوسبة العامة.

مزايا CUDA على النهج التقليدي لحوسبة GPGPU:

  • تعتمد واجهة برمجة تطبيقات CUDA على لغة برمجة C القياسية ذات الامتدادات ، مما يبسط عملية التعلم وتنفيذ بنية CUDA ؛
  • يوفر CUDA الوصول إلى ذاكرة مشتركة بسعة 16 كيلو بايت لكل معالجات متعددة ، والتي يمكن استخدامها لإنشاء ذاكرة تخزين مؤقت ذات نطاق ترددي أوسع من عينات النسيج ؛
  • نقل بيانات أكثر كفاءة بين ذاكرة النظام والفيديو
  • لا حاجة لواجهات برمجة التطبيقات الرسومية مع التكرار والنفقات العامة ؛
  • الذاكرة الخطية عنونة ، وتجمع وتشتت ، القدرة على الكتابة إلى عناوين عشوائية ؛
  • دعم الأجهزة لعمليات عدد صحيح وبت.

القيود الرئيسية لـ CUDA:

  • عدم وجود دعم العودية للوظائف المؤداة ؛
  • الحد الأدنى لعرض الكتلة 32 خيطًا ؛
  • الهندسة المعمارية المغلقة CUDA ، المملوكة لشركة Nvidia.

تتمثل نقاط الضعف في البرمجة باستخدام أساليب GPGPU السابقة في أن هذه الأساليب لا تستخدم وحدات تنفيذ تظليل الرأس في البنى السابقة غير الموحدة ، ويتم تخزين البيانات في نسيج ، ولكن يتم إخراجها إلى مخزن مؤقت خارج الشاشة ، وتستخدم خوارزميات التمرير المتعددة تظليل البكسل الوحدات. يمكن أن تشمل قيود GPGPU: الاستخدام غير الكافي لقدرات الأجهزة ، وقيود عرض النطاق الترددي للذاكرة ، وعدم وجود عملية تشتيت (تجميع فقط) ، والاستخدام الإلزامي لواجهة برمجة التطبيقات للرسومات.

تنبع المزايا الرئيسية لـ CUDA على طرق GPGPU السابقة من حقيقة أن هذه البنية مصممة للاستخدام الفعال للحوسبة غير الرسومية على وحدة معالجة الرسومات وتستخدم لغة البرمجة C ، دون الحاجة إلى نقل الخوارزميات إلى نموذج مناسب للمفهوم لخط أنابيب الرسومات. تقدم CUDA طريقة جديدة لحوسبة GPU لا تستخدم واجهات برمجة التطبيقات للرسومات ، مما يوفر وصولاً عشوائيًا إلى الذاكرة (التشتت أو التجميع). تخلو هذه البنية من عيوب GPGPU وتستخدم جميع وحدات التنفيذ ، كما أنها توسع القدرات بسبب العمليات الحسابية الصحيحة وعمليات إزاحة البتات.

بالإضافة إلى ذلك ، يفتح CUDA بعض إمكانيات الأجهزة غير المتوفرة من واجهات برمجة تطبيقات الرسومات ، مثل الذاكرة المشتركة. هذه كمية صغيرة من الذاكرة (16 كيلو بايت لكل معالج متعدد) ، والتي يمكن الوصول إليها عن طريق كتل الخيط. يتيح لك تخزين البيانات التي يتم الوصول إليها بشكل متكرر ويمكن أن يوفر سرعة أعلى من استخدام عمليات جلب النسيج لهذه المهمة. وهذا بدوره يقلل من حساسية النطاق الترددي للخوارزميات المتوازية في العديد من التطبيقات. على سبيل المثال ، يكون مفيدًا لمرشحات الجبر الخطي و FFT ومعالجة الصور.

أكثر ملاءمة في CUDA والوصول إلى الذاكرة. يقوم كود البرنامج في واجهة برمجة التطبيقات الرسومية بإخراج البيانات في شكل 32 قيمة نقطة عائمة أحادية الدقة (قيم RGBA في وقت واحد في ثمانية أهداف تصيير) إلى مناطق محددة مسبقًا ، ويدعم CUDA التسجيل المتبعثر - عدد غير محدود من السجلات في أي عنوان. تتيح هذه المزايا إمكانية تنفيذ بعض الخوارزميات على وحدة معالجة الرسومات التي لا يمكن تنفيذها بكفاءة باستخدام أساليب GPGPU القائمة على واجهات برمجة تطبيقات الرسومات.

أيضًا ، تقوم واجهات برمجة التطبيقات الخاصة بالرسومات بالضرورة بتخزين البيانات في مواد ، الأمر الذي يتطلب تعبئة أولية لمصفوفات كبيرة في مواد ، مما يعقد الخوارزمية ويفرض استخدام عنونة خاصة. ويتيح لك CUDA قراءة البيانات على أي عنوان. ميزة أخرى لـ CUDA هي تبادل البيانات المحسن بين وحدة المعالجة المركزية ووحدة معالجة الرسومات. وبالنسبة للمطورين الذين يتطلعون إلى الوصول إلى مستوى منخفض (على سبيل المثال ، عند كتابة لغة برمجة أخرى) ، يوفر CUDA إمكانية برمجة لغة تجميع منخفضة المستوى.

تاريخ تطوير كودا

تم الإعلان عن تطوير CUDA بشريحة G80 في نوفمبر 2006 ، وتم إصدار النسخة التجريبية العامة من CUDA SDK في فبراير 2007. تم إصدار الإصدار 1.0 في يونيو 2007 لإطلاق حلول Tesla القائمة على شريحة G80 والمخصصة لسوق الحوسبة عالية الأداء. بعد ذلك ، في نهاية العام ، تم إصدار النسخة التجريبية من CUDA 1.1 ، والتي ، على الرغم من الزيادة الطفيفة في رقم الإصدار ، قدمت الكثير من الأشياء الجديدة.

الجديد في CUDA 1.1 هو تضمين وظيفة CUDA في برامج تشغيل فيديو Nvidia العادية. هذا يعني أنه في متطلبات أي برنامج CUDA كان كافياً تحديد بطاقة فيديو Geforce 8 أو أعلى ، بالإضافة إلى الحد الأدنى من إصدار برنامج التشغيل 169.xx. هذا مهم جدًا للمطورين ، إذا تم استيفاء هذه الشروط ، فستعمل برامج CUDA مع أي مستخدم. أضاف أيضًا التنفيذ غير المتزامن إلى جانب نسخ البيانات (فقط للرقائق G84 و G86 و G92 وأعلى) ، ونقل البيانات غير المتزامن إلى ذاكرة الفيديو ، وعمليات الوصول إلى الذاكرة الذرية ، ودعم إصدارات Windows 64 بت والقدرة على تشغيل CUDA متعدد الشرائح في SLI الوضع.

في الوقت الحالي ، تم إصدار الإصدار الفعلي للحلول المستندة إلى GT200 - CUDA 2.0 مع خط Geforce GTX 200. تم إصدار النسخة التجريبية مرة أخرى في ربيع عام 2008. يقدم الإصدار الثاني: دعم العمليات الحسابية ذات الدقة المزدوجة (دعم الأجهزة فقط لـ GT200) ، وأخيراً يتم دعم Windows Vista (إصدارات 32 و 64 بت) و Mac OS X ، وإضافة أدوات التصحيح والتنميط ، ودعم القوام ثلاثي الأبعاد ، والبيانات المحسّنة نقل.

فيما يتعلق بالحسابات ذات الدقة المزدوجة ، فإن سرعتها في توليد الأجهزة الحالي أقل بعدة مرات من الدقة الفردية. تمت مناقشة الأسباب في منطقتنا. يكمن التنفيذ في GT200 لهذا الدعم في حقيقة أن كتل FP32 لا تستخدم للحصول على النتيجة بمعدل أقل أربع مرات ؛ لدعم حسابات FP64 ، قررت Nvidia إنشاء كتل حسابية مخصصة. وفي GT200 ، يوجد منها أقل بعشر مرات من كتل FP32 (كتلة واحدة مزدوجة الدقة لكل متعدد المعالجات).

في الواقع ، قد يكون الأداء أقل ، حيث تم تحسين البنية لقراءة 32 بت من الذاكرة والسجلات ، بالإضافة إلى عدم الحاجة إلى الدقة المزدوجة في تطبيقات الرسومات ، وفي GT200 أصبح من المرجح أن تكون بسيطة. ولا تظهر المعالجات رباعية النوى الحديثة أداءً حقيقيًا أقل بكثير. ولكن نظرًا لكونه أبطأ 10 مرات من الدقة الفردية ، فإن هذا الدعم مفيد لتصميمات الدقة المختلطة. تتمثل إحدى التقنيات الشائعة في الحصول على نتائج التقريب الأولي بدقة فردية ، ثم تنقيحها بدقة مضاعفة. الآن يمكن القيام بذلك مباشرة على بطاقة الفيديو ، دون إرسال بيانات وسيطة إلى وحدة المعالجة المركزية.

ميزة أخرى مفيدة لـ CUDA 2.0 لا تتعلق بوحدة معالجة الرسومات ، بشكل غريب بما فيه الكفاية. أصبح من الممكن الآن تجميع كود CUDA في كود SSE متعدد الخيوط عالي الكفاءة للتنفيذ السريع على وحدة المعالجة المركزية. وهذا يعني أن هذه الميزة الآن مناسبة ليس فقط لتصحيح الأخطاء ، ولكن أيضًا للاستخدام الحقيقي على الأنظمة التي لا تحتوي على بطاقة فيديو Nvidia. بعد كل شيء ، فإن استخدام CUDA في الكود العادي مقيد بحقيقة أن بطاقات الفيديو Nvidia ، على الرغم من أنها الأكثر شيوعًا بين حلول الفيديو المخصصة ، غير متوفرة في جميع الأنظمة. وقبل الإصدار 2.0 ، في مثل هذه الحالات ، سيتعين عليك إنشاء رمزين مختلفين: لـ CUDA وبشكل منفصل لوحدة المعالجة المركزية. والآن يمكنك تنفيذ أي برنامج CUDA على وحدة المعالجة المركزية بكفاءة عالية ، وإن كان ذلك بسرعة أقل من سرعة رقائق الفيديو.

حلول بدعم Nvidia CUDA

يمكن أن تساعد جميع بطاقات الرسوم التي تدعم CUDA في تسريع المهام الأكثر تطلبًا ، من معالجة الصوت والفيديو إلى الطب والبحث العلمي. القيد الحقيقي الوحيد هو أن العديد من برامج CUDA تتطلب ما لا يقل عن 256 ميغا بايت من ذاكرة الفيديو ، والتي تعد واحدة من أهم المواصفات الفنية لتطبيقات CUDA.

للحصول على قائمة محدثة بالمنتجات التي تدعم CUDA ، قم بزيارة. في وقت كتابة هذا التقرير ، دعمت حسابات CUDA جميع منتجات سلسلة Geforce 200 و Geforce 9 و Geforce 8 ، بما في ذلك المنتجات المحمولة التي تبدأ بـ Geforce 8400M ، بالإضافة إلى مجموعات شرائح Geforce 8100 و 8200 و 8300. أيضًا ، مجموعة شرائح Quadro الحديثة و جميع تسلا: S1070 و C1060 و C870 و D870 و S870.

نلاحظ بشكل خاص أنه إلى جانب بطاقات الرسوم الجديدة Geforce GTX 260 و 280 ، تم الإعلان عن الحلول المقابلة للحوسبة عالية الأداء: Tesla C1060 و S1070 (كما هو موضح في الصورة أعلاه) ، والتي ستكون متاحة للشراء هذا الخريف. وحدة معالجة الرسومات هي نفسها فيها - GT200 ، في C1060 واحدة ، في S1070 - أربعة. ولكن ، على عكس حلول الألعاب ، يستخدمون أربعة غيغابايت من الذاكرة لكل شريحة. العيوب الوحيدة هي انخفاض تردد الذاكرة وعرض النطاق الترددي للذاكرة مقارنة ببطاقات الألعاب ، والتي توفر 102 جيجابايت / ثانية لكل شريحة.

قائمة Nvidia CUDA

يشتمل CUDA على اثنين من واجهات برمجة التطبيقات: مستوى عالٍ (CUDA Runtime API) ومستوى منخفض (CUDA Driver API) ، على الرغم من أنه من غير الممكن استخدام كليهما في نفس الوقت في برنامج واحد ، فأنت بحاجة إلى استخدام أحدهما أو الآخر. يعمل المستوى العالي "فوق" المستوى المنخفض ، ويتم ترجمة جميع استدعاءات وقت التشغيل إلى تعليمات بسيطة تتم معالجتها بواسطة واجهة برمجة تطبيقات التشغيل منخفضة المستوى. ولكن حتى API "عالي المستوى" يفترض المعرفة حول بنية وتشغيل رقائق الفيديو Nvidia ، لا يوجد مستوى عالٍ جدًا من التجريد هناك.

يوجد مستوى آخر ، أعلى - مكتبتان:

كوبلاس- إصدار CUDA من BLAS (البرامج الفرعية للجبر الخطي الأساسي) ، المصمم لحساب مشاكل الجبر الخطي واستخدام الوصول المباشر إلى موارد وحدة معالجة الرسومات ؛

CUFFT- إصدار CUDA من مكتبة Fast Fourier Transform لحساب تحويل فورييه السريع ، والذي يستخدم على نطاق واسع في معالجة الإشارات. يتم دعم أنواع التحويل التالية: معقد - معقد (C2C) ، ومعقد حقيقي (R2C) ، ومعقد - حقيقي (C2R).

دعونا نلقي نظرة فاحصة على هذه المكتبات. CUBLAS هي خوارزميات الجبر الخطي القياسية المترجمة إلى لغة CUDA ، حاليًا فقط مجموعة معينة من وظائف CUBLAS الأساسية مدعومة. المكتبة سهلة الاستخدام للغاية: تحتاج إلى إنشاء مصفوفة وكائنات متجهة في ذاكرة بطاقة الفيديو ، وتعبئتها بالبيانات ، واستدعاء وظائف CUBLAS المطلوبة ، وإعادة تحميل النتائج من ذاكرة الفيديو إلى ذاكرة النظام. يحتوي CUBLAS على وظائف خاصة لإنشاء الكائنات وإتلافها في ذاكرة وحدة معالجة الرسومات ، وكذلك لقراءة البيانات وكتابتها في هذه الذاكرة. وظائف BLAS المدعومة: المستويات 1 و 2 و 3 للأرقام الحقيقية ، والمستوى 1 CGEMM للأرقام المركبة. المستوى 1 عبارة عن عمليات متجهية ، والمستوى 2 عمليات مصفوفة متجهة ، والمستوى 3 عمليات مصفوفة مصفوفة.

CUFFT - متغير CUDA لوظيفة تحويل فورييه السريع - يستخدم على نطاق واسع ومهم للغاية في تحليل الإشارات والتصفية وما إلى ذلك. يوفر CUFFT واجهة بسيطة لحساب FFT بكفاءة على وحدات معالجة الرسومات Nvidia دون الحاجة إلى تطوير GPU FFT الخاص بك. يدعم إصدار CUDA من FFT عمليات التحويل 1D و 2 D و 3D للبيانات المعقدة والحقيقية ، ويمكن تنفيذ دفعة للعديد من التحويلات 1D بالتوازي ، والتحويلات ثنائية وثلاثية الأبعاد ، ويمكن دعم ما يصل إلى 8 ملايين عنصر لـ 1D.

أساسيات برمجة CUDA

لفهم النص الإضافي ، يجب أن تفهم الميزات المعمارية الأساسية لرقائق فيديو Nvidia. تتكون وحدة معالجة الرسومات من عدة مجموعات معالجة نسيج. تتكون كل مجموعة من كتلة مكبرة من عينات النسيج واثنان أو ثلاثة معالجات متعددة متدفقة ، كل منها يتكون من ثمانية أجهزة حاسوبية وكتلتين فائقتين. يتم تنفيذ جميع التعليمات وفقًا لمبدأ SIMD ، عند تطبيق تعليمات واحدة على جميع الخيوط في الالتواء (مصطلح من صناعة النسيج ، في CUDA ، هذه مجموعة من 32 سلسلة - الحد الأدنى من البيانات التي تتم معالجتها بواسطة المعالجات المتعددة). كانت طريقة التنفيذ هذه تسمى SIMT (تعليمات مفردة متعددة الخيوط).

كل من المعالجات المتعددة لديه موارد معينة. لذلك ، هناك ذاكرة مشتركة خاصة تبلغ 16 كيلو بايت لكل معالج متعدد. لكن هذه ليست ذاكرة تخزين مؤقت ، حيث يمكن للمبرمج استخدامها لأي حاجة ، مثل Local Store في SPU of Cell معالجات. تسمح هذه الذاكرة المشتركة بتبادل المعلومات بين خيوط نفس الكتلة. من المهم أن يتم دائمًا تنفيذ جميع سلاسل العمليات الخاصة بكتلة واحدة بواسطة نفس المعالجات المتعددة. ولا يمكن للتدفقات من الكتل المختلفة تبادل البيانات ، وعليك أن تتذكر هذا القيد. غالبًا ما تكون الذاكرة المشتركة مفيدة ، إلا في حالة وصول خيوط متعددة إلى نفس بنك الذاكرة. يمكن للمعالجات المتعددة أيضًا الوصول إلى ذاكرة الفيديو ، ولكن بزمن انتقال أعلى وعرض نطاق ترددي أسوأ. لتسريع الوصول وتقليل تكرار الوصول إلى ذاكرة الفيديو ، تحتوي المعالجات المتعددة على 8 كيلو بايت من ذاكرة التخزين المؤقت للثوابت وبيانات النسيج.

يستخدم المعالجات المتعددة 8192-16384 (لـ G8x / G9x و GT2xx ، على التوالي) سجلات مشتركة لجميع تدفقات جميع الكتل المنفذة عليها. الحد الأقصى لعدد الكتل لكل متعدد المعالجات لـ G8x / G9x هو ثمانية وعدد الالتواء هو 24 (768 سنًا لكل معالج متعدد). في المجموع ، يمكن لبطاقات الفيديو المتطورة لسلسلة Geforce 8 و 9 معالجة ما يصل إلى 12288 تدفقات في المرة الواحدة. يوفر Geforce GTX 280 المستند إلى GT200 ما يصل إلى 1024 خيطًا لكل معالج متعدد ، ويحتوي على 10 مجموعات من ثلاثة معالجات متعددة ، ومعالجة ما يصل إلى 30720 سنًا. تتيح لك معرفة هذه القيود تحسين الخوارزميات للموارد المتاحة.

تتمثل الخطوة الأولى في نقل تطبيق موجود إلى CUDA في تشكيله وتحديد الاختناقات في التعليمات البرمجية التي تعيق الأداء. إذا كانت هذه الأقسام مناسبة للتنفيذ المتوازي السريع ، يتم تحويل هذه الوظائف إلى امتدادات C و CUDA للتنفيذ على وحدة معالجة الرسومات. يتم تجميع البرنامج باستخدام مترجم توفره Nvidia ، والذي ينشئ رمزًا لكل من وحدة المعالجة المركزية ووحدة معالجة الرسومات. عند تنفيذ برنامج ما ، يقوم المعالج المركزي بتنفيذ الأجزاء الخاصة به من الكود ، وتقوم وحدة معالجة الرسومات (GPU) بتنفيذ كود CUDA بأثقل العمليات الحسابية المتوازية. يسمى هذا الجزء المخصص لوحدة معالجة الرسومات (GPU) بالنواة. تحدد النواة العمليات التي سيتم إجراؤها على البيانات.

تتلقى شريحة الفيديو نواة وتقوم بإنشاء نسخ لكل عنصر بيانات. هذه النسخ تسمى الخيوط. يحتوي الدفق على العداد والسجلات والحالة. بالنسبة للكميات الكبيرة من البيانات مثل معالجة الصور ، يتم تشغيل ملايين الخيوط. يتم تنفيذ الخيوط في مجموعات من 32 تسمى warp "s. Warp" ويتم تعيينها للتنفيذ على معالجات تدفق متعددة محددة. يتكون كل متعدد المعالجات من ثمانية مراكز - معالجات متدفقة تنفذ تعليمة MAD واحدة لكل دورة على مدار الساعة. لتنفيذ انفتال واحد من 32 خيطًا ، يلزم وجود أربع دورات ساعة من المعالجات المتعددة (نحن نتحدث عن تردد مجال التظليل ، وهو 1.5 جيجاهرتز وأعلى).

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

نموذج البرمجة CUDA

مرة أخرى ، تستخدم CUDA نموذج حساب متوازي ، عندما يقوم كل من معالجات SIMD بتنفيذ نفس التعليمات على عناصر بيانات مختلفة بشكل متوازٍ. وحدة معالجة الرسومات (GPU) هي جهاز حوسبة ، معالج مساعد (جهاز) لمعالج مركزي (مضيف) ، له ذاكرته الخاصة ويقوم بمعالجة عدد كبير من الخيوط بالتوازي. النواة (kernel) هي وظيفة لوحدة معالجة الرسومات (GPU) ، يتم تنفيذها بواسطة خيوط (تشبيه من الرسومات ثلاثية الأبعاد - تظليل).

قلنا أعلاه أن شريحة الفيديو تختلف عن وحدة المعالجة المركزية في أنها تستطيع معالجة عشرات الآلاف من الخيوط في وقت واحد ، وهو عادة للرسومات التي تكون متوازية بشكل جيد. كل دفق عددي ولا يتطلب تعبئة البيانات في ناقلات مكونة من 4 مكونات ، وهو أكثر ملاءمة لمعظم المهام. يتجاوز عدد الخيوط المنطقية وكتل الخيوط عدد وحدات التنفيذ المادي ، مما يوفر قابلية جيدة للتوسع لمجموعة كاملة من حلول الشركة.

يفترض نموذج البرمجة CUDA تجميع سلاسل الرسائل. يتم دمج الخيوط في كتل خيطية - شبكات أحادية البعد أو ثنائية الأبعاد من الخيوط التي تتفاعل مع بعضها البعض باستخدام الذاكرة المشتركة ونقاط التزامن. يعمل البرنامج (النواة) على شبكة من كتل الخيوط ، انظر الشكل أدناه. يتم تنفيذ شبكة واحدة في كل مرة. يمكن أن تكون كل كتلة ذات شكل واحد أو ثنائي أو ثلاثي الأبعاد ، ويمكن أن تحتوي على 512 مؤشر ترابط على الأجهزة الحالية.

يتم تنفيذ كتل الخيوط في مجموعات صغيرة تسمى الالتواء ، والتي يبلغ حجمها 32 خيطًا. هذا هو الحد الأدنى من البيانات التي يمكن معالجتها في معالجات متعددة. ونظرًا لأن هذا ليس مناسبًا دائمًا ، يتيح لك CUDA العمل مع كتل تحتوي على 64 إلى 512 موضوعًا.

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

نموذج ذاكرة كودا

يتميز نموذج الذاكرة في CUDA بإمكانية معالجة البايت ودعم كل من التجميع والتشتت. يتوفر عدد كبير نسبيًا من السجلات لكل معالج تيار ، حتى 1024 قطعة. الوصول إليها سريع جدًا ، يمكنك تخزين أعداد صحيحة 32 بت أو أرقام فاصلة عائمة فيها.

كل موضوع لديه حق الوصول إلى الأنواع التالية من الذاكرة:

الذاكرة العالمية- أكبر قدر من الذاكرة متاح لجميع المعالجات المتعددة على شريحة فيديو ، ويتراوح حجمها من 256 ميجابايت إلى 1.5 جيجابايت على الحلول الحالية (وتصل إلى 4 جيجابايت على Tesla). لديها نطاق ترددي عالٍ ، يزيد عن 100 غيغابايت / ثانية لأفضل حلول Nvidia ، لكن فترات انتقال عالية جدًا لعدة مئات من دورات الساعة. غير مخبأ ، يدعم تعليمات التحميل والتخزين العامة ، والمؤشرات العادية للذاكرة.

الذاكرة المحليةهي مساحة صغيرة من الذاكرة لا يستطيع الوصول إليها سوى معالج تدفق واحد. إنها بطيئة نسبيًا - مثل العالمية.

ذكريات مشتركهعبارة عن كتلة 16 كيلو بايت (في شرائح الفيديو الخاصة بالعمارة الحالية) من الذاكرة يتم مشاركتها بواسطة جميع معالجات الدفق في متعدد المعالجات. هذه الذاكرة سريعة جدًا ، تمامًا مثل السجلات. إنه يوفر إمكانية التشغيل البيني للخيوط ، ويتم التحكم فيه بشكل مباشر من قبل المطور ، وله زمن انتقال منخفض. مزايا الذاكرة المشتركة: تستخدم في شكل ذاكرة تخزين مؤقت يتحكم فيها المبرمج من المستوى الأول ، وتقليل التأخير في وصول وحدات التنفيذ (ALU) إلى البيانات ، وتقليل عدد المكالمات إلى الذاكرة العالمية.

ذاكرة الثوابت- مساحة ذاكرة 64 كيلوبايت (نفس الشيء بالنسبة لوحدات معالجة الرسومات الحالية) ، للقراءة فقط بواسطة جميع المعالجات المتعددة. يتم تخزينها مؤقتًا عند 8 كيلو بايت لكل معالج متعدد. بطيء جدًا - تأخير لعدة مئات من دورات الساعة في غياب البيانات المطلوبة في ذاكرة التخزين المؤقت.

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

بطبيعة الحال ، الذاكرة العالمية والمحلية والملمس والثابت هي نفس الذاكرة فعليًا ، والمعروفة باسم ذاكرة الفيديو المحلية لبطاقة الفيديو. تكمن اختلافاتهم في خوارزميات مختلفة للتخزين المؤقت ونماذج الوصول. يمكن للمعالج المركزي تحديث وطلب الذاكرة الخارجية فقط: عالمية وثابتة وملمس.

مما سبق ، يتضح أن CUDA تفترض نهجًا خاصًا للتطوير ، وليس تمامًا كما هو الحال في برامج وحدة المعالجة المركزية. من الضروري أن نتذكر أنواعًا مختلفة من الذاكرة ، حيث لا يتم تخزين الذاكرة المحلية والعالمية مؤقتًا ، كما أن زمن الوصول عند الوصول إليها أعلى بكثير من ذاكرة التسجيل ، نظرًا لأنها موجودة فعليًا في دوائر صغيرة منفصلة.

نمط حل المشكلات النموذجي ، ولكنه غير مطلوب:

  • يتم تقسيم المهمة إلى مهام فرعية ؛
  • يتم تقسيم البيانات المدخلة إلى كتل تناسب الذاكرة المشتركة ؛
  • تتم معالجة كل كتلة بواسطة كتلة من الخيوط ؛
  • يتم تحميل الكتلة الفرعية في الذاكرة المشتركة من الذاكرة العالمية ؛
  • يتم إجراء الحسابات المقابلة على البيانات الموجودة في الذاكرة المشتركة ؛
  • يتم نسخ النتائج من الذاكرة المشتركة إلى الذاكرة العالمية.

بيئة البرمجة

يتضمن CUDA مكتبات وقت التشغيل:

  • جزء مشترك يوفر أنواعًا متجهية مضمنة ومجموعات فرعية من مكالمات RTL المدعومة على وحدة المعالجة المركزية ووحدة معالجة الرسومات ؛
  • مكون وحدة المعالجة المركزية للتحكم في واحد أو أكثر من وحدات معالجة الرسومات ؛
  • مكون GPU الذي يوفر وظائف GPU الخاصة.

تعمل العملية الرئيسية لتطبيق CUDA على معالج عالمي (مضيف) ، ويبدأ عدة نسخ من عمليات kernel على بطاقة الفيديو. يقوم رمز وحدة المعالجة المركزية بما يلي: تهيئة GPU ، وتخصيص الذاكرة على بطاقة الفيديو والنظام ، ونسخ الثوابت إلى ذاكرة بطاقة الفيديو ، وتشغيل عدة نسخ من عمليات kernel على بطاقة الفيديو ، ونسخ النتيجة من الفيديو الذاكرة ، وتحرر الذاكرة ويخرج.

كمثال على الفهم ، دعنا نعطي رمز وحدة المعالجة المركزية لإضافة المتجهات ، المقدمة في CUDA:

تحتوي الوظائف التي تنفذها شريحة الفيديو على القيود التالية: لا يوجد تكرار ، ولا توجد متغيرات ثابتة داخل الوظائف وعدد متغير من الوسائط. يتم دعم نوعين من إدارة الذاكرة: الذاكرة الخطية مع الوصول عن طريق مؤشرات 32 بت ، ومصفوفات CUDA مع الوصول فقط من خلال وظائف جلب النسيج.

يمكن أن تتفاعل برامج CUDA مع واجهة برمجة تطبيقات الرسومات: لتقديم البيانات التي تم إنشاؤها في البرنامج ، ولقراءة نتائج العرض ومعالجتها باستخدام أدوات CUDA (على سبيل المثال ، عند تنفيذ عوامل تصفية ما بعد المعالجة). لهذا ، يمكن تعيين موارد واجهة برمجة تطبيقات الرسومات (مع الحصول على عنوان المورد) في مساحة الذاكرة العالمية CUDA. يتم دعم أنواع موارد API الرسومية التالية: كائنات المخزن المؤقت (PBO / VBO) في OpenGL والمخازن المؤقتة والقوام (خرائط ثنائية الأبعاد وثلاثية الأبعاد ومكعبية) Direct3D9.

مراحل تجميع تطبيق CUDA:

يتم تجميع ملفات كود المصدر CUDA C باستخدام برنامج NVCC ، وهو عبارة عن غلاف فوق الأدوات الأخرى ويسميها: cudacc ، و g ++ ، و cl ، وما إلى ذلك ، ينشئ NVCC: رمز للمعالج المركزي الذي يتم تجميعه مع بقية التطبيق ، مكتوبًا بلغة C الخالصة ، ورمز كائن PTX لشريحة الفيديو. تتطلب الملفات القابلة للتنفيذ برمز CUDA بالضرورة مكتبة وقت تشغيل CUDA (cudart) ومكتبة CUDA الأساسية (cuda).

تحسين برامج CUDA

بطبيعة الحال ، في إطار مقالة المراجعة ، من المستحيل النظر في القضايا الجادة للتحسين في برمجة CUDA. لذلك دعونا نغطي الأساسيات بإيجاز. لاستخدام إمكانيات CUDA بشكل فعال ، عليك أن تنسى الطرق المعتادة لكتابة البرامج لوحدة المعالجة المركزية ، واستخدام تلك الخوارزميات التي تتوازى جيدًا مع آلاف الخيوط. من المهم أيضًا العثور على المكان الأمثل لتخزين البيانات (السجلات والذاكرة المشتركة وما إلى ذلك) ، وتقليل نقل البيانات بين وحدة المعالجة المركزية ووحدة معالجة الرسومات ، واستخدام التخزين المؤقت.

بشكل عام ، عند تحسين برنامج CUDA ، يجب أن تحاول تحقيق التوازن الأمثل بين الحجم وعدد الكتل. ستعمل المزيد من سلاسل الرسائل في الكتلة على تقليل تأثير زمن انتقال الذاكرة ، ولكنها تقلل أيضًا من عدد السجلات المتاحة. بالإضافة إلى ذلك ، فإن الكتلة المكونة من 512 مؤشر ترابط غير فعالة ، وتوصي Nvidia نفسها باستخدام كتل من 128 أو 256 مؤشر ترابط كمقايضة لتحقيق وقت الاستجابة الأمثل وعدد السجلات.

من بين النقاط الرئيسية لتحسين برامج CUDA: الاستخدام الأكثر نشاطًا للذاكرة المشتركة ، نظرًا لأنها أسرع بكثير من ذاكرة الفيديو العالمية لبطاقة الفيديو ؛ يجب دمج عمليات القراءة والكتابة من الذاكرة العالمية كلما أمكن ذلك. للقيام بذلك ، تحتاج إلى استخدام أنواع بيانات خاصة للقراءة والكتابة مرة واحدة 32/64/128 بتات البيانات في عملية واحدة. إذا كان من الصعب الجمع بين القراءات ، يمكنك محاولة استخدام عمليات جلب النسيج.

الاستنتاجات

تعتبر بنية الأجهزة والبرامج التي تقدمها Nvidia للحوسبة على شرائح الفيديو CUDA مناسبة تمامًا لحل مجموعة واسعة من المهام بتوازي عالٍ. يعمل CUDA على عدد كبير من وحدات معالجة الرسومات Nvidia ، ويحسن نموذج برمجة GPU من خلال تسهيله كثيرًا وإضافة المزيد من الميزات مثل الذاكرة المشتركة ، ومزامنة الخيط ، والحساب المزدوج الدقة ، وعمليات الأعداد الصحيحة.

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

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

تتطور المعالجات العالمية ببطء إلى حد ما ، وليس لديها مثل هذه القفزات في الأداء. في الأساس ، على الرغم من أن الصوت يبدو مرتفعًا للغاية ، يمكن لأي شخص يحتاج إلى أجهزة كمبيوتر سريعة الآن الحصول على كمبيوتر شخصي عملاق رخيص الثمن على مكتبه ، وأحيانًا دون استثمار أموال إضافية ، حيث تنتشر بطاقات رسومات Nvidia على نطاق واسع. ناهيك عن مكاسب الكفاءة من حيث GFLOPS / $ و GFLOPS / Watt ، والتي يحبها صانعو GPU كثيرًا.

من الواضح أن مستقبل العديد من العمليات الحسابية يتم في خوارزميات متوازية ؛ يتم توجيه جميع الحلول والمبادرات الجديدة تقريبًا في هذا الاتجاه. حتى الآن ، ومع ذلك ، فإن تطوير نماذج جديدة في مرحلة مبكرة ، يجب عليك إنشاء سلاسل يدويًا وجدولة الوصول إلى الذاكرة ، مما يعقد المهام مقارنة بالبرمجة التقليدية. لكن تقنية CUDA اتخذت خطوة في الاتجاه الصحيح وأصبح الحل الناجح مرئيًا بوضوح ، خاصة إذا تمكنت Nvidia من إقناع المطورين قدر الإمكان بفوائدها وآفاقها.

لكن ، بالطبع ، لن تحل وحدات معالجة الرسومات محل وحدات المعالجة المركزية. في شكلها الحالي ، فهي ليست معدة لهذا الغرض. الآن بعد أن تحركت شرائح الفيديو تدريجيًا نحو وحدة المعالجة المركزية ، أصبحت عالمية أكثر فأكثر (حسابات النقطة العائمة أحادية ومزدوجة الدقة ، حسابات الأعداد الصحيحة) ، لذلك أصبحت وحدات المعالجة المركزية "متوازية" أكثر فأكثر ، واكتسبت عددًا كبيرًا من النوى ، وتقنيات تعدد مؤشرات الترابط ، ناهيك عن ظهور كتل SIMD ومشاريع المعالج غير المتجانسة. على الأرجح ، سيتم دمج GPU و CPU ببساطة في المستقبل. من المعروف أن العديد من الشركات ، بما في ذلك Intel و AMD ، تعمل في مشاريع مماثلة. لا يهم ما إذا كانت وحدة المعالجة المركزية قد ابتلعت وحدة معالجة الرسومات ، أو العكس.

في المقالة ، تحدثنا بشكل أساسي عن فوائد CUDA. ولكن هناك أيضا ذبابة في المرهم. واحدة من عيوب قليلة لـ CUDA هي ضعف قابلية النقل. تعمل هذه البنية فقط على شرائح الفيديو من هذه الشركة ، وحتى ليس على الإطلاق ، ولكن بدءًا من سلسلة Geforce 8 و 9 وما يقابلهما من Quadro و Tesla. نعم ، هناك الكثير من هذه الحلول في العالم ، تقدم Nvidia رقمًا يبلغ 90 مليون شريحة فيديو متوافقة مع CUDA. هذا جيد ، لكن المنافسين يقدمون حلولهم بخلاف CUDA. لذلك ، لدى AMD حوسبة التدفق ، وستحصل Intel على Ct في المستقبل.

أي من التقنيات ستفوز ، وتصبح منتشرة وستعيش لفترة أطول من غيرها - فقط الوقت سيخبرنا بذلك. لكن CUDA لديها فرص جيدة ، بالمقارنة مع Stream Computing ، على سبيل المثال ، فهي تمثل بيئة برمجة أكثر تطوراً وسهلة الاستخدام بلغة C المعتادة. ربما يمكن لطرف ثالث المساعدة في التعريف عن طريق إصدار بعض الحلول العامة. على سبيل المثال ، في تحديث DirectX التالي تحت الإصدار 11 ، وعدت Microsoft بتظليل حسابي ، والذي يمكن أن يصبح نوعًا من الحلول المتوسطة التي تناسب الجميع ، أو الجميع تقريبًا.

استنادًا إلى البيانات الأولية ، يقترض هذا النوع الجديد من التظليل الكثير من نموذج CUDA. ومن خلال البرمجة في هذه البيئة الآن ، يمكنك الحصول على الفوائد على الفور والمهارات اللازمة للمستقبل. من منظور HPC ، لدى DirectX أيضًا عيبًا واضحًا في شكل ضعف قابلية النقل ، حيث تقتصر واجهة برمجة التطبيقات هذه على نظام Windows الأساسي. ومع ذلك ، يتم تطوير معيار آخر - مبادرة OpenCL متعددة المنصات المفتوحة ، والتي تدعمها معظم الشركات ، بما في ذلك Nvidia و AMD و Intel و IBM والعديد من الشركات الأخرى.

ضع في اعتبارك أنه في مقالة CUDA التالية سوف تستكشف تطبيقات عملية محددة للحوسبة العلمية وغيرها من الحوسبة غير الرسومية التي يقوم بها المطورون حول العالم باستخدام Nvidia CUDA.

لعقود من الزمان ، كان قانون مور ساري المفعول ، والذي ينص على أن عدد الترانزستورات على رقاقة سوف يتضاعف كل عامين. ومع ذلك ، كان ذلك في عام 1965 ، وعلى مدى السنوات الخمس الماضية ، بدأت فكرة المعالجة المادية متعددة النواة في المعالجات من فئة المستهلكين تتطور بسرعة: في عام 2005 ، قدمت Intel Pentium D و AMD - Athlon X2. ثم يمكن حساب التطبيقات التي تستخدم قلبين على أصابع يد واحدة. ومع ذلك ، فإن الجيل التالي من معالجات Intel ، الذي أحدث ثورة ، يحتوي على نواتين فيزيائيتين بالضبط. علاوة على ذلك ، في يناير 2007 ، ظهرت السلسلة الرباعية ، وفي نفس الوقت اعترف مور نفسه بأن قانونه سيتوقف عن العمل قريبًا.

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

وعلى الرغم من أن احتمالات الحوسبة باستخدام وحدات معالجة الرسومات ضخمة ، إلا أن الحل الأكثر شيوعًا - Nvidia CUDA مجاني ، ولديه الكثير من الوثائق ، وبصفة عامة ، سهل التنفيذ للغاية ، لا يوجد العديد من التطبيقات التي تستخدم هذه التقنية. في الأساس ، هذه جميع أنواع الحسابات المتخصصة ، والتي لا يهتم بها المستخدم العادي في معظم الحالات. لكن هناك أيضًا برامج مصممة للجمهور ، وسنتحدث عنها في هذا المقال.

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

كودا(هندسة الأجهزة الموحدة للكمبيوتر باللغة الإنجليزية) هي بنية برامج وأجهزة تسمح بالحسابات باستخدام معالجات رسومات NVIDIA التي تدعم تقنية GPGPU (الحوسبة التعسفية على بطاقات الفيديو). ظهرت بنية CUDA لأول مرة في السوق مع إصدار الجيل الثامن من شريحة NVIDIA G80 وهي موجودة في جميع السلاسل اللاحقة من رقائق الرسوم المستخدمة في مجموعات تسريع GeForce و Quadro و Tesla. (ج) Wikipedia.org

تتم معالجة التدفقات الواردة بشكل مستقل عن بعضها البعض ، أي موازى.

علاوة على ذلك ، هناك تقسيم إلى 3 مستويات:

شبكة- النواة. يحتوي على صفيف أحادي / ثنائي / ثلاثي الأبعاد من الكتل.

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

خيط- تدفق. يمكن أن تتفاعل الخيوط داخل كتلة واحدة إما من خلال الذاكرة المشتركة ، والتي ، بالمناسبة ، أسرع بكثير من الذاكرة العالمية ، أو من خلال أدوات مزامنة الخيوط.

اعوجاج- هذا هو اتحاد التدفقات التفاعلية ، بالنسبة لجميع وحدات معالجة الرسوميات الحديثة حجم Warp هو 32. يأتي التالي نصف الاعوجاج، وهو نصف warp'a ، منذ ذلك الحين عادةً ما يذهب الوصول إلى الذاكرة بشكل منفصل عن النصف الأول والثاني من الالتواء.

كما ترى ، هذه البنية رائعة لموازنة المهام. وعلى الرغم من أن البرمجة تتم بلغة C مع بعض القيود ، إلا أنها في الواقع ليست بهذه البساطة منذ ذلك الحين لا يمكن موازاة كل شيء. لا توجد أيضًا وظائف قياسية لتوليد أرقام عشوائية (أو تهيئة) ؛ كل هذا يجب تنفيذه بشكل منفصل. وعلى الرغم من وجود خيارات جاهزة كافية ، إلا أن كل هذا لا يجلب الفرح. القدرة على استخدام العودية جديدة نسبيًا.

من أجل الوضوح ، تمت كتابة برنامج وحدة تحكم صغيرة (لتقليل الكود) ينفذ عمليات بمصفوفتين عائمتين ، أي بقيم غير صحيحة. للأسباب المذكورة أعلاه ، تم إجراء التهيئة (ملء المصفوفة بقيم عشوائية مختلفة) بواسطة وحدة المعالجة المركزية. بعد ذلك ، تم إجراء 25 عملية مختلفة باستخدام العناصر المقابلة من كل مصفوفة ، وتم كتابة النتائج الوسيطة في المصفوفة الثالثة. تم تغيير حجم المصفوفة ، وكانت النتائج كما يلي:

في المجموع ، تم إجراء 4 اختبارات:

1024 عنصرًا في كل مصفوفة:

من الواضح أنه مع وجود مثل هذا العدد الصغير من العناصر ، لا معنى للحسابات المتوازية منذ ذلك الحين الحسابات نفسها أسرع بكثير من تحضيرها.

4096 عنصرًا في كل مصفوفة:

والآن يمكنك أن ترى أن بطاقة الفيديو تؤدي عمليات على المصفوفات أسرع بثلاث مرات من المعالج. علاوة على ذلك ، لم يزد وقت تنفيذ هذا الاختبار على بطاقة الفيديو (يمكن أن يعزى انخفاض طفيف في الوقت إلى خطأ).

يوجد الآن 12288 عنصرًا في كل مصفوفة:

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

والاختبار الأخير - 36864 عنصرًا في كل صفيف:

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

إذا واصلت تعقيد العمليات الحسابية ، فستفوز بطاقة الفيديو أكثر وأكثر. على الرغم من أن المثال مبالغ فيه إلى حد ما ، إلا أنه بشكل عام يوضح الموقف بوضوح. ولكن كما ذكر أعلاه ، لا يمكن موازاة كل شيء. على سبيل المثال ، حساب pi. لا يوجد سوى أمثلة مكتوبة باستخدام طريقة مونت كارلو ، لكن دقة الحسابات هي 7 منازل عشرية ، أي تعويم منتظم. من أجل زيادة دقة الحسابات ، هناك حاجة إلى عمليات حسابية طويلة ، ولكن هنا تنشأ المشاكل ، لأن من الصعب جدًا جدًا تنفيذه بفعالية. على الإنترنت ، لم أتمكن من العثور على أمثلة باستخدام CUDA وحساب Pi إلى مليون منزلة عشرية. بذلت محاولات لكتابة مثل هذا التطبيق ، ولكن الطريقة الأبسط والأكثر فعالية لحساب pi هي خوارزمية Brent-Salamin أو صيغة Gauss. في SuperPI المشهور ، على الأرجح (بناءً على سرعة العمل وعدد التكرارات) ، يتم استخدام صيغة Gauss. وانطلاقا من
حقيقة أن SuperPI هو مؤشر ترابط واحد ، وعدم وجود أمثلة لـ CUDA وفشل محاولاتي ، من المستحيل موازاة حساب Pi بشكل فعال.

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

الآن دعنا ننتقل إلى المزيد من الفوائد العملية لـ CUDA ، وهي البرامج الحالية التي تستخدم هذه التكنولوجيا. بالنسبة للجزء الأكبر ، هذه هي جميع أنواع محولات ومحررات الصوت / الفيديو.

استخدمنا 3 ملفات فيديو مختلفة للاختبار:

      * تاريخ الفيلم Avatar - 1920x1080 ، MPEG4 ، h.264.
      * سلسلة "أكذب علي" - 1280 × 720 ، MPEG4 ، h.264.
      * مسلسل It's Always Sunny in Philadelphia - 624x464، xvid.

حاوية وحجم الملفين الأولين كانت mkv و 1.55 جيجا بايت ، وآخرها كان .avi و 272 ميجا بايت.

لنبدأ بمنتج مثير للغاية وشائع - بادابوم... النسخة المستخدمة كانت - 1.2.1.74 ... تكلفة البرنامج $29.90 .

واجهة البرنامج بسيطة وبديهية - على اليسار نختار الملف أو القرص المصدر ، وعلى اليمين - الجهاز المطلوب الذي سنقوم بترميزه. هناك أيضًا وضع مستخدم ، يتم فيه تعيين المعلمات يدويًا ، ويتم استخدامه.

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

سرعة التشفير تعتمد بشكل مباشر على الجودة ، وهذا واضح. وتجدر الإشارة إلى أن دقة الضوء (دعنا نسميها تقليديًا - SD) ليست مشكلة لـ Badaboom - سرعة التشفير أعلى 5.5 مرة من معدل إطارات الفيديو الأصلي (24 إطارًا في الثانية). وحتى فيديو 1080p الثقيل يتم تحويله بواسطة البرنامج في الوقت الفعلي. وتجدر الإشارة إلى أن جودة الفيديو النهائي قريبة جدًا من الفيديو الأصلي ، أي بتشفير Badaboom بجودة عالية جدا جدا.

ولكن عادةً ما يتم تجاوز الفيديو إلى دقة أقل ، فلنرى كيف تسير الأمور في هذا الوضع. نظرًا لانخفاض الدقة ، انخفض معدل نقل بيانات الفيديو أيضًا. كان 9500 كيلوبت في الثانية لملف إخراج 1080 بكسل ، و 4100 كيلوبت في الثانية لـ 720 بكسل و 2400 كيلوبت في الثانية لـ 720 × 404. تم الاختيار على أساس نسبة معقولة من الحجم / الجودة.

التعليقات لا لزوم لها. إذا قمت بالنسخ من 720p إلى جودة SD العادية ، فسيستغرق تحويل فيلم مدته ساعتان حوالي 30 دقيقة. وفي الوقت نفسه ، سيكون حمل المعالج ضئيلًا ، يمكنك ممارسة عملك دون الشعور بعدم الراحة.

ولكن ماذا لو قمت بتحويل الفيديو إلى تنسيق لجهاز محمول؟ للقيام بذلك ، حدد ملف تعريف iPhone (معدل البت 1 ميجابت في الثانية ، 480 × 320) وانظر إلى سرعة التشفير:

هل أحتاج لقول شيء؟ يتم تحويل ترميز فيلم مدته ساعتان بجودة iPhone العادية في أقل من 15 دقيقة. جودة HD أكثر صعوبة ، لكنها لا تزال سريعة جدًا. الشيء الرئيسي هو أن جودة مواد الفيديو الناتج تظل على مستوى عالٍ إلى حد ما عند عرضها على شاشة الهاتف.

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

التالي في الخط سيكون لدينا سوبر LoiLoScope... يسألون عن الإصدار المعتاد 3280 روبل، وبالنسبة لإصدار اللمس الذي يدعم التحكم باللمس في Windows 7 ، فإنهم يطلبون نفس القدر 4440 روبل... دعنا نحاول معرفة سبب رغبة المطور في الحصول على هذا النوع من المال ولماذا يحتاج محرر الفيديو إلى دعم اللمس المتعدد. تم استخدام أحدث إصدار - 1.8.3.3 .

من الصعب وصف واجهة البرنامج بالكلمات ، لذلك قررت تصوير مقطع فيديو قصير. يجب أن أقول على الفور أنه ، مثل جميع محولات الفيديو لـ CUDA ، يتم دعم تسريع GPU فقط لإخراج الفيديو في MPEG4 باستخدام برنامج الترميز h.264.

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

الآن دعنا ننتقل إلى الأداء. بادئ ذي بدء ، كل شيء هو نفسه كما في Badaboom - تحويل ترميز الفيديو إلى نفس الجودة.

النتائج أفضل بكثير من بادابوم. الجودة أيضًا في المقدمة ، ولا يمكن رؤية الاختلاف مع الأصل إلا من خلال مقارنة الإطارات في أزواج تحت عدسة مكبرة.

واو ، هنا يتجاوز LoiloScope بادابوم 2.5 مرة. في الوقت نفسه ، يمكنك بسهولة قص مقطع فيديو آخر وترميزه على التوازي ، وقراءة الأخبار وحتى مشاهدة فيلم ، وحتى FullHD يمكن تشغيله دون مشاكل ، على الرغم من أن تحميل المعالج هو الحد الأقصى.

لنحاول الآن إنشاء مقطع فيديو لجهاز محمول ، سنقوم بتسمية الملف الشخصي بنفس الاسم الذي تم تسميته في Badaboom - iPhone (480 × 320 ، 1 ميجابت في الثانية):

ليس هناك خطأ. تم فحص كل شيء عدة مرات ، وكانت النتيجة واحدة في كل مرة. على الأرجح ، يحدث هذا لسبب بسيط وهو أن ملف SD مكتوب باستخدام برنامج ترميز مختلف وفي حاوية مختلفة. عند تحويل الشفرة ، يتم فك تشفير الفيديو أولاً ، وتقسيمه إلى مصفوفات بحجم معين ، ثم يتم ضغطه. وحدة فك التشفير ASP المستخدمة في حالة xvid أبطأ من AVC (لـ h.264) في فك التشفير المتوازي. ومع ذلك ، فإن 192 إطارًا في الثانية أسرع 8 مرات من سرعة الفيديو الأصلية ، ويتم ضغط تدفق مدته 23 دقيقة في أقل من 4 دقائق. تكرر الموقف مع ملفات أخرى مضغوطة في xvid / DivX.

LoiloScopeتركت انطباعات لطيفة عن نفسي فقط - الواجهة ، على الرغم من كونها غير عادية ، مريحة وعملية ، وسرعة العمل تفوق الثناء. تعتبر الوظيفة الضعيفة نسبيًا محبطة إلى حد ما ، ولكن في كثير من الأحيان مع التحرير البسيط ، تحتاج فقط إلى ضبط الألوان قليلاً ، وإجراء انتقالات سلسة ، وتراكب النص ، ويقوم LoiloScope بعمل ممتاز مع هذا. السعر مخيف أيضًا إلى حد ما - أكثر من 100 دولار للنسخة العادية أمر طبيعي بالنسبة للبلدان الأجنبية ، لكن هذه الأرقام لا تزال تبدو غريبة إلى حد ما بالنسبة لنا. على الرغم من أنني أعترف أنه إذا قمت ، على سبيل المثال ، بتصوير وتحرير مقاطع فيديو منزلية ، فربما فكرت في الشراء. في الوقت نفسه ، بالمناسبة ، قمت بفحص القدرة على تحرير محتوى HD (أو بالأحرى AVCHD) مباشرة من كاميرا الفيديو دون التحويل أولاً إلى تنسيق آخر ، لا يواجه LoiloScope أي مشاكل مع ملفات mts.

دعنا ننتقل إلى التاريخ - بالعودة إلى عام 2003 ، عندما شاركت Intel و AMD في السباق المشترك لأقوى معالج. في غضون سنوات قليلة فقط ، أدى هذا السباق إلى زيادة كبيرة في سرعات الساعة ، خاصة منذ إصدار Intel Pentium 4.

لكن السباق كان يقترب بسرعة من نهايته. بعد موجة من الزيادات الهائلة في سرعات الساعة (بين عامي 2001 و 2003 ، تضاعفت سرعة ساعة Pentium 4 من 1.5 إلى 3 جيجاهرتز) ، كان على المستخدمين أن يكتفوا بأعشار الجيجاهيرتز ، والتي كان المصنعون قادرين على التخلص منها (من 2003 إلى 2005 ، زادت سرعات الساعة من 3 إلى 3 ، 8 جيجا هرتز فقط).

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



بينما كان صانعو وحدة المعالجة المركزية يسحبون آخر رؤوسهم في محاولة لإيجاد حلول لمشاكلهم ، استمر صانعو وحدة معالجة الرسومات في الاستفادة بشكل ملحوظ من فوائد قانون مور.

لماذا لم يصلوا إلى نفس الطريق المسدود الذي وصل إليه مهندسو وحدة المعالجة المركزية؟ السبب بسيط للغاية: تم تصميم وحدات المعالجة المركزية لتحقيق أقصى أداء في سلسلة من التعليمات التي تعالج بيانات مختلفة (كل من الأعداد الصحيحة وأرقام الفاصلة العائمة) ، وتنفذ وصولاً عشوائيًا إلى الذاكرة ، وما إلى ذلك. حتى الآن ، يحاول المطورون توفير المزيد من التوازي للتعليمات - أي تنفيذ أكبر عدد ممكن من التعليمات بشكل متوازٍ قدر الإمكان. لذلك ، على سبيل المثال ، ظهر تنفيذ Pentium superscalar ، عندما كان من الممكن في ظل ظروف معينة تنفيذ تعليمتين في كل دورة. تلقى Pentium Pro تنفيذًا خارج الترتيب للتعليمات ، مما جعل من الممكن تحسين عمل الوحدات الحسابية. تكمن المشكلة في أن التنفيذ المتوازي لتيار متسلسل من التعليمات له حدود واضحة ، لذا فإن الزيادة العمياء في عدد الوحدات الحسابية لا تعطي فائدة ، لأنها ستظل خاملة معظم الوقت.

في المقابل ، فإن وظيفة GPU واضحة نسبيًا. يتكون من قبول مجموعة من المضلعات على جانب واحد وتوليد مجموعة من البكسل على الجانب الآخر. تعد المضلعات والبكسلات مستقلة عن بعضها البعض ، لذا يمكن معالجتها بالتوازي. وبالتالي ، في وحدة معالجة الرسومات (GPU) ، يمكن فصل جزء كبير من البلورة إلى وحدات حسابية ، والتي ، على عكس وحدة المعالجة المركزية ، سيتم استخدامها بالفعل.



اضغط على الصورة للتكبير.

يختلف GPU عن وحدة المعالجة المركزية ليس فقط في هذا. الوصول إلى الذاكرة في وحدة معالجة الرسومات مقيد جدًا - إذا تمت قراءة texel ، فسيتم قراءة texel المجاور بعد بضع دورات على مدار الساعة ؛ عند تسجيل البكسل ، بعد عدة دورات على مدار الساعة ، سيتم تسجيل البيكسل المجاور. من خلال تنظيم الذاكرة بحكمة ، يمكنك الحصول على أداء قريب من النطاق الترددي النظري. هذا يعني أن وحدة معالجة الرسومات ، على عكس وحدة المعالجة المركزية ، لا تتطلب ذاكرة تخزين مؤقت ضخمة ، حيث يتمثل دورها في تسريع عمليات التركيب. كل ما هو مطلوب هو بضعة كيلوبايتات تحتوي على عدة تكسيل مستخدمة في المرشحات ثنائية الخطوط وثلاثية الخطوط.



اضغط على الصورة للتكبير.

تحيا GeForce FX!

بقي العالمان منفصلين لفترة طويلة. استخدمنا وحدة المعالجة المركزية (أو حتى وحدات المعالجة المركزية المتعددة) لمهام المكتب وتطبيقات الإنترنت ، وكانت وحدات معالجة الرسومات جيدة فقط لتسريع العرض. لكن شيئًا واحدًا غيّر كل شيء: ألا وهو ظهور وحدات معالجة الرسومات القابلة للبرمجة. في البداية ، لم يكن لدى وحدات المعالجة المركزية ما تخشاه. أول ما يسمى بوحدات معالجة الرسومات (GPUs) القابلة للبرمجة (NV20 و R200) ​​كانت بالكاد تشكل تهديدًا. ظل عدد التعليمات في البرنامج محدودًا بحوالي 10 ، وعملوا على أنواع بيانات غريبة جدًا مثل أرقام النقطة الثابتة 9 أو 12 بت.



اضغط على الصورة للتكبير.

لكن قانون مور أظهر مرة أخرى أفضل جوانبها. لم تؤد الزيادة في عدد الترانزستورات إلى زيادة عدد وحدات الحوسبة فحسب ، بل أدت أيضًا إلى تحسين مرونتها. يمكن اعتبار ظهور NV30 خطوة مهمة إلى الأمام لعدة أسباب. بالطبع ، لم يحب اللاعبون بطاقات NV30 حقًا ، لكن وحدات معالجة الرسومات الجديدة بدأت في الاعتماد على ميزتين تم تصميمهما لتغيير تصور وحدات معالجة الرسومات ليس فقط كمسرعات رسومات.

  • دعم حسابات النقطة العائمة ذات الدقة الواحدة (حتى لو لم تتوافق مع معيار IEEE754) ؛
  • دعم لأكثر من ألف تعليمات.

لذلك حصلنا على جميع الظروف التي يمكن أن تجذب الباحثين الرواد الذين يبحثون دائمًا عن قوة حوسبة إضافية.

إن فكرة استخدام مسرعات الرسوم في العمليات الحسابية ليست جديدة. تمت المحاولات الأولى في التسعينيات من القرن الماضي. بالطبع ، كانت بدائية للغاية - محدودة ، في معظمها ، لاستخدام بعض الميزات القائمة على الأجهزة ، مثل التنقيط والمخازن Z المؤقتة لتسريع المهام مثل العثور على مسار أو عرض. مخططات فورونوي .



اضغط على الصورة للتكبير.

في عام 2003 ، مع ظهور المظلات المتطورة ، تم الوصول إلى معيار جديد - هذه المرة إجراء حسابات المصفوفة. كان هذا هو العام الذي تم فيه تخصيص قسم كامل من SIGGRAPH ("الحسابات على وحدات معالجة الرسومات") لمجال تكنولوجيا المعلومات الجديد. كانت هذه المبادرة المبكرة تسمى GPGPU (حساب الأغراض العامة على GPU). وكانت نقطة التحول المبكرة هي المظهر.

لفهم دور BrookGPU ، عليك أن تفهم كيف حدث كل شيء قبل ظهوره. كانت الطريقة الوحيدة للحصول على موارد GPU في عام 2003 هي استخدام واحدة من اثنين من واجهات برمجة التطبيقات للرسومات ، Direct3D أو OpenGL. وبالتالي ، كان على المطورين الذين أرادوا الحصول على قوة GPU لحوسبتهم الاعتماد على واجهتي API المذكورين. تكمن المشكلة في أنهم لم يكونوا دائمًا خبراء في برمجة بطاقات الفيديو ، مما جعل الوصول إلى التكنولوجيا أمرًا صعبًا للغاية. بينما يعمل المبرمجون ثلاثي الأبعاد باستخدام التظليل والأنسجة والشظايا ، يعتمد المتخصصون في مجال البرمجة المتوازية على الخيوط ، والنوى ، والتشتت ، إلخ. لذلك ، كان من الضروري أولاً إجراء مقارنات بين العالمين.

  • تدفقعبارة عن دفق من العناصر من نفس النوع ، في وحدة معالجة الرسومات يمكن تمثيله بواسطة نسيج. في الأساس ، يوجد في البرمجة الكلاسيكية نظير مثل المصفوفة.
  • نواة- وظيفة سيتم تطبيقها بشكل مستقل على كل عنصر من عناصر الدفق ؛ هو ما يعادل تظليل بكسل. في البرمجة الكلاسيكية ، يمكن إجراء تشبيه الحلقة - يتم تطبيقه على عدد كبير من العناصر.
  • لقراءة نتائج تطبيق نواة على تيار ، يجب إنشاء نسيج. لا يوجد مكافئ على وحدة المعالجة المركزية ، نظرًا لوجود وصول كامل إلى الذاكرة.
  • يتم التحكم في الموقع في الذاكرة حيث سيتم التسجيل (في عمليات التشتت / التشتت) من خلال تظليل قمة الرأس ، نظرًا لأن تظليل البكسل لا يمكنه تغيير إحداثيات البكسل المعالج.

كما ترى ، حتى مع الأخذ في الاعتبار التشابهات المعطاة ، فإن المهمة لا تبدو بسيطة. وجاء بروك للإنقاذ. يشير هذا الاسم إلى امتدادات اللغة C ("C مع التدفقات" ، "C مع التدفقات") ، كما أطلق عليها مطورو ستانفورد. في جوهرها ، كانت مهمة Brook هي إخفاء جميع مكونات واجهة برمجة التطبيقات ثلاثية الأبعاد عن المبرمج ، مما جعل من الممكن تقديم وحدة معالجة الرسومات على أنها معالج مساعد للحسابات المتوازية. للقيام بذلك ، قام مترجم Brook بمعالجة ملف .br برمز C ++ وملحقاته ، ثم قام بإنشاء كود C ++ مرتبط بمكتبة مع دعم مخرجات مختلفة (DirectX ، OpenGL ARB ، OpenGL NV3x ، x86).



اضغط على الصورة للتكبير.

يتمتع Brook بالعديد من المزايا ، أولها إخراج GPGPU من الظل حتى يصبح الجمهور على دراية بالتكنولوجيا. ومع ذلك ، بعد الإعلان عن المشروع ، كان عدد من مواقع تكنولوجيا المعلومات متفائلًا للغاية بأن إصدار Brook يلقي بظلال من الشك على وجود وحدات المعالجة المركزية ، والتي سيتم استبدالها قريبًا بوحدات معالجة رسومات أكثر قوة. لكن ، كما نرى ، لم يحدث هذا بعد خمس سنوات. بصراحة ، لا نعتقد أن هذا سيحدث أبدًا. من ناحية أخرى ، بالنظر إلى التطور الناجح لوحدات المعالجة المركزية ، والتي تتجه بشكل متزايد نحو التوازي (المزيد من النوى ، تقنية SMT multithreading ، توسيع كتل SIMD) ، وكذلك وحدات معالجة الرسومات ، التي ، على العكس من ذلك ، أصبحت عالمية أكثر فأكثر (دعم حسابات الفاصلة العائمة ، دقة فردية ، حساب عدد صحيح ، دعم مزدوج للدقة) ، يبدو أنه سيتم دمج وحدة معالجة الرسومات (GPU) ووحدة المعالجة المركزية (CPU) قريبًا. ماذا سيحدث بعد ذلك؟ هل ستبتلع وحدة المعالجة المركزية وحدات معالجة الرسومات ، كما حدث مع المعالجات الرياضية؟ ممكن جدا. تعمل Intel و AMD حاليًا على مشاريع مماثلة. لكن لا يزال هناك الكثير الذي يمكن تغييره.

لكن العودة إلى موضوعنا. كانت ميزة Brook هي الترويج لمفهوم GPGPU ، فقد تبسيط الوصول إلى موارد GPU بشكل كبير ، مما سمح للمزيد والمزيد من المستخدمين بإتقان نموذج البرمجة الجديد. من ناحية أخرى ، على الرغم من كل صفات Brook ، لا يزال هناك طريق طويل لنقطعه قبل استخدام موارد GPU في الحساب.

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

ومع ذلك ، كان نجاح Brook كافيًا لجذب انتباه ATI و Nvidia ، وقد طوروا اهتمامًا بمثل هذه المبادرة ، حيث يمكنها توسيع السوق ، وفتح قطاع جديد مهم للشركات.

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



اضغط على الصورة للتكبير.

كما ترى في الرسم التخطيطي ، توفر CUDA اثنين من واجهات برمجة التطبيقات.

  • واجهة برمجة تطبيقات عالية المستوى: واجهة برمجة تطبيقات CUDA Runtime ؛
  • API منخفض المستوى: CUDA Driver API.

نظرًا لأنه يتم تنفيذ واجهة برمجة التطبيقات عالية المستوى أعلى واجهة برمجة التطبيقات ذات المستوى المنخفض ، يتم تقسيم كل استدعاء لوظيفة وقت التشغيل إلى تعليمات أبسط تعالجها واجهة برمجة تطبيقات برنامج التشغيل. لاحظ أن واجهات برمجة التطبيقات (API) حصرية بشكل متبادل: يمكن للمبرمج استخدام واحدة أو أخرى من واجهة برمجة التطبيقات ، ولكن لن ينجح خلط الاستدعاءات مع وظائف اثنين من واجهات برمجة التطبيقات. بشكل عام ، مصطلح "واجهة برمجة التطبيقات عالية المستوى" نسبي. حتى Runtime API هي من النوع الذي يعتبره الكثيرون منخفض المستوى ؛ ومع ذلك ، فإنه يوفر وظائف مفيدة تمامًا للتهيئة أو إدارة السياق. لكن لا تتوقع مستوى عالٍ من التجريد بشكل خاص - ما زلت بحاجة إلى معرفة جيدة بوحدات معالجة رسومات nVidia وكيفية عملها.

يصعب التعامل مع Driver API ؛ يتطلب الأمر المزيد من الجهد لتشغيل معالجة GPU. من ناحية أخرى ، تعد واجهة برمجة التطبيقات ذات المستوى المنخفض أكثر مرونة ، مما يمنح المبرمج تحكمًا إضافيًا إذا لزم الأمر. اثنان من واجهات برمجة التطبيقات قادرة على العمل مع موارد OpenGL أو Direct3D (الإصدار التاسع فقط لهذا اليوم). فوائد هذه الميزة واضحة - يمكن استخدام CUDA لإنشاء موارد (هندسة ، مواد إجرائية ، إلخ) يمكن تمريرها إلى واجهة برمجة تطبيقات الرسومات ، أو ، على العكس ، يمكنك جعل واجهة برمجة التطبيقات ثلاثية الأبعاد ترسل نتائج العرض إلى CUDA البرنامج ، والذي ، بدوره ، سوف يؤدي المعالجة اللاحقة. هناك العديد من الأمثلة على هذه التفاعلات ، وتتمثل الميزة في استمرار تخزين الموارد في ذاكرة وحدة معالجة الرسومات دون الحاجة إلى تمريرها عبر ناقل PCI Express ، والذي لا يزال يمثل عنق الزجاجة.

ومع ذلك ، تجدر الإشارة إلى أن مشاركة الموارد في ذاكرة الفيديو ليست دائمًا مثالية ويمكن أن تؤدي إلى بعض "الصداع". على سبيل المثال ، عند تغيير الدقة أو عمق اللون ، تأخذ بيانات الرسوم الأولوية. لذلك ، إذا كنت بحاجة إلى زيادة الموارد في الإطارات الاحتياطية ، فسيقوم السائق بذلك دون أي مشاكل على حساب موارد تطبيقات CUDA ، والتي ستنطلق ببساطة مع وجود خطأ. ليست أنيقة للغاية بالطبع ، لكن هذا لا ينبغي أن يحدث كثيرًا. وبينما بدأنا الحديث عن العيوب: إذا كنت ترغب في استخدام وحدات معالجة رسومات متعددة لتطبيقات CUDA ، فأنت بحاجة إلى تعطيل وضع SLI أولاً ، وإلا فلن تتمكن تطبيقات CUDA إلا من "رؤية" وحدة معالجة رسومات واحدة.

أخيرًا ، يتم إعطاء الطبقة الثالثة من البرامج للمكتبات - اثنان ، على وجه الدقة.

  • CUBLAS ، حيث توجد الكتل اللازمة لحساب الجبر الخطي على وحدة معالجة الرسومات ؛
  • CUFFT ، والتي تدعم حساب تحويلات فورييه ، وهي خوارزمية تستخدم على نطاق واسع في معالجة الإشارات.

قبل الغوص في CUDA ، اسمحوا لي أن أحدد عددًا من المصطلحات المنتشرة في جميع أنحاء وثائق nVidia. اختارت الشركة مصطلحات محددة للغاية يصعب التعود عليها. بادئ ذي بدء ، لاحظ ذلك مسلكفي CUDA بعيد عن نفس المعنى مثل مؤشر ترابط وحدة المعالجة المركزية ، كما أنه ليس مكافئًا لمؤشر الترابط في مقالاتنا حول وحدات معالجة الرسومات. مؤشر ترابط GPU في هذه الحالة هو المجموعة الأساسية من البيانات التي يجب معالجتها. على عكس خيوط وحدة المعالجة المركزية ، فإن سلاسل CUDA "خفيفة" للغاية ، أي أن تبديل السياق بين خيطين لا يعد بأي حال عملية كثيفة الموارد.

المصطلح الثاني الذي يوجد غالبًا في وثائق CUDA هو اعوجاج... لا يوجد أي لبس هنا ، لأنه لا يوجد نظير في اللغة الروسية (إلا إذا كنت من محبي Start Trek أو لعبة Warhammer). في الواقع ، هذا المصطلح مأخوذ من صناعة النسيج ، حيث يتم سحب خيوط اللحمة من خلال خيوط السداة التي يتم شدها على الآلة. Warp in CUDA عبارة عن مجموعة من 32 مؤشر ترابط وهي الحد الأدنى من البيانات التي تتم معالجتها بواسطة طريقة SIMD في معالجات CUDA المتعددة.

لكن هذا "التحبب" ليس دائمًا مناسبًا للمبرمج. لذلك ، في CUDA ، بدلاً من العمل مع الاعوجاج مباشرة ، يمكنك العمل معها كتل / كتلةتحتوي على 64 إلى 512 موضوع.

أخيرًا ، تأتي هذه الكتل معًا شبكات / شبكة... تتمثل ميزة هذا التجميع في أن عدد الكتل التي تتم معالجتها في وقت واحد بواسطة GPU يرتبط ارتباطًا وثيقًا بموارد الأجهزة ، كما سنرى أدناه. يتيح لك تجميع الكتل في شبكات التجريد تمامًا من هذا القيد وتطبيق kernel / kernel على المزيد من سلاسل الرسائل في مكالمة واحدة ، دون التفكير في الموارد الثابتة. مكتبات CUDA مسؤولة عن كل هذا. علاوة على ذلك ، مثل هذا النموذج يقاس بشكل جيد. إذا كانت وحدة معالجة الرسومات بها موارد قليلة ، فستنفذ الكتل بالتتابع. إذا كان عدد المعالجات الحسابية كبيرًا ، فيمكن تنفيذ الكتل بشكل متوازٍ. بمعنى ، يمكن تشغيل نفس الكود على كل من وحدات معالجة الرسومات للمبتدئين والنماذج المتطورة وحتى المستقبلية.

هناك نوعان من المصطلحات الأخرى في CUDA API التي تشير إلى وحدة المعالجة المركزية ( المضيف / المضيف) و GPU ( الجهاز / الجهاز). إذا لم تخيفك هذه المقدمة الصغيرة ، فقد حان الوقت لإلقاء نظرة فاحصة على CUDA.

إذا كنت تقرأ دليل أجهزة Tom بانتظام ، فستكون بنية أحدث وحدات معالجة الرسومات من nVidia مألوفة لك. إذا لم يكن الأمر كذلك ، نوصيك بمراجعة المقالة " nVidia GeForce GTX 260 و 280: الجيل التالي من بطاقات الرسوميات"فيما يتعلق بـ CUDA ، تقدم nVidia العمارة بطريقة مختلفة قليلاً ، مع إظهار بعض التفاصيل التي كانت مخفية في السابق.

كما ترون من الرسم التوضيحي أعلاه ، فإن nVidia shader core يتكون من مجموعات متعددة من معالجات النسيج. (مجموعة معالج النسيج ، TPC)... على سبيل المثال ، استخدم جهاز 8800 GTX ثماني مجموعات ، و 8800 جي تي إس ستة ، وما إلى ذلك. في الواقع ، تتكون كل مجموعة من وحدة نسيج واثنتين تدفق متعدد المعالجات... يتضمن الأخير بداية خط الأنابيب (الواجهة الأمامية) ، الذي يقرأ التعليمات ويفك تشفيرها ، بالإضافة إلى إرسالها للتنفيذ ، ونهاية خط الأنابيب (النهاية الخلفية) ، والذي يتكون من ثمانية أجهزة حاسوبية وجهازين فائقين الوظائف . SFU (وحدة الوظيفة الفائقة)حيث يتم تنفيذ التعليمات وفقًا لمبدأ SIMD ، أي أن هناك تعليمات واحدة تنطبق على جميع الخيوط في الالتواء. تسمي nVidia طريقة العمل هذه سيمت(تعليمات واحدة متعددة المواضيع ، تعليمات واحدة ، العديد من المواضيع). من المهم ملاحظة أن نهاية خط الأنابيب تعمل بضعف تكرار بدايتها. من الناحية العملية ، هذا يعني أن هذا الجزء يبدو "عريضًا" مرتين أكثر مما هو عليه في الواقع (أي ككتلة SIMD ذات 16 قناة بدلاً من كتلة من ثماني قنوات). يعمل تدفق المعالجات المتعددة على النحو التالي: في كل دورة ساعة ، تختار بداية خط الأنابيب التفافًا جاهزًا للتنفيذ ويبدأ في تنفيذ التعليمات. قد يستغرق الأمر أربع دورات على مدار الساعة لتطبيق التعليمات على جميع الخيوط الـ 32 في الالتواء ، ولكن نظرًا لأنها تعمل بضعف تكرار البداية ، فإنها لا تستغرق سوى دورتين على مدار الساعة (من حيث بداية خط الأنابيب). لذلك ، حتى لا تتسبب بداية خط الأنابيب في تعطيل الدورة ، ويتم تحميل الأجهزة قدر الإمكان ، في الحالة المثالية ، يمكنك تبديل التعليمات في كل دورة - تعليمات كلاسيكية في دورة واحدة وتعليمات لـ SFU - في اخر.

كل متعدد المعالجات لديه مجموعة محددة من الموارد التي تستحق الفهم. هناك مساحة صغيرة من الذاكرة تسمى "ذكريات مشتركه"، 16 كيلو بايت لكل متعدد المعالجات. هذه ليست بأي حال من الأحوال ذاكرة تخزين مؤقت: يمكن للمبرمج استخدامها وفقًا لتقديره الخاص. أي ، أمامنا شيء قريب من المتجر المحلي لوحدة SPU على معالجات الخلية. هذه التفاصيل مثيرة للفضول لأنها تؤكد أن CUDA هي مزيج من تقنيات البرامج والأجهزة. لا تُستخدم منطقة الذاكرة هذه لتظليل البكسل ، والتي تشير nVidia ببراعة إلى "أننا لا نحبها عندما تتحدث وحدات البكسل مع بعضها البعض".

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

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

يحتوي المعالجات المتعددة على 8192 تسجيلًا ، وهي شائعة لجميع تدفقات جميع الكتل النشطة على المعالجات المتعددة. لا يمكن أن يتجاوز عدد الكتل النشطة لكل متعدد المعالجات ثمانية ، ويقتصر عدد الاعوجاجات النشطة على 24 (768 مؤشر ترابط). لذلك ، يمكن لـ 8800 GTX معالجة ما يصل إلى 12288 مؤشر ترابط في المرة الواحدة. كل هذه القيود جديرة بالذكر لأنها تسمح بتحسين الخوارزمية بناءً على الموارد المتاحة.

وبالتالي ، فإن تحسين برنامج CUDA يتمثل في الحصول على التوازن الأمثل بين عدد الكتل وحجمها. سيكون المزيد من سلاسل الرسائل لكل كتلة مفيدًا لتقليل زمن انتقال الذاكرة ، ولكن يتم أيضًا تقليل عدد التسجيلات المتاحة لكل سلسلة. علاوة على ذلك ، فإن الكتلة المكونة من 512 مؤشر ترابط ستكون غير فعالة ، حيث يمكن تنشيط كتلة واحدة فقط على معالجات متعددة ، مما سيؤدي إلى فقدان 256 مؤشر ترابط. لذلك ، توصي nVidia باستخدام كتل من 128 أو 256 سلسلة ، والتي توفر أفضل حل وسط بين زمن الوصول المنخفض وعدد التسجيلات لمعظم النواة / النواة.

من وجهة نظر برمجية ، يتكون CUDA من مجموعة من امتدادات C ، تذكرنا بـ BrookGPU ، بالإضافة إلى العديد من استدعاءات API المحددة. تشمل الإضافات محددات النوع المتعلقة بالوظائف والمتغيرات. من المهم أن تتذكر الكلمة الرئيسية __عالمي__، والتي يتم تقديمها قبل الوظيفة ، توضح أن الأخير يشير إلى kernel / kernel - سيتم استدعاء هذه الوظيفة بواسطة وحدة المعالجة المركزية ، وسيتم تنفيذها على وحدة معالجة الرسومات. اختصار __جهاز__يشير إلى أنه سيتم تنفيذ الوظيفة على وحدة معالجة الرسومات (والتي ، بالمناسبة ، تستدعي CUDA "الجهاز / الجهاز") ولكن لا يمكن استدعاؤها إلا من وحدة معالجة الرسومات (بمعنى آخر ، من وظيفة __جهاز ___ أخرى أو من وظيفة __العالمية__). أخيرًا ، البادئة __يستضيف__اختياري ، فهو يشير إلى وظيفة تستدعيها وحدة المعالجة المركزية وتنفذها وحدة المعالجة المركزية - بمعنى آخر ، وظيفة عادية.

هناك عدد من القيود مع وظائف __الجهاز _ و __العالمية _: لا يمكن أن تكون متكررة (أي تسمي نفسها) ، ولا يمكن أن تحتوي على عدد متغير من الوسائط. أخيرًا ، نظرًا لأن وظائف __الجهاز__ موجودة في مساحة ذاكرة وحدة معالجة الرسومات ، فمن المنطقي أنك لن تتمكن من الحصول على عناوينها. تحتوي المتغيرات أيضًا على عدد من المؤهلات التي تشير إلى منطقة الذاكرة حيث سيتم تخزينها. متغير مسبوق __مشاركة__يعني أنه سيتم تخزينه في الذاكرة المشتركة للمعالج المتدفق المتدفق. استدعاء الوظيفة __ global__ مختلف قليلاً. النقطة المهمة هي ، عند الاتصال ، أنك بحاجة إلى ضبط تكوين التنفيذ - وبشكل أكثر تحديدًا ، حجم الشبكة / الشبكة التي سيتم تطبيق النواة / النواة عليها ، وكذلك حجم كل كتلة. خذ على سبيل المثال النواة ذات التوقيع التالي.

__ global__ وظيفة باطلة (معلمة تعويم *) ؛

سوف يطلق عليه

فونك<<< Dg, Db >>> (معلمة) ؛

حيث Dg هو حجم الشبكة و Db هو حجم الكتلة. هذان المتغيران من نوع جديد من المتجهات المقدمة مع CUDA.

تحتوي واجهة برمجة تطبيقات CUDA على وظائف للعمل مع الذاكرة في VRAM: cudaMalloc لتخصيص الذاكرة ، و cudaFree to free ، و cudaMemcpy لنسخ الذاكرة بين ذاكرة الوصول العشوائي (RAM) و VRAM والعكس صحيح.

سننهي هذه النظرة العامة بطريقة شيقة للغاية يتم فيها تجميع برنامج CUDA: يتم التجميع في عدة خطوات. أولاً ، يتم استرداد رمز وحدة المعالجة المركزية وتمريره إلى المترجم القياسي. يتم تحويل الكود الخاص بوحدة معالجة الرسومات أولاً إلى لغة PTX الوسيطة. إنها تشبه لغة التجميع وتسمح لك بدراسة الكود الخاص بك بحثًا عن أوجه القصور المحتملة. أخيرًا ، تتمثل المرحلة الأخيرة في ترجمة اللغة الوسيطة إلى تعليمات GPU محددة وإنشاء ملف ثنائي.

بعد الاطلاع على مستندات nVidia ، أريد فقط تجربة CUDA هذا الأسبوع. في الواقع ، ما الذي يمكن أن يكون أفضل من تقييم API من خلال إنشاء برنامجك الخاص؟ هذا هو الوقت الذي يجب أن تظهر فيه معظم المشكلات ، حتى لو كان كل شيء يبدو جيدًا على الورق. بالإضافة إلى ذلك ، ستظهر الممارسة على أفضل وجه مدى فهمك لجميع المبادئ الموضحة في وثائق CUDA.

من السهل جدًا الغوص في مشروع كهذا. يتوفر اليوم عدد كبير من الأدوات المجانية ولكن عالية الجودة للتنزيل. في اختبارنا ، استخدمنا Visual C ++ Express 2005 ، والذي يحتوي على كل ما تحتاجه. كان الجزء الأصعب هو العثور على برنامج لم يستغرق أسابيع لنقله إلى وحدة معالجة الرسومات ، ولكنه ممتع بدرجة كافية للحفاظ على جهودنا في حالة جيدة. أخيرًا ، اخترنا جزءًا من الكود يأخذ خريطة ارتفاع وتحسب الخريطة العادية المقابلة. لن نتعمق في هذه الوظيفة بالتفصيل ، لأنها بالكاد مثيرة للاهتمام في هذه المقالة. باختصار ، يتعامل البرنامج مع انحناء المناطق: لكل بكسل من الصورة الأولية ، نفرض مصفوفة تحدد لون البكسل الناتج في الصورة التي تم إنشاؤها بواسطة وحدات البكسل المجاورة ، باستخدام صيغة معقدة إلى حد ما. ميزة هذه الوظيفة هي أنه من السهل جدًا إجراء موازاة ، لذلك يوضح هذا الاختبار تمامًا قدرات CUDA.


ميزة أخرى هي أن لدينا بالفعل تطبيقًا على وحدة المعالجة المركزية ، لذلك يمكننا مقارنة نتائجه بإصدار CUDA - وليس إعادة اختراع العجلة.

نكرر مرة أخرى أن الغرض من الاختبار هو التعرف على أدوات CUDA SDK المساعدة ، وليس الاختبار المقارن لإصدارات وحدة المعالجة المركزية ووحدة معالجة الرسومات. نظرًا لأن هذه كانت محاولتنا الأولى لإنشاء برنامج CUDA ، لم يكن لدينا أمل كبير في الحصول على أداء عالٍ. نظرًا لأن هذا الجزء من الكود ليس بالغ الأهمية ، لم يتم تحسين إصدار وحدة المعالجة المركزية ، لذا فإن المقارنة المباشرة للنتائج ليست مثيرة للاهتمام.

أداء

ومع ذلك ، قمنا بقياس وقت التنفيذ لمعرفة ما إذا كانت هناك ميزة لاستخدام CUDA حتى مع التطبيق الأشد قسوة ، أو ما إذا كان الأمر سيستغرق ممارسة طويلة ومملة للحصول على نوع من مكاسب GPU. تم أخذ آلة الاختبار من مختبر التطوير لدينا - كمبيوتر محمول بمعالج Core 2 Duo T5450 وبطاقة رسومات GeForce 8600M GT التي تعمل بنظام Vista. هذا بعيد كل البعد عن كونه حاسوبًا عملاقًا ، لكن النتائج مثيرة جدًا للاهتمام ، نظرًا لأن الاختبار لم يتم "شحذه" لوحدة معالجة الرسومات. من الجيد دائمًا أن ترى أن nVidia تحقق مكاسب ضخمة على الأنظمة التي تحتوي على وحدات معالجة رسومات ضخمة وعرض نطاق ترددي كبير ، ولكن من الناحية العملية ، فإن العديد من وحدات معالجة الرسوميات التي تدعم CUDA والتي تبلغ 70 مليونًا في سوق أجهزة الكمبيوتر الشخصية اليوم ليست بنفس القوة ، وهذا هو السبب في أن اختبارنا له الحق في الحياة.

للحصول على صورة بدقة 2048 × 2048 بكسل ، حصلنا على النتائج التالية.

  • وحدة المعالجة المركزية 1 مؤشر ترابط: 1419 مللي ثانية ؛
  • خيوط وحدة المعالجة المركزية 2: 749 مللي ثانية ؛
  • خيوط وحدة المعالجة المركزية 4: 593 مللي ثانية
  • كتل GPU (8600M GT) من 256 مؤشر ترابط: 109 مللي ثانية ؛
  • كتل GPU (8600M GT) من 128 مؤشر ترابط: 94 مللي ثانية ؛
  • كتل GPU (8800 GTX) من 128 مؤشر ترابط / 256 موضوع: 31 مللي ثانية.

يمكن استخلاص عدة استنتاجات من النتائج. لنبدأ بحقيقة أنه على الرغم من الحديث عن الكسل الواضح للمبرمجين ، فقد قمنا بتعديل الإصدار الأولي من وحدة المعالجة المركزية لمؤشرات ترابط متعددة. كما ذكرنا ، يعد الكود مثاليًا لهذا الموقف - كل ما هو مطلوب هو تقسيم الصورة الأولية إلى العديد من المناطق التي توجد بها تدفقات. يرجى ملاحظة أن التسارع من الانتقال من مؤشر ترابط واحد إلى خيطين على وحدة المعالجة المركزية ثنائية النواة الخاصة بنا تبين أنه خطي تقريبًا ، مما يشير أيضًا إلى الطبيعة المتوازية لبرنامج الاختبار. بشكل غير متوقع تمامًا ، تبين أن الإصدار الذي يحتوي على أربعة مؤشرات ترابط أسرع أيضًا ، على الرغم من أن هذا غريب جدًا على معالجنا - على العكس من ذلك ، يمكن للمرء أن يتوقع انخفاضًا في الكفاءة بسبب عبء إدارة سلاسل العمليات الإضافية. كيف يمكن تفسير هذه النتيجة؟ من الصعب معرفة ذلك ، ولكن قد يكون السبب في جدولة مؤشر ترابط Windows ؛ على أي حال ، فإن النتيجة قابلة للتكرار. مع القوام الأصغر (512 × 512) ، لم يكن المكسب من الانقسام إلى خيوط واضحًا (حوالي 35٪ مقابل 100٪) ، وكان سلوك الإصدار الذي يحتوي على أربعة خيوط أكثر منطقية ، دون زيادة مقارنة بالإصدار الخاص بخيطين. كانت وحدة معالجة الرسومات (GPU) لا تزال أسرع ، ولكن ليس كما هو واضح (كان 8600M GT أسرع ثلاث مرات من الإصدار ثنائي الخيط).



اضغط على الصورة للتكبير.

الملاحظة الثانية المهمة هي أنه حتى أبطأ تطبيق GPU تبين أنه أسرع بست مرات تقريبًا من إصدار وحدة المعالجة المركزية الأعلى أداءً. بالنسبة للبرنامج الأول والإصدار غير الأمثل من الخوارزمية ، كانت النتيجة مشجعة للغاية. لاحظ أننا حصلنا على نتيجة أفضل بشكل ملحوظ على الكتل الصغيرة ، على الرغم من أن الحدس قد يوحي بخلاف ذلك. الشرح بسيط - يستخدم برنامجنا 14 تسجيلًا لكل مؤشر ترابط ، ومع كتل من 256 مؤشر ترابط ، يلزم وجود 3584 سجلًا لكل كتلة ، ويلزم 768 مؤشر ترابط لتحميل المعالج بالكامل ، كما أوضحنا. في حالتنا ، هذه ثلاث مجموعات أو 10572 سجلًا. لكن المعالجات المتعددة بها 8192 سجلاً فقط ، لذلك يمكنها فقط الاحتفاظ بمجموعتين نشطين. في المقابل ، مع الكتل المكونة من 128 سلسلة ، نحتاج إلى 1792 سجلًا لكل كتلة ؛ إذا تم تقسيم ٨١٢٢٢ على ١٧٩٢ وتم تقريبها إلى أقرب عدد صحيح ، فسنحصل على أربع كتل. من الناحية العملية ، سيكون عدد الخيوط كما هو (512 لكل معالج متعدد ، على الرغم من أن هناك حاجة نظريًا إلى 768 للحمل الكامل) ، ولكن الزيادة في عدد الكتل تمنح وحدة معالجة الرسومات ميزة المرونة في الوصول إلى الذاكرة - عند إجراء عملية باستخدام الكمون العالي قيد التقدم ، يمكنك البدء في تنفيذ التعليمات من كتلة أخرى ، في انتظار استلام النتائج. من الواضح أن أربع كتل تقلل من زمن الوصول ، خاصة وأن برنامجنا يستخدم العديد من عمليات الوصول إلى الذاكرة.

التحليلات

أخيرًا ، على الرغم مما قلناه أعلاه ، لم نتمكن من مقاومة الإغراء وقمنا بتشغيل البرنامج على 8800 GTX ، والذي تبين أنه أسرع بثلاث مرات من 8600 ، بغض النظر عن حجم الكتلة. قد تعتقد أنه من الناحية العملية ، في البنى المعنية ، ستكون النتيجة أعلى أربع مرات أو أكثر: 128 معالج ALU / shader مقابل 32 وسرعات أعلى على مدار الساعة (1.35 جيجاهرتز مقابل 950 ميجاهرتز) ، لكن هذا لم ينجح. كان العامل المحدد على الأرجح هو الوصول إلى الذاكرة. لكي نكون أكثر دقة ، يتم الوصول إلى الصورة الأولية كمصفوفة CUDA متعددة الأبعاد - وهو مصطلح معقد إلى حد ما لما هو ليس أكثر من نسيج. لكن هناك العديد من الفوائد.

  • الوصول يستفيد من ذاكرة التخزين المؤقت ؛
  • نحن نستخدم وضع الالتفاف ، والذي لا يحتاج إلى التعامل مع حدود الصورة ، على عكس إصدار وحدة المعالجة المركزية.

بالإضافة إلى ذلك ، يمكننا الاستفادة من التصفية "المجانية" بعنونة موحدة بين وبدلاً من ذلك ، ولكن في حالتنا هذه بالكاد تكون مفيدة. كما تعلم ، يحتوي الطراز 8600 على 16 وحدة نسيج مقارنة بـ 32 وحدة لـ 8800 GTX. لذلك ، فإن النسبة بين البنيتين هي فقط اثنين إلى واحد. أضف إلى ذلك الفرق في الترددات ونحصل على النسبة (32 × 0.575) / (16 × 0.475) = 2.4 - قريبة من "ثلاثة إلى واحد" التي نحصل عليها بالفعل. تشرح هذه النظرية أيضًا سبب عدم تغيير حجم الكتلة كثيرًا في G80 ، حيث لا يزال ALU قائمًا على كتل النسيج.



اضغط على الصورة للتكبير.

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

تومض الشاشة بعنف ، ثم أصبحت الشاشة سوداء ... حتى بدأ نظام التشغيل Vista في خدمة إصلاح برنامج التشغيل وكان كل شيء على ما يرام. ولكن لا يزال من المدهش إلى حد ما ملاحظة ما إذا كنت معتادًا على رؤية خطأ خطأ التجزئة النموذجي في البرامج القياسية مثل برامجنا. أخيرًا ، القليل من النقد الموجه إلى nVidia: في جميع الوثائق المتاحة لـ CUDA ، لا يوجد دليل صغير يرشدك خطوة بخطوة حول كيفية إعداد بيئة تطوير لبرنامج Visual Studio. في الواقع ، المشكلة ليست كبيرة ، حيث أن SDK لديها مجموعة كاملة من الأمثلة التي يمكنك دراستها لفهم إطار عمل تطبيقات CUDA ، ولكن دليل المبتدئين سيكون مفيدًا.



اضغط على الصورة للتكبير.

قدمت Nvidia CUDA مع GeForce 8800. بينما كانت الوعود مغرية في ذلك الوقت ، تمسكنا بحماسنا حتى الاختبار الفعلي. في الواقع ، في ذلك الوقت ، بدا الأمر أكثر من ترميز إقليمي للبقاء على موجة GPGPU. بدون SDK متاح ، من الصعب القول أن هذه ليست مجرد دمية تسويقية أخرى ستفشل. هذه ليست المرة الأولى التي يتم فيها الإعلان عن مبادرة جيدة في وقت مبكر جدًا ولم يتم الكشف عنها في ذلك الوقت بسبب نقص الدعم - خاصة في مثل هذا القطاع التنافسي. الآن ، بعد عام ونصف من الإعلان ، يمكننا أن نقول بثقة أن nVidia قد أوفت بوعدها.

ظهرت SDK بسرعة كبيرة في مرحلة تجريبية في أوائل عام 2007 وتم تحديثها بسرعة منذ ذلك الحين ، مما يثبت قيمة هذا المشروع لـ nVidia. اليوم CUDA تتطور بشكل جيد للغاية: SDK متاح بالفعل في الإصدار التجريبي 2.0 لأنظمة التشغيل الرئيسية (Windows XP و Vista و Linux و 1.1 لنظام التشغيل Mac OS X) ، وقد خصصت nVidia قسمًا كاملاً من الموقع للمطورين.

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

لذا فإن CUDA ليست منقذة للباحثين الذين يرغبون في إقناع مسؤولي الجامعة بشراء GeForce. CUDA هي تقنية متاحة بالكامل بالفعل يمكن لأي مبرمج سي استخدامها إذا كان على استعداد لقضاء الوقت والجهد في التعود على نموذج البرمجة الجديد. لن يضيع هذا الجهد إذا توازنت الخوارزميات بشكل جيد. نود أيضًا أن نشكر nVidia على توفير وثائق كاملة وعالية الجودة لمبرمجي CUDA الطموحين للعثور على إجابات.

ما الذي تتطلبه CUDA لتصبح واجهة برمجة تطبيقات يمكن التعرف عليها؟ في كلمة واحدة: قابلية النقل. نحن نعلم أن مستقبل تكنولوجيا المعلومات يكمن في الحوسبة المتوازية - اليوم يستعد الجميع لمثل هذه التغييرات ، ويتم توجيه جميع المبادرات ، سواء البرامج والأجهزة ، في هذا الاتجاه. ومع ذلك ، في الوقت الحالي ، إذا نظرنا إلى تطوير النماذج ، فإننا لا نزال في المرحلة الأولية: نقوم بإنشاء التدفقات يدويًا ونحاول التخطيط للوصول إلى الموارد المشتركة ؛ يمكنك بطريقة ما التعامل مع كل هذا ، إذا كان عدد النوى يمكن حسابه على أصابع يد واحدة. لكن في غضون سنوات قليلة ، عندما يكون عدد المعالجات بالمئات ، لن يكون هذا الاحتمال موجودًا. مع إصدار CUDA ، اتخذت nVidia الخطوة الأولى نحو حل هذه المشكلة - ولكن ، بالطبع ، هذا الحل مناسب فقط لوحدات معالجة الرسومات من هذه الشركة ، وحتى ذلك الحين ليس للجميع. يمكن فقط لـ GF8 و 9 (ومشتقاتهما Quadro / Tesla) العمل مع برامج CUDA اليوم. ونطاق 260/280 الجديد بالطبع.



اضغط على الصورة للتكبير.

يمكن أن تفتخر Nvidia بأنها باعت 70 مليون وحدة معالجة رسومات متوافقة مع CUDA في جميع أنحاء العالم ، لكنها لا تزال غير كافية لتصبح المعيار الفعلي. مع الأخذ في الاعتبار حقيقة أن المنافسين لا يقفون مكتوفي الأيدي. تقدم AMD SDK (حوسبة البث) الخاصة بها ، وقد أعلنت إنتل عن حل (Ct) ، على الرغم من عدم توفره بعد. حرب المعايير قادمة ، ومن الواضح أنه لن يكون هناك مجال لثلاثة منافسين في السوق حتى يأتي لاعب آخر ، مثل Microsoft ، بواجهة برمجة تطبيقات مشتركة ، والتي ستجعل بالطبع الحياة أسهل للمطورين.

لذلك ، تواجه nVidia الكثير من الصعوبات في طريق موافقة CUDA. على الرغم من أننا نمتلك حلاً ناجحًا من الناحية التكنولوجية ، إلا أنه لا يزال يتعين علينا إقناع المطورين بآفاقه - وهذا لن يكون سهلاً. ومع ذلك ، استنادًا إلى العديد من إعلانات وأخبار API الأخيرة ، يبدو المستقبل بعيدًا عن الكآبة.

- مجموعة من واجهات البرامج منخفضة المستوى ( API) لإنشاء الألعاب وتطبيقات الوسائط المتعددة الأخرى عالية الأداء. يتضمن دعمًا للأداء العالي 2 د- و ثلاثي الأبعاد- أجهزة الرسوم والصوت والمدخلات.

Direct3D (D3D) - واجهة لإخراج ثلاثي الأبعاد الأوليات(أجسام هندسية). متضمن في .

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

OpenCL(من اللغة الإنجليزية. افتح لغة الحوسبةحرفيا - لغة حوسبة مفتوحة) - إطار العمل(إطار نظام برمجي) لكتابة برامج الكمبيوتر المتعلقة بالحسابات المتوازية على رسومات مختلفة ( GPU) و ( ). في الإطار OpenCLيتضمن لغة برمجة وواجهة برمجة تطبيق ( API). OpenCLيوفر التوازي على مستوى التعليمات والبيانات وهو تنفيذ للتقنية GPGPU.

GPGPU(مختصر من الإنجليزية. General-P urpose G raphics P rocessing U nits، حرفيا - GPUالغرض العام) هي تقنية لاستخدام بطاقة فيديو معالج الرسومات للحسابات العامة التي يتم إجراؤها عادةً.

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

استدعاء(م. استدعاء) - التصور ، في رسومات الحاسوب ، عملية الحصول على صورة من نموذج باستخدام برنامج.

SDK(مختصر من الإنجليزية. ادوات \ عده تطوير البرمجيات) - مجموعة أدوات تطوير البرمجيات.

وحدة المعالجة المركزية(مختصر من الإنجليزية. وحدة معالجة مركزية، حرفيا - جهاز حوسبة مركزي / رئيسي / رئيسي) - مركزي (دقيق) ؛ جهاز ينفذ تعليمات الآلة ؛ قطعة من الأجهزة تكون مسؤولة عن تنفيذ العمليات الحسابية (المحددة بواسطة نظام التشغيل والبرامج التطبيقية) وتنسيق عمل جميع الأجهزة.

GPU(مختصر من الإنجليزية. وحدة معالجة الجرافيك، حرفيا - جهاز حوسبة رسومية) - معالج رسومات ؛ جهاز منفصل أو وحدة تحكم في الألعاب تؤدي عرض الرسومات (العرض). تتعامل وحدات معالجة الرسومات الحديثة مع رسومات الكمبيوتر وتجعلها فعالة للغاية. يتم استخدام معالج الرسوميات في محولات الفيديو الحديثة كمسرع للرسومات ثلاثية الأبعاد ، ولكن يمكن استخدامه أيضًا في بعض الحالات لإجراء العمليات الحسابية ( GPGPU).

مشاكل وحدة المعالجة المركزية

لفترة طويلة ، كانت الزيادة في أداء التقليدية ترجع أساسًا إلى الزيادة المتسلسلة في تردد الساعة (تم تحديد حوالي 80 ٪ من الأداء بواسطة تردد الساعة) مع زيادة متزامنة في عدد الترانزستورات على بلورة واحدة . ومع ذلك ، هناك زيادة أخرى في تردد الساعة (عند تردد ساعة يزيد عن 3.8 جيجاهرتز ، تسخن الرقائق ببساطة!) يواجه عددًا من الحواجز المادية الأساسية (نظرًا لأن العملية التكنولوجية قريبة جدًا من حجم الذرة: وحجم ذرة السليكون حوالي 0.543 نانومتر):

أولاً ، مع انخفاض حجم البلورة وزيادة تردد الساعة ، يزداد تيار التسرب في الترانزستورات. هذا يؤدي إلى زيادة في استهلاك الطاقة وزيادة في انبعاث الحرارة ؛

ثانيًا ، يتم تعويض مزايا سرعات الساعة الأعلى جزئيًا عن طريق زمن انتقال الذاكرة لأن أوقات الوصول إلى الذاكرة لا تتطابق مع زيادة سرعات الساعة ؛

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

تطوير GPU

بالتوازي مع تطور GPU:

نوفمبر 2008 - شركة انتلقدم خط 4 النواة انتل كور i7على أساس جيل جديد من العمارة الدقيقة نيحالم... تعمل المعالجات على مدار الساعة بسرعة 2.6-3.2 جيجاهرتز. مصنوع وفقًا لتقنية المعالجة 45 نانومتر.

ديسمبر 2008 - شحنات ذات 4 نواة AMD Phenom II 940(اسم الرمز - دنيب). تعمل بتردد 3 جيجاهرتز ، مصنعة باستخدام تقنية معالجة 45 نانومتر.

مايو 2009 - شركة AMDقدم إصدار GPU ATI Radeon HD 4890مع زيادة تردد الساعة الأساسية من 850 ميجاهرتز إلى 1 جيجاهرتز. هذا هو الاول الرسممعالج 1 جيجاهرتز. زادت قوة الحوسبة للرقاقة ، بسبب زيادة التردد ، من 1.36 إلى 1.6 تيرافلوب. المعالج يحتوي على 800 (!) نواة حسابية ، ويدعم ذاكرة الفيديو GDDR5, برنامج DirectX 10.1, بطاقة ATI CrossFireXوجميع التقنيات الأخرى الكامنة في نماذج بطاقات الفيديو الحديثة. الرقاقة مصنوعة على أساس تقنية 55 نانومتر.

الاختلافات الرئيسية GPU

السمات المميزة GPU(مقارنة مع ) نكون:

- الهندسة المعمارية ، تهدف إلى أقصى حد إلى زيادة سرعة حساب القوام والكائنات الرسومية المعقدة ؛

- ذروة الطاقة النموذجية GPUأعلى بكثير من ;

- بفضل هندسة الناقل المتخصصة ، GPUأكثر كفاءة في معالجة المعلومات الرسومية من.

"أزمة من النوع"

"أزمة من النوع" نضجت بحلول عام 2005 - ثم ظهرت. ولكن على الرغم من تطور التكنولوجيا ، فإن الزيادة في إنتاجية التقليدية انخفض بشكل ملحوظ. في نفس الوقت الأداء GPUيستمر بالنمو. لذا ، بحلول عام 2003 ، تبلورت هذه الفكرة الثورية - استخدام القوة الحاسوبية للرسم... أصبحت وحدات معالجة الرسومات مستخدمة بنشاط في الحوسبة "غير الرسومية" (محاكاة الفيزياء ، ومعالجة الإشارات ، والرياضيات / الهندسة الحسابية ، وعمليات قواعد البيانات ، والبيولوجيا الحاسوبية ، والاقتصاد الحسابي ، ورؤية الكمبيوتر ، وما إلى ذلك).

كانت المشكلة الرئيسية هي عدم وجود واجهة قياسية للبرمجة GPU... المطورين المستخدمة أوبنجلأو Direct3Dلكنها كانت مريحة للغاية. مؤسسة نفيديا(واحدة من أكبر الشركات المصنعة لمعالجات الرسومات والوسائط والاتصالات ، فضلاً عن معالجات الوسائط اللاسلكية ؛ تأسست عام 1993) ، وتولت تطوير معيار موحد وملائم - وقدمت التكنولوجيا كودا.

كيف بدأت

2006 - نفيديايوضح كودا ™؛ بداية ثورة في الحوسبة GPU.

2007 - نفيديايطلق العمارة كودا(نسخة أصلية كودا SDKتم تقديمه في 15 فبراير 2007) ؛ ترشيح "أفضل بدعة" من المجلة العلوم الشعبيةو "اختيار القراء" من المنشور HPCWire.

2008 - التكنولوجيا NVIDIA CUDAفازت في فئة "التميز التقني" من مجلة الكمبيوتر.

ماذا حدث كودا

كودا(مختصر من الإنجليزية. حساب هندسة الجهاز الموحد، حرفيًا - بنية حوسبة موحدة للأجهزة) - هندسة (مجموعة من البرامج والأجهزة) تسمح بذلك GPUحسابات الأغراض العامة ، بينما GPUفي الواقع بمثابة معالج مساعد قوي.

تكنولوجيا NVIDIA CUDA ™هي بيئة التطوير الوحيدة في لغة البرمجة ج، والذي يسمح للمطورين بإنشاء برامج لحل المشكلات الحسابية المعقدة في وقت أقل ، وذلك بفضل قوة معالجة وحدات معالجة الرسومات. الملايين يعملون بالفعل في العالم GPUبدعم كودا، وآلاف المبرمجين يستخدمون بالفعل أدوات (مجانية!) كودالتسريع التطبيقات وحل المهام الأكثر تعقيدًا التي تتطلب موارد كثيرة - من ترميز الفيديو والصوت إلى التنقيب عن النفط والغاز ونمذجة المنتجات والتصوير الطبي والبحث العلمي.

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

Uralsky ، متخصص التكنولوجيا الرائد نفيدياالمقارنة GPUو ، يقول ذلك: " هي سيارة دفع رباعي. إنه يقود سيارته في أي وقت وفي أي مكان ، ولكن ليس بسرعة كبيرة. أ GPUهي سيارة رياضية. على طريق سيء ، لن يذهب إلى أي مكان ، لكنه يعطي تغطية جيدة - وسيُظهر كل سرعته ، التي لم تحلم بها السيارة الرياضية متعددة الاستخدامات! .. ".

قدرات التكنولوجيا كودا



هل أعجبك المقال؟ أنشرها