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