تدفق التحكم

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

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

واجهات HAL

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

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

يحتوي IPreparedModel.hal على IPreparedModel ، الذي تقوم طرقه executeSynchronously_1_3() 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() execute_1_3 () أو IPreparedModel :: IPreparedModel::executeSynchronously_1_3() أو IPreparedModel::executeFenced() (أو القيمة الافتراضية إذا حذفت).

تصديق

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