InferenceTFLite::InferenceTFLite(void) : mTargetTypes(INFERENCE_TARGET_NONE)
{
LOGI("ENTER");
+
+#if USE_XNNPACK
+ _use_xnnpack = true;
+#endif
+
LOGI("LEAVE");
}
LOGI("Inferece targets are: [%d]", mTargetTypes);
+ TfLiteDelegate *delegate = NULL;
+
if (mTargetTypes == INFERENCE_TARGET_GPU) {
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
- TfLiteDelegate *delegate = TfLiteGpuDelegateV2Create(&options);
+
+ delegate = TfLiteGpuDelegateV2Create(&options);
if (!delegate){
LOGE("Failed to GPU delegate");
return INFERENCE_ENGINE_ERROR_INVALID_OPERATION;
}
-
- if (mInterpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk)
- {
- LOGE("Failed to construct GPU delegate");
- return INFERENCE_ENGINE_ERROR_INVALID_OPERATION;
- }
- } else {
+ } else if (_use_xnnpack) {
LOGI("Use XNNPACK.");
- TfLiteDelegate *delegate = NULL;
int num_threads = std::thread::hardware_concurrency();
char *env_tflite_num_threads = getenv("FORCE_TFLITE_NUM_THREADS");
- if (env_tflite_num_threads)
- {
+ if (env_tflite_num_threads) {
num_threads = atoi(env_tflite_num_threads);
- LOGI("@@@@@@ FORCE_TFLITE_NUM_THREADS(XNNPACK)=%d", num_threads);
+ LOGI("FORCE_TFLITE_NUM_THREADS for NNPACK = %d", num_threads);
}
// IMPORTANT: initialize options with TfLiteXNNPackDelegateOptionsDefault() for
// API-compatibility with future extensions of the TfLiteXNNPackDelegateOptions
// structure.
TfLiteXNNPackDelegateOptions xnnpack_options = TfLiteXNNPackDelegateOptionsDefault();
+
xnnpack_options.num_threads = num_threads;
- delegate = TfLiteXNNPackDelegateCreate (&xnnpack_options);
+ delegate = TfLiteXNNPackDelegateCreate(&xnnpack_options);
if (!delegate) {
- LOGE("ERR: %s(%d)", __FILE__, __LINE__);
- }
-
- if (mInterpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) {
- LOGE("Failed to construct GPU delegate");
+ LOGE("Fail to create XNNPACK Delegate.");
return INFERENCE_ENGINE_ERROR_INVALID_OPERATION;
}
}
+ if (mInterpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) {
+ LOGE("Failed to construct a delegate");
+ return INFERENCE_ENGINE_ERROR_INVALID_OPERATION;
+ }
+
mInterpreter->SetNumThreads(MV_INFERENCE_TFLITE_MAX_THREAD_NUM);
LOGI("mInterpreter->tensors_size() :[%zu]",
mInterpreter->tensors_size());