Android 11 से, NNAPI में दो कंट्रोल फ़्लो ऑपरेशन शामिल हैं: IF और WHILE. ये ऑपरेशन, अन्य मॉडल को आर्ग्युमेंट के तौर पर लेते हैं और उन्हें शर्तों के हिसाब से (IF) या बार-बार (WHILE) लागू करते हैं. इससे ऐसे मॉडल बनाए जा सकते हैं जो इनपुट वैल्यू के आधार पर अलग-अलग ऑपरेशन लागू करते हैं या बिना अनरोल किए कई बार ऑपरेशन लागू करते हैं. यह डाइनैमिक आरएनएन और seq2seq जैसे इस्तेमाल के उदाहरणों के लिए ज़रूरी है.
NN HAL 1.3 में, मॉडल कई सबग्राफ़ शामिल करता है. इनमें मुख्य सबग्राफ़ भी शामिल है. इसका इस्तेमाल, किसी प्रोसेस के इनपुट और आउटपुट तय करने के लिए किया जाता है. कोई सबग्राफ़, SUBGRAPH टाइप के ऑपरेंड का इस्तेमाल करके, दूसरे सबग्राफ़ को रेफ़रंस कर सकता है. फ़्रेमवर्क, कंट्रोल फ़्लो ऑपरेशन को ऐक्सलरेटर पर सिर्फ़ तब भेज सकता है, जब ऐक्सलरेटर, कंट्रोल फ़्लो ऑपरेशन से रेफ़र किए गए सभी सबग्राफ़ में मौजूद सभी ऑपरेशन के साथ काम करता हो.
एचएएल इंटरफ़ेस
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() देखें.
ध्यान दें कि 1 शेप वाले 1 ऑपरेंड पर अंकगणित और तुलना से जुड़ी कार्रवाइयों को सपोर्ट करना ज़रूरी है, क्योंकि इनका इस्तेमाल लूप काउंटर के तौर पर किया जा सकता है.TENSOR_INT32
इसी तरह, 1 शेप के TENSOR_BOOL8 ऑपरेंड बनाने वाली कार्रवाइयों का इस्तेमाल, IF और WHILE शर्तों के साथ किया जाना चाहिए.
WHILE लूप को पूरा करने में टाइम आउट से ज़्यादा समय लगा
इनफ़िनिट लूप को रोकने के लिए, अगर WHILE लूप को loopTimeoutDuration वैल्यू से ज़्यादा समय लगता है, तो उसे बंद कर देना चाहिए. यह वैल्यू, IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() या IPreparedModel::executeFenced() के कॉल में पास की जाती है. अगर वैल्यू नहीं दी जाती है, तो डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाता है.
सत्यापन
कंट्रोल फ़्लो टेस्ट, CTS और VTS टेस्ट सुइट का हिस्सा होते हैं. ज़्यादा जानकारी के लिए, पुष्टि करना लेख पढ़ें.