Occa: طلب الميزة: إضافة خيار لإيقاف المحلل اللغوي لاستبدال المتغيرات المحددة بقيمها

تم إنشاؤها على ٢٩ يوليو ٢٠١٨  ·  10تعليقات  ·  مصدر: libocca/occa

حاليًا إذا تم تعريف p_N على 5 ، فعند تحليل النواة وإخراج جميع مثيلات p_N يتم استبدالها بـ 5.

قد يكون من المفيد إضافة خيار المحلل اللغوي بحيث يتم تضمين #defines في التعليمات البرمجية المصدر التي تم إنشاؤها ، ويتم ترك متغيرات المجمعين مثل p_N في التعليمات البرمجية المصدر التي تم إنشاؤها.

هذا سيجعل الكود الذي تم إنشاؤه أسهل كثيرًا في القراءة.

feature parser

التعليق الأكثر فائدة

هذا يبدو منطقيا

هناك بعض الميزات التي يجب إضافتها أولاً

  • قم بإنشاء متغيرات عامة من التعريفات العددية التي تم تمريرها كخصائص kernel بدلاً من #define

    • : تحذير: أن تكون قادرًا على القيام بذلك لجميع #defines أمر صعب للغاية لأننا سنحتاج إلى تتبع مكان تعريفها والنطاقات التي تلمسها بعد عمليات التحويل

  • [ميزة جديدة] خلال parser::getExpression ، استبدل constexpr بقيمها

    • في البداية فقط const المتغيرات

    • قم بالتوسيع إلى constexpr وظائف

  • قم بإضافة خطوط #define للأعلى كالمعتاد

ال 10 كومينتر

لسوء الحظ ، يجب توسيع جميع التعريفات لتطبيق تحويلات الكود
يمكن العثور على قيم #define في مكانين

raw_source.cpp

> head ~/.occa/cache/c8141715ac4e4272/raw_source.cpp 
#define  block 256

/* The MIT License (MIT)
 *

build.json

> cat ~/.occa/cache/c8141715ac4e4272/build.json | jq .kernel.props.defines
{
  "block": 256
}

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

إن الحفاظ على الكود وتحويله أصعب مما يبدو
يمكن أن تكون التعريفات أي شيء ، حتى رمز جزئي

#define foo 3 +

for (int i = 0; i < foo 5; ++i) {}

يمكن أن يتسبب الاحتفاظ بخطوط #define أيضًا في حدوث مشكلات نظرًا لأن المحول البرمجي سيستمر في تشغيل المعالج الأولي

.. وإذا كان Define مجرد ثابت عددي ...؟

... ولماذا نحتاج إلى منطق إضافي لذلك ....؟

هذا مثال على نواة الإخراج

extern "C" __global__ void _occa_ellipticPreconCoarsenHex3D_0(const int Nelements,
                                                              const double * __restrict__ R,
                                                              const double * __restrict__ qf,
                                                              double * __restrict__ qc) {
  {
    int e = 0 + blockIdx.x;
    __shared__ double s_qfff[8][8][8];
    __shared__ double s_qcff[2][8][8];
    __shared__ double s_qccf[2][2][8];
    __shared__ double s_qccc[2][2][2];
    __shared__ double s_R[2][8];
    {
      int k = 0 + threadIdx.z;
      {
        int j = 0 + threadIdx.y;
        {
          int i = 0 + threadIdx.x;
          const int id = i + j * 8 + k * 8 * 8 + e * 512;
          s_qfff[k][j][i] = qf[id];
          if ((k == 0) && (j < 2)) {
            s_R[j][i] = R[j * 8 + i];
          }
        }
      }
    }

النواة تفقد قابلية القراءة في الترجمة. كل هذه الأرقام كانت تعريفات.

أخذ خطوة إلى الوراء ، وكان سبب طلب الميزة هو

اجعل الشفرة التي تم إنشاؤها أسهل كثيرًا في القراءة

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

إذا كان الغرض هو تسهيل التصحيح ، أوافق على إضافة #line لمطابقة شفرة المصدر الأصلية

أوافق على أن هذا التصحيح سيكون مكافأة حقيقية - فكرة جيدة!

كان يجب أن أكون أكثر وضوحًا بشأن الأسباب الكامنة وراء هذا الطلب: إحدى حالات الاستخدام المهمة التي أتخيلها لأدوات إنشاء الكود الجديد في OCCA 1.0 هي كمترجم من OKL إلى لغة الترابط الأصلية للتطبيقات غير OCCA. في هذه الحالة سيكون من المهم الحفاظ على قابلية القراءة حيث سيتم فصل كود CUDA / OpenCL / HIP / OpenMP الذي تم إنشاؤه عن كود OKL.

هذا يبدو منطقيا

هناك بعض الميزات التي يجب إضافتها أولاً

  • قم بإنشاء متغيرات عامة من التعريفات العددية التي تم تمريرها كخصائص kernel بدلاً من #define

    • : تحذير: أن تكون قادرًا على القيام بذلك لجميع #defines أمر صعب للغاية لأننا سنحتاج إلى تتبع مكان تعريفها والنطاقات التي تلمسها بعد عمليات التحويل

  • [ميزة جديدة] خلال parser::getExpression ، استبدل constexpr بقيمها

    • في البداية فقط const المتغيرات

    • قم بالتوسيع إلى constexpr وظائف

  • قم بإضافة خطوط #define للأعلى كالمعتاد

شكرا للتفكير في طلب الميزة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

dmed256 picture dmed256  ·  4تعليقات

awehrfritz picture awehrfritz  ·  7تعليقات

jeremylt picture jeremylt  ·  12تعليقات

tcew picture tcew  ·  22تعليقات

amikstcyr picture amikstcyr  ·  11تعليقات