مسار التحكّم

بدءًا من Android 11، يتضمن NNAPI عمليتين لتدفق التحكم، IF و WHILE ، اللتين تأخذان نماذج أخرى كوسيطات وتنفذانها بشكل مشروط ( IF ) أو بشكل متكرر ( WHILE ). يسمح ذلك ببناء نماذج تنفذ عمليات مختلفة بناءً على قيم الإدخال أو تنفذ عمليات عدة مرات دون فتح. يعد هذا أمرًا مهمًا لحالات الاستخدام مثل RNN الديناميكي وseq2seq.

في NN HAL 1.3، يشتمل النموذج على رسوم بيانية فرعية متعددة، بما في ذلك الرسم البياني الفرعي الرئيسي المستخدم لتحديد مدخلات ومخرجات التنفيذ. يمكن أن يشير الرسم البياني الفرعي إلى رسوم بيانية فرعية أخرى باستخدام معاملات من النوع SUBGRAPH . يمكن لإطار العمل إرسال عملية تدفق التحكم إلى المسرّع فقط إذا كان المسرّع يدعم جميع العمليات في جميع الرسوم البيانية الفرعية المشار إليها بواسطة عملية تدفق التحكم هذه.

واجهات هال

في NN HAL 1.3، التعريفات المتعلقة بتدفق التحكم موجودة في types.hal .

يحتوي IDevice.hal على IDevice ، الذي يجب أن يتعامل أسلوبه getSupportedOperations_1_3() مع IF و WHILE بشكل مختلف عن العمليات الأخرى.

يحتوي IPreparedModel.hal على IPreparedModel ، الذي تأخذ أساليبه execute_1_3() و executeSynchronously_1_3() و executeFenced() وسيطة loopTimeoutDuration اختيارية.

تنفيذ السائق

للحصول على نموذج لتنفيذ العملية، راجع CpuExecutor::executeIfOperation و CpuExecutor::executeWhileOperation . للحصول على نموذج منطق التحقق من صحة العملية، راجع validateIfOperation() و validateWhileOperation() .

لاحظ أنه من المهم دعم العمليات الحسابية والمقارنة على معاملات TENSOR_INT32 ذات الشكل 1 ، حيث يمكن استخدامها كعدادات حلقية. وبالمثل، يجب استخدام العمليات التي تنتج معاملات TENSOR_BOOL8 بالشكل 1 مع شروط IF و WHILE .

أثناء انتهاء مهلة تنفيذ الحلقة

لمنع الحلقات اللانهائية، يجب إحباط التنفيذ إذا استغرقت حلقة WHILE وقتًا أطول من قيمة loopTimeoutDuration التي تم تمريرها إلى استدعاء IPreparedModel::execute_1_3() أو IPreparedModel::executeSynchronously_1_3() أو IPreparedModel::executeFenced() (أو القيمة الافتراضية إذا تم حذفه).

تصديق

تعد اختبارات التحكم في التدفق جزءًا من مجموعات اختبار CTS وVTS. لمزيد من المعلومات، راجع التحقق من الصحة .