از اندروید ۱۱ به بعد، 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
برای جلوگیری از حلقههای بینهایت، اگر یک حلقه WHILE بیشتر از مقدار loopTimeoutDuration که به فراخوانی IPreparedModel::execute_1_3() ، IPreparedModel::executeSynchronously_1_3() یا IPreparedModel::executeFenced() (یا مقدار پیشفرض در صورت حذف) ارسال میشود، طول بکشد، اجرا باید متوقف شود.
اعتبارسنجی
آزمایشهای جریان کنترل بخشی از مجموعه آزمایشهای CTS و VTS هستند. برای اطلاعات بیشتر، به بخش اعتبارسنجی مراجعه کنید.