You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							191 lines
						
					
					
						
							6.4 KiB
						
					
					
				
			
		
		
	
	
							191 lines
						
					
					
						
							6.4 KiB
						
					
					
				| #include <SNPE/SNPE.hpp>
 | |
| #include <SNPE/SNPEBuilder.hpp>
 | |
| #include <SNPE/SNPEFactory.hpp>
 | |
| #include <DlContainer/IDlContainer.hpp>
 | |
| #include <DlSystem/DlError.hpp>
 | |
| #include <DlSystem/ITensor.hpp>
 | |
| #include <DlSystem/ITensorFactory.hpp>
 | |
| #include <iostream>
 | |
| #include <fstream>
 | |
| #include <sstream>
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| int64_t timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p) {
 | |
|   return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) - ((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
 | |
| }
 | |
| 
 | |
| void PrintErrorStringAndExit() {
 | |
|   cout << "ERROR!" << endl;
 | |
|   const char* const errStr = zdl::DlSystem::getLastErrorString();
 | |
|   std::cerr << errStr << std::endl;
 | |
|   std::exit(EXIT_FAILURE);
 | |
| }
 | |
| 
 | |
| 
 | |
| zdl::DlSystem::Runtime_t checkRuntime() {
 | |
|   static zdl::DlSystem::Version_t Version = zdl::SNPE::SNPEFactory::getLibraryVersion();
 | |
|   static zdl::DlSystem::Runtime_t Runtime;
 | |
|   std::cout << "SNPE Version: " << Version.asString().c_str() << std::endl; //Print Version number
 | |
|   if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::DSP)) {
 | |
|     std::cout << "Using DSP runtime" << std::endl;
 | |
|     Runtime = zdl::DlSystem::Runtime_t::DSP;
 | |
|   } else if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::GPU)) {
 | |
|     std::cout << "Using GPU runtime" << std::endl;
 | |
|     Runtime = zdl::DlSystem::Runtime_t::GPU;
 | |
|   } else {
 | |
|     std::cout << "Using cpu runtime" << std::endl;
 | |
|     Runtime = zdl::DlSystem::Runtime_t::CPU;
 | |
|   }
 | |
|   return Runtime;
 | |
| }
 | |
| 
 | |
| void test(char *filename) {
 | |
|   static zdl::DlSystem::Runtime_t runtime = checkRuntime();
 | |
|   std::unique_ptr<zdl::DlContainer::IDlContainer> container;
 | |
|   container = zdl::DlContainer::IDlContainer::open(filename);
 | |
| 
 | |
|   if (!container) { PrintErrorStringAndExit(); }
 | |
|   cout << "start build" << endl;
 | |
|   std::unique_ptr<zdl::SNPE::SNPE> snpe;
 | |
|   {
 | |
|     snpe = NULL;
 | |
|     zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
 | |
|     snpe = snpeBuilder.setOutputLayers({})
 | |
|       .setRuntimeProcessor(runtime)
 | |
|       .setUseUserSuppliedBuffers(false)
 | |
|       //.setDebugMode(true)
 | |
|       .build();
 | |
|     if (!snpe) {
 | |
|       cout << "ERROR!" << endl;
 | |
|       const char* const errStr = zdl::DlSystem::getLastErrorString();
 | |
|       std::cerr << errStr << std::endl;
 | |
|     }
 | |
|     cout << "ran snpeBuilder" << endl;
 | |
|   }
 | |
| 
 | |
|   const auto &strList_opt = snpe->getInputTensorNames();
 | |
|   if (!strList_opt) throw std::runtime_error("Error obtaining input tensor names");
 | |
| 
 | |
|   cout << "get input tensor names done" << endl;
 | |
|   const auto &strList = *strList_opt;
 | |
|   static zdl::DlSystem::TensorMap inputTensorMap;
 | |
|   static zdl::DlSystem::TensorMap outputTensorMap;
 | |
|   vector<std::unique_ptr<zdl::DlSystem::ITensor> > inputs;
 | |
|   for (int i = 0; i < strList.size(); i++) {
 | |
|     cout << "input name: " << strList.at(i) << endl;
 | |
| 
 | |
|     const auto &inputDims_opt = snpe->getInputDimensions(strList.at(i));
 | |
|     const auto &inputShape = *inputDims_opt;
 | |
|     inputs.push_back(zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape));
 | |
|     inputTensorMap.add(strList.at(i), inputs[i].get());
 | |
|   }
 | |
| 
 | |
|   struct timespec start, end;
 | |
|   cout << "**** starting benchmark ****" << endl;
 | |
|   for (int i = 0; i < 50; i++) {
 | |
|     clock_gettime(CLOCK_MONOTONIC, &start);
 | |
|     int err = snpe->execute(inputTensorMap, outputTensorMap);
 | |
|     assert(err == true);
 | |
|     clock_gettime(CLOCK_MONOTONIC, &end);
 | |
|     uint64_t timeElapsed = timespecDiff(&end, &start);
 | |
|     printf("time: %f ms\n", timeElapsed*1.0/1e6);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void get_testframe(int index, std::unique_ptr<zdl::DlSystem::ITensor> &input) {
 | |
|   FILE * pFile;
 | |
|   string filepath="/data/ipt/quantize_samples/sample_input_"+std::to_string(index);
 | |
|   pFile = fopen(filepath.c_str(),"rb");
 | |
|   int length = 1*6*160*320*4;
 | |
|   float * frame_buffer = new float[length/4]; // 32/8
 | |
|   fread(frame_buffer, length, 1, pFile);
 | |
|   // std::cout << *(frame_buffer+length/4-1) << std::endl;
 | |
|   std::copy(frame_buffer, frame_buffer+(length/4), input->begin());
 | |
| }
 | |
| 
 | |
| void SaveITensor(const std::string& path, const zdl::DlSystem::ITensor* tensor)
 | |
| {
 | |
|    std::ofstream os(path, std::ofstream::binary);
 | |
|    if (!os)
 | |
|    {
 | |
|       std::cerr << "Failed to open output file for writing: " << path << "\n";
 | |
|       std::exit(EXIT_FAILURE);
 | |
|    }
 | |
|    for ( auto it = tensor->cbegin(); it != tensor->cend(); ++it )
 | |
|    {
 | |
|       float f = *it;
 | |
|       if (!os.write(reinterpret_cast<char*>(&f), sizeof(float)))
 | |
|       {
 | |
|          std::cerr << "Failed to write data to: " << path << "\n";
 | |
|          std::exit(EXIT_FAILURE);
 | |
|       }
 | |
|    }
 | |
| }
 | |
| 
 | |
| void testrun(char* modelfile) {
 | |
|   static zdl::DlSystem::Runtime_t runtime = checkRuntime();
 | |
|   std::unique_ptr<zdl::DlContainer::IDlContainer> container;
 | |
|   container = zdl::DlContainer::IDlContainer::open(modelfile);
 | |
| 
 | |
|   if (!container) { PrintErrorStringAndExit(); }
 | |
|   cout << "start build" << endl;
 | |
|   std::unique_ptr<zdl::SNPE::SNPE> snpe;
 | |
|   {
 | |
|     snpe = NULL;
 | |
|     zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
 | |
|     snpe = snpeBuilder.setOutputLayers({})
 | |
|       .setRuntimeProcessor(runtime)
 | |
|       .setUseUserSuppliedBuffers(false)
 | |
|       //.setDebugMode(true)
 | |
|       .build();
 | |
|     if (!snpe) {
 | |
|       cout << "ERROR!" << endl;
 | |
|       const char* const errStr = zdl::DlSystem::getLastErrorString();
 | |
|       std::cerr << errStr << std::endl;
 | |
|     }
 | |
|     cout << "ran snpeBuilder" << endl;
 | |
|   }
 | |
| 
 | |
|   const auto &strList_opt = snpe->getInputTensorNames();
 | |
|   if (!strList_opt) throw std::runtime_error("Error obtaining input tensor names");
 | |
|   cout << "get input tensor names done" << endl;
 | |
| 
 | |
|   const auto &strList = *strList_opt;
 | |
|   static zdl::DlSystem::TensorMap inputTensorMap;
 | |
|   static zdl::DlSystem::TensorMap outputTensorMap;
 | |
| 
 | |
|   assert (strList.size() == 1);
 | |
|   const auto &inputDims_opt = snpe->getInputDimensions(strList.at(0));
 | |
|   const auto &inputShape = *inputDims_opt;
 | |
|   std::cout << "winkwink" << std::endl;
 | |
| 
 | |
|   for (int i=0;i<10000;i++) {
 | |
|     std::unique_ptr<zdl::DlSystem::ITensor> input;
 | |
|     input = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape);
 | |
|     get_testframe(i,input);
 | |
|     snpe->execute(input.get(), outputTensorMap);
 | |
|     zdl::DlSystem::StringList tensorNames = outputTensorMap.getTensorNames();
 | |
|     std::for_each( tensorNames.begin(), tensorNames.end(), [&](const char* name) {
 | |
|       std::ostringstream path;
 | |
|       path << "/data/opt/Result_" << std::to_string(i) << ".raw";
 | |
|       auto tensorPtr = outputTensorMap.getTensor(name);
 | |
|       SaveITensor(path.str(), tensorPtr);
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| int main(int argc, char* argv[]) {
 | |
|   if (argc < 2) {
 | |
|     printf("usage: %s <filename>\n", argv[0]);
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   if (argc == 2) {
 | |
|     while (true) test(argv[1]);
 | |
|   } else if (argc == 3) {
 | |
|     testrun(argv[1]);
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| 
 |