با شروع از Android 11، NNAPI شامل دو عملیات جریان کنترلی، IF و WHILE است که مدلهای دیگر را به عنوان آرگومان میگیرد و آنها را به صورت شرطی ( IF ) یا مکرر ( WHILE ) اجرا میکند. این امکان ساخت مدلهایی را فراهم میکند که عملیاتهای مختلف را بر اساس مقادیر ورودی اجرا میکنند یا عملیاتها را چندین بار بدون بازکردن اجرا میکنند. این برای موارد استفاده مانند RNN پویا و seq2seq مهم است.
در NN HAL 1.3، مدل چندین زیرگراف، از جمله زیرگراف اصلی که برای مشخص کردن ورودیها و خروجیهای یک اجرا استفاده میشود، در خود جای داده است. یک زیرگراف می تواند با استفاده از عملوندهایی از نوع SUBGRAPH به زیرگراف های دیگر ارجاع دهد. چارچوب تنها در صورتی میتواند عملیات جریان کنترلی را به یک شتابدهنده ارسال کند که شتابدهنده از تمام عملیاتهای موجود در همه زیرگرافهای ارجاعشده توسط آن عملیات جریان کنترلی پشتیبانی کند.
رابط های HAL
در NN HAL 1.3، تعاریف مربوط به جریان کنترلی در types.hal هستند.
- انواع عملیات
IFوWHILE - نوع عملوند
SUBGRAPHو طول عمر عملوندSUBGRAPHمربوطه - ساختار
Modelکه شامل زیرگراف اصلی و فهرستی از زیرگراف های ارجاع شده است - ساختار
Capabilitiesکه حاویifPerformanceوwhilePerformanceاست
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 به پایان می رسد
برای جلوگیری IPreparedModel::execute_1_3() حلقههای بینهایت، اگر یک حلقه WHILE بیشتر از مقدار loopTimeoutDuration طول IPreparedModel::executeSynchronously_1_3() ، IPreparedModel::executeFenced() باید متوقف شود.
اعتبار سنجی
تست های جریان کنترل بخشی از مجموعه تست های CTS و VTS هستند. برای اطلاعات بیشتر، اعتبارسنجی را ببینید.