-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathefficientnet_lite.c
167 lines (148 loc) · 5.17 KB
/
efficientnet_lite.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* Copyright (C) 2017 GreenWaves Technologies
* All rights reserved.
*
* This software may be modified and distributed under the terms
* of the BSD license. See the LICENSE file for details.
*
*/
/* Autotiler includes. */
#include "efficientnet_lite.h"
#include "efficientnet_liteKernels.h"
#include "gaplib/ImgIO.h"
#ifdef __EMUL__
#define pmsis_exit(n) exit(n)
#endif
#define __XSTR(__s) __STR(__s)
#define __STR(__s) #__s
#ifndef STACK_SIZE
#define STACK_SIZE 1024
#endif
AT_HYPERFLASH_FS_EXT_ADDR_TYPE efficientnet_lite_L3_Flash = 0;
AT_HYPERFLASH_FS_EXT_ADDR_TYPE efficientnet_lite_L3_PrivilegedFlash = 0;
char *ImageName;
/* Inputs */
// L2_MEM signed char Input_1[150528];
/* Outputs */
L2_MEM short int Output_1[1000];
int outclass = 0, MaxPrediction = 0;
static void cluster()
{
#ifdef PERF
printf("Start timer\n");
gap_cl_starttimer();
gap_cl_resethwtimer();
#endif
GPIO_HIGH();
efficientnet_liteCNN(Output_1);
GPIO_LOW();
printf("Runner completed\n");
//Check Results
outclass = 0, MaxPrediction = 0;
for(int i=0; i<1000; i++){
if (Output_1[i] > MaxPrediction){
outclass = i;
MaxPrediction = Output_1[i];
}
}
printf("Predicted class:\t%d\n", outclass);
printf("With confidence:\t%d\n", MaxPrediction);
}
int test_efficientnet_lite(void)
{
#ifndef __EMUL__
OPEN_GPIO_MEAS();
/* Configure And open cluster. */
struct pi_device cluster_dev;
struct pi_cluster_conf cl_conf;
pi_cluster_conf_init(&cl_conf);
cl_conf.id = 0;
cl_conf.cc_stack_size = STACK_SIZE;
pi_open_from_conf(&cluster_dev, (void *) &cl_conf);
pi_cluster_open(&cluster_dev);
pi_freq_set(PI_FREQ_DOMAIN_FC, FREQ_FC*1000*1000);
pi_freq_set(PI_FREQ_DOMAIN_CL, FREQ_CL*1000*1000);
pi_freq_set(PI_FREQ_DOMAIN_PERIPH, FREQ_PE*1000*1000);
printf("Set FC Frequency = %d MHz, CL Frequency = %d MHz, PERIIPH Frequency = %d MHz\n",
pi_freq_get(PI_FREQ_DOMAIN_FC), pi_freq_get(PI_FREQ_DOMAIN_CL), pi_freq_get(PI_FREQ_DOMAIN_PERIPH));
#ifdef VOLTAGE
pi_pmu_voltage_set(PI_PMU_VOLTAGE_DOMAIN_CHIP, VOLTAGE);
pi_pmu_voltage_set(PI_PMU_VOLTAGE_DOMAIN_CHIP, VOLTAGE);
#endif
printf("Voltage: %dmV\n", pi_pmu_voltage_get(PI_PMU_VOLTAGE_DOMAIN_CHIP));
#endif
// IMPORTANT - MUST BE CALLED AFTER THE CLUSTER IS SWITCHED ON!!!!
printf("Constructor\n");
int ConstructorErr = efficientnet_liteCNN_Construct();
if (ConstructorErr)
{
printf("Graph constructor exited with error: %d\n(check the generated file efficientnet_liteKernels.c to see which memory have failed to be allocated)\n", ConstructorErr);
pmsis_exit(-6);
}
// Reading Image from Bridge
img_io_out_t type = IMGIO_OUTPUT_CHAR;
if (ReadImageFromFile(ImageName, IMAGE_SIZE, IMAGE_SIZE, 3, Input_1, IMAGE_SIZE*IMAGE_SIZE*3*sizeof(char), type, TRANSPOSE_2CHW)) {
printf("Failed to load image %s\n", ImageName);
pmsis_exit(-1);
}
#ifndef MODEL_NE16
printf("Subracting -128 to the input image to make it signed...\n");
for (int i=0; i<IMAGE_SIZE*IMAGE_SIZE*3; i++) Input_1[i] -= 128;
#endif
printf("Model:\t%s\n\n", __XSTR(MODEL_NAME));
#ifndef __EMUL__
struct pi_cluster_task task;
pi_cluster_task(&task, cluster, NULL);
pi_cluster_task_stacks(&task, NULL, SLAVE_STACK_SIZE);
pi_cluster_send_task_to_cl(&cluster_dev, &task);
#else
cluster();
#endif
efficientnet_liteCNN_Destruct();
#ifdef PERF
unsigned int TotalCycles = 0, TotalOper = 0;
{
printf("\n");
for (unsigned int i=0; i<(sizeof(AT_GraphPerf)/sizeof(unsigned int)); i++) {
TotalCycles += AT_GraphPerf[i]; TotalOper += AT_GraphOperInfosNames[i];
}
for (unsigned int i=0; i<(sizeof(AT_GraphPerf)/sizeof(unsigned int)); i++) {
printf("%45s: Cycles: %10u, Cyc%%: %5.1f%%, Operations: %10u, Op%%: %5.1f%%, Operations/Cycle: %f\n", AT_GraphNodeNames[i], AT_GraphPerf[i], 100*((float) (AT_GraphPerf[i]) / TotalCycles), AT_GraphOperInfosNames[i], 100*((float) (AT_GraphOperInfosNames[i]) / TotalOper), ((float) AT_GraphOperInfosNames[i])/ AT_GraphPerf[i]);
}
printf("\n");
printf("%45s: Cycles: %10u, Cyc%%: 100.0%%, Operations: %10u, Op%%: 100.0%%, Operations/Cycle: %f\n", "Total", TotalCycles, TotalOper, ((float) TotalOper)/ TotalCycles);
printf("\n");
}
#endif
if(outclass==CI_CLASS && MaxPrediction>15000) printf("Test successful!\n");
else {
printf("Wrong results!\n");
pmsis_exit(-1);
}
#if defined(PERF_CI) && defined(PERF)
if (TotalCycles > PERF_CI) {
printf("Error in CI for performance: we expected to be faster: %d > %d\n", TotalCycles, PERF_CI);
pmsis_exit(-1);
}
printf("Performance Regression passed\n");
#endif
printf("Ended\n");
pmsis_exit(0);
return 0;
}
int main(int argc, char *argv[])
{
printf("\n\n\t *** NNTOOL efficientnet_lite Example ***\n\n");
#ifdef __EMUL__
if (argc < 2)
{
PRINTF("Usage: efficientnet_lite [image_file]\n");
exit(-1);
}
ImageName = argv[1];
#else
ImageName = __XSTR(AT_IMAGE);
#endif
test_efficientnet_lite();
return 0;
}