@@ -30,41 +30,6 @@ using std::stringstream;
3030using std::vector;
3131using namespace android ::nn::wrapper;
3232
33- // Copy from
34- // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/nnapi/nnapi_implementation.cc
35- int32_t ModelBuilder::GetAndroidSdkVersion () {
36- const char *sdkProp = " ro.build.version.sdk" ;
37- char sdkVersion[PROP_VALUE_MAX];
38- int length = __system_property_get (sdkProp, sdkVersion);
39- if (length != 0 ) {
40- int32_t result = 0 ;
41- for (int i = 0 ; i < length; ++i) {
42- int digit = sdkVersion[i] - ' 0' ;
43- if (digit < 0 || digit > 9 ) {
44- // Non-numeric SDK version, assume it's higher than expected;
45- return 0xffff ;
46- }
47- result = result * 10 + digit;
48- }
49- // TODO(levp): remove once SDK gets updated to 29th level
50- // Upgrade SDK version for pre-release Q to be able to test
51- // functionality available from SDK level 29.
52- if (result == 28 ) {
53- char versionCodename[PROP_VALUE_MAX];
54- const char *versionCodenameProp = " ro.build.version.codename" ;
55- length =
56- __system_property_get (versionCodenameProp, versionCodename);
57- if (length != 0 ) {
58- if (versionCodename[0 ] == ' Q' ) {
59- return 29 ;
60- }
61- }
62- }
63- return result;
64- }
65- return 0 ;
66- }
67-
6833void ModelBuilder::RegisterOperand (const std::string &name,
6934 ModelBuilder::Index index,
7035 const OperandType &operand_type) {
@@ -539,7 +504,7 @@ ModelBuilder::Index ModelBuilder::AddDequantize(const std::string &input,
539504 input_indexes.push_back (input_idx);
540505 shaper_.Identity (input, output);
541506 const OperandType operand_type =
542- GetOperandType (Type::FLOAT32 , shaper_[output]);
507+ GetOperandType (Type::TENSOR_FLOAT32 , shaper_[output]);
543508 const auto output_idx = AddOperation (ANEURALNETWORKS_DEQUANTIZE,
544509 input_indexes, operand_type)[0 ];
545510 RegisterOperand (output, output_idx, operand_type);
@@ -696,7 +661,7 @@ OperandType ModelBuilder::GetOperandType(const QuantInfo &quant_info,
696661 map_type##_operand_map_.end ()) { \
697662 const auto index = AddNewOperand ({Type::op_type}); \
698663 THROW_ON_ERROR_WITH_NOTE ( \
699- ANeuralNetworksModel_setOperandValue ( \
664+ nnapi_-> ANeuralNetworksModel_setOperandValue ( \
700665 dnn_model_->model_ , index, &value, sizeof (value)), \
701666 " value: " + std::to_string (value)); \
702667 map_type##_operand_map_[value] = index; \
@@ -713,15 +678,15 @@ DEFINE_OPERAND_FROM_SCALAR(float, float32, FLOAT32);
713678ModelBuilder::Index ModelBuilder::AddMissingOperand (
714679 const OperandType &operand_type) {
715680 const auto index = AddNewOperand (operand_type);
716- THROW_ON_ERROR (ANeuralNetworksModel_setOperandValue (dnn_model_-> model_ ,
717- index, nullptr , 0 ));
681+ THROW_ON_ERROR (nnapi_-> ANeuralNetworksModel_setOperandValue (
682+ dnn_model_-> model_ , index, nullptr , 0 ));
718683 return index;
719684}
720685
721686ModelBuilder::Index ModelBuilder::AddNewOperand (
722687 const OperandType &operand_type) {
723- THROW_ON_ERROR (ANeuralNetworksModel_addOperand (dnn_model_-> model_ ,
724- &operand_type.operandType ));
688+ THROW_ON_ERROR (nnapi_-> ANeuralNetworksModel_addOperand (
689+ dnn_model_-> model_ , &operand_type.operandType ));
725690 return next_index_++;
726691}
727692
@@ -732,7 +697,7 @@ ModelBuilder::Index ModelBuilder::AddTensorFromMemory(const string &name,
732697 throw std::invalid_argument (" " );
733698 DNN_ASSERT (!dimen.empty (), " " );
734699 const auto index = AddNewOperand ({Type::TENSOR_FLOAT32, dimen});
735- THROW_ON_ERROR (ANeuralNetworksModel_setOperandValueFromMemory (
700+ THROW_ON_ERROR (nnapi_-> ANeuralNetworksModel_setOperandValueFromMemory (
736701 dnn_model_->model_ , index, dnn_model_->memory_ ,
737702 addr - dnn_model_->data_ , Product (dimen) * sizeof (float )));
738703 shaper_.AddShape (name, dimen);
@@ -775,7 +740,7 @@ ModelBuilder::Index ModelBuilder::AddTensorFromBuffer(
775740 typeToStr (operand_type.type ));
776741 }
777742 uint32_t index = AddNewOperand (operand_type);
778- THROW_ON_ERROR (ANeuralNetworksModel_setOperandValue (
743+ THROW_ON_ERROR (nnapi_-> ANeuralNetworksModel_setOperandValue (
779744 dnn_model_->model_ , index, buffer,
780745 Product (operand_type.dimensions ) * element_size));
781746 shaper_.AddShape (name, operand_type.dimensions );
@@ -797,27 +762,28 @@ std::unique_ptr<Model> ModelBuilder::Compile(uint32_t preference) {
797762 }
798763 }
799764 THROW_ON_ERROR_WITH_NOTE (
800- ANeuralNetworksModel_identifyInputsAndOutputs (
765+ nnapi_-> ANeuralNetworksModel_identifyInputsAndOutputs (
801766 dnn_model_->model_ , static_cast <uint32_t >(input_index_vec_.size ()),
802767 &input_index_vec_[0 ],
803768 static_cast <uint32_t >(output_index_vec_.size ()),
804769 &output_index_vec_[0 ]),
805770 " on identifyInputsAndOutputs" );
806771
807- THROW_ON_ERROR_WITH_NOTE (ANeuralNetworksModel_finish (dnn_model_->model_ ),
808- " on model finish" );
772+ THROW_ON_ERROR_WITH_NOTE (
773+ nnapi_->ANeuralNetworksModel_finish (dnn_model_->model_ ),
774+ " on model finish" );
809775
810776 ;
811- THROW_ON_ERROR_WITH_NOTE (ANeuralNetworksCompilation_create (
777+ THROW_ON_ERROR_WITH_NOTE (nnapi_-> ANeuralNetworksCompilation_create (
812778 dnn_model_->model_ , &dnn_model_->compilation_ ),
813779 " on create" );
814780
815- THROW_ON_ERROR_WITH_NOTE (ANeuralNetworksCompilation_setPreference (
781+ THROW_ON_ERROR_WITH_NOTE (nnapi_-> ANeuralNetworksCompilation_setPreference (
816782 dnn_model_->compilation_ , preference),
817783 " on setPreference" );
818784
819785 THROW_ON_ERROR_WITH_NOTE (
820- ANeuralNetworksCompilation_finish (dnn_model_->compilation_ ),
786+ nnapi_-> ANeuralNetworksCompilation_finish (dnn_model_->compilation_ ),
821787 " on compilation finish" );
822788
823789 VLOG (5 ) << " Finishing.. Here are operands in the model:" ;
@@ -904,7 +870,7 @@ ModelBuilder::IndexSeq ModelBuilder::AddOperation(
904870 }
905871
906872 THROW_ON_ERROR_WITH_NOTE (
907- ANeuralNetworksModel_addOperation (
873+ nnapi_-> ANeuralNetworksModel_addOperation (
908874 dnn_model_->model_ , op, input_indexes.size (), &input_indexes[0 ],
909875 output_indexes.size (), &output_indexes[0 ]),
910876 " op = " + std::to_string (op));
@@ -914,16 +880,16 @@ ModelBuilder::IndexSeq ModelBuilder::AddOperation(
914880
915881void ModelBuilder::Prepare () {
916882 dnn_model_ = std::unique_ptr<Model>(new Model ());
917- const auto ret = ANeuralNetworksModel_create (&dnn_model_->model_ );
883+ const auto ret = nnapi_-> ANeuralNetworksModel_create (&dnn_model_->model_ );
918884 if (ret == ANEURALNETWORKS_OUT_OF_MEMORY) {
919885 throw std::bad_alloc ();
920886 }
921887}
922888
923889void ModelBuilder::SetMemory (int fd, size_t size, size_t offset) {
924890 ANeuralNetworksMemory *mem = nullptr ;
925- THROW_ON_ERROR (
926- ANeuralNetworksMemory_createFromFd ( size, PROT_READ, fd, offset, &mem));
891+ THROW_ON_ERROR (nnapi_-> ANeuralNetworksMemory_createFromFd (
892+ size, PROT_READ, fd, offset, &mem));
927893 dnn_model_->memory_ = mem;
928894}
929895
@@ -938,10 +904,14 @@ ModelBuilder &ModelBuilder::AddOutput(const std::string &name) {
938904}
939905
940906ModelBuilder &ModelBuilder::AllowFp16 (const bool allowed) {
941- if (GetAndroidSdkVersion () >= __ANDROID_API_P__) {
942- ANeuralNetworksModel_relaxComputationFloat32toFloat16 (
907+ if (nnapi_->ANeuralNetworksModel_relaxComputationFloat32toFloat16 !=
908+ nullptr ) {
909+ nnapi_->ANeuralNetworksModel_relaxComputationFloat32toFloat16 (
943910 dnn_model_->model_ , allowed);
944911 }
945912 return *this ;
946913}
914+
915+ ModelBuilder::ModelBuilder () : nnapi_(NnApiImplementation()) {
916+ }
947917} // namespace dnn
0 commit comments