كيفية تصميم رقائق GPU
Chapter 11 Gpu Research Directions on Scalarization and Affine Execution

الفصل 11: اتجاهات البحث في وحدة المعالجة الرسومية على التقييم الرقمي والتنفيذ الخطي

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

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

تكمن الفكرة الرئيسية لهذا البحث في ملاحظة بنية القيمة [Kim et al., 2013] عبر الخيوط التي تنفذ نفس نواة الحساب. يتم توضيح نوعي بنية القيمة، الموحدة والخطية، في نواة الحساب في المثال 11.1.

المتغير الموحد متغير له نفس القيمة الثابتة لكل خيط في نواة الحساب. في الخوارزمية 11.1، المتغير a، وكذلك الثوابت THRESHOLD و Y_MAX_VALUE، لها جميعًا قيم موحدة عبر جميع الخيوط في نواة الحساب. يمكن تخزين المتغير الموحد في سجل رقمي واحد، واستخدامه من قبل جميع الخيوط في نواة الحساب.

المتغير الخطي متغير له قيم تمثل دالة خطية لمعرف الخيط لكل خيط في نواة الحساب. في الخوارزمية 11.1، عنوان الذاكرة للمتغير y[idx] يمكن تمثيله كتحويل خطي لمعرف الخيط threadIdx.x:

&(y[idx]) = &(y[0]) + sizeof(int) * threadIdx.x;

يمكن تخزين هذا التمثيل الخطي كزوج من القيم الرقمية، قاعدة وخطوة، وهو أكثر كثافة من التوسيع الكامل للمتجه.

__global__ void vsadd( int y[], int a ) {
    // لا تترجم الشفرة البرمجية، ترجم التعليقات فقط
    // الشفرة البرمجية هي نفسها
}
```هنا ترجمة الملف إلى اللغة العربية. بالنسبة للرموز البرمجية، لم يتم ترجمة الرموز نفسها، وإنما تمت ترجمة التعليقات فقط:
 

int idx = threadIdx.x; y[idx] = y[idx] + a; if ( y[idx] > THRESHOLD ) y[idx] = Y_MAX_VALUE; }

الخوارزمية 11.1: مثال على العمليات الرقمية والخطية في نواة حسابية (من [Kim et al., 2013]).

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

## الكشف عن المتغيرات الموحدة أو الخطية

هناك طريقتان رئيسيتان للكشف عن وجود متغيرات موحدة أو خطية في نواة حسابية لوحدة معالجة الرسومات: الكشف بقيادة المترجم والكشف عبر الأجهزة.

### الكشف بقيادة المترجم

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

يعتمد AMD GCN [AMD, 2012] على المترجم للكشف عن المتغيرات الموحدة والعمليات الرقمية التي يمكن تخزينها ومعالجتها بواسطة معالج رقمي مخصص.

يقدم Asanovic et al. [2013] تحليلاً مشتركًا وتباينيًا يسمح للمترجم بتحديد العمليات في أي نواة حسابية مؤهلة للتحويل إلى عمليات رقمية و/أو خطية. يمكن تحويل التعليمات ضمن المناطق المتقاربة لنواة حسابية إلى تعليمات رقمية/خطية. عند أي انتقال من مناطق متباينة إلى مناطق متقاربة في نواة حسابية، يقوم المترجم بإدراج تعليمة `syncwarp` لمعالجة تبعيات السجل المحدثة بواسطة التحكم في التدفق بين المنطقتين. اعتمد Asanovic et al. [2013] علىهذا التحليل لتوليد عمليات عددية للهندسة المعمارية Temporal-SIMT [Keckler et al., 2011, Krashinsky, 2011].

الحساب الأفيني المنفصل (DAC) [Wang and Lin, 2017] يعتمد على تحليل مماثل للمجمع لاستخراج المرشحات العددية والأفينية ليتم فصلها إلى وارب منفصل. قام Wang و Lin [2017] بتعزيز العملية بتحليل أفيني متباين، بهدف استخراج سلاسل من التعليمات