#include #include #include "selfdrive/modeld/runners/snpemodel.h" #include "selfdrive/modeld/thneed/thneed.h" #include "selfdrive/hardware/hw.h" #define TEMPORAL_SIZE 512 #define DESIRE_LEN 8 #define TRAFFIC_CONVENTION_LEN 2 // TODO: This should probably use SNPE directly. int main(int argc, char* argv[]) { bool run_optimizer = false, save_binaries = false; const char *input_file = NULL, *output_file = NULL; static struct option long_options[] = { {"in", required_argument, 0, 'i' }, {"out", required_argument, 0, 'o' }, {"binary", no_argument, 0, 'b' }, {"optimize", no_argument, 0, 'f' }, {0, 0, 0, 0 } }; int long_index = 0, opt = 0; while ((opt = getopt_long_only(argc, argv,"", long_options, &long_index)) != -1) { switch (opt) { case 'i': input_file = optarg; break; case 'o': output_file = optarg; break; case 'b': save_binaries = true; break; case 'f': run_optimizer = true; break; } } // no input? if (!input_file) { printf("usage: -i -o --binary --optimize\n"); return -1; } #define OUTPUT_SIZE 0x10000 float *output = (float*)calloc(OUTPUT_SIZE, sizeof(float)); SNPEModel mdl(input_file, output, 0, USE_GPU_RUNTIME, true); mdl.thneed->run_optimizer = run_optimizer; float state[TEMPORAL_SIZE] = {0}; float desire[DESIRE_LEN] = {0}; float traffic_convention[TRAFFIC_CONVENTION_LEN] = {0}; float *input = (float*)calloc(0x1000000, sizeof(float)); float *extra = (float*)calloc(0x1000000, sizeof(float)); mdl.addRecurrent(state, TEMPORAL_SIZE); mdl.addDesire(desire, DESIRE_LEN); mdl.addTrafficConvention(traffic_convention, TRAFFIC_CONVENTION_LEN); mdl.addImage(input, 0); mdl.addExtra(extra, 0); // first run printf("************** execute 1 **************\n"); memset(output, 0, OUTPUT_SIZE * sizeof(float)); mdl.execute(); // don't save? if (!output_file) { printf("no output file, exiting\n"); return 0; } // save model printf("saving %s with binary %d\n", output_file, save_binaries); mdl.thneed->save(output_file, save_binaries); // test model auto thneed = new Thneed(true); thneed->record = false; thneed->load(output_file); thneed->clexec(); thneed->find_inputs_outputs(); return 0; }