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.
99 lines
2.9 KiB
99 lines
2.9 KiB
#include "../thneed.h"
|
|
#include "../../runners/snpemodel.h"
|
|
|
|
#define TEMPORAL_SIZE 512
|
|
#define DESIRE_LEN 8
|
|
#define TRAFFIC_CONVENTION_LEN 2
|
|
|
|
void hexdump(uint32_t *d, int len);
|
|
|
|
int main(int argc, char* argv[]) {
|
|
#define OUTPUT_SIZE 0x10000
|
|
float *output = (float*)calloc(OUTPUT_SIZE, sizeof(float));
|
|
float *golden = (float*)calloc(OUTPUT_SIZE, sizeof(float));
|
|
SNPEModel mdl(argv[1], output, 0, USE_GPU_RUNTIME);
|
|
|
|
// cmd line test
|
|
if (argc > 2) {
|
|
for (int i = 2; i < argc; i++) {
|
|
float *buf[5];
|
|
FILE *f = fopen(argv[i], "rb");
|
|
|
|
size_t sz;
|
|
for (int j = 0; j < 5; j++) {
|
|
fread(&sz, 1, sizeof(sz), f);
|
|
printf("reading %zu\n", sz);
|
|
buf[j] = (float*)malloc(sz);
|
|
fread(buf[j], 1, sz, f);
|
|
}
|
|
|
|
if (sz != 9532) continue;
|
|
|
|
mdl.addRecurrent(buf[0], TEMPORAL_SIZE);
|
|
mdl.addTrafficConvention(buf[1], TRAFFIC_CONVENTION_LEN);
|
|
mdl.addDesire(buf[2], DESIRE_LEN);
|
|
mdl.execute(buf[3], 0);
|
|
|
|
hexdump((uint32_t*)buf[4], 0x100);
|
|
hexdump((uint32_t*)output, 0x100);
|
|
|
|
for (int j = 0; j < sz/4; j++) {
|
|
if (buf[4][j] != output[j]) {
|
|
printf("MISMATCH %d real:%f comp:%f\n", j, buf[4][j], output[j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
float state[TEMPORAL_SIZE];
|
|
mdl.addRecurrent(state, TEMPORAL_SIZE);
|
|
|
|
float desire[DESIRE_LEN];
|
|
mdl.addDesire(desire, DESIRE_LEN);
|
|
|
|
float traffic_convention[TRAFFIC_CONVENTION_LEN];
|
|
mdl.addTrafficConvention(traffic_convention, TRAFFIC_CONVENTION_LEN);
|
|
|
|
float *input = (float*)calloc(0x1000000, sizeof(float));;
|
|
|
|
// first run
|
|
printf("************** execute 1 **************\n");
|
|
memset(output, 0, OUTPUT_SIZE * sizeof(float));
|
|
mdl.execute(input, 0);
|
|
hexdump((uint32_t *)output, 0x100);
|
|
memcpy(golden, output, OUTPUT_SIZE * sizeof(float));
|
|
|
|
// second run
|
|
printf("************** execute 2 **************\n");
|
|
memset(output, 0, OUTPUT_SIZE * sizeof(float));
|
|
Thneed *t = new Thneed();
|
|
t->record = 7; // debug print with record
|
|
mdl.execute(input, 0);
|
|
t->stop();
|
|
hexdump((uint32_t *)output, 0x100);
|
|
if (memcmp(golden, output, OUTPUT_SIZE * sizeof(float)) != 0) { printf("FAILURE\n"); return -1; }
|
|
|
|
// third run
|
|
printf("************** execute 3 **************\n");
|
|
memset(output, 0, OUTPUT_SIZE * sizeof(float));
|
|
t->record = 2; // debug print w/o record
|
|
float *inputs[4] = {state, traffic_convention, desire, input};
|
|
t->execute(inputs, output, true);
|
|
hexdump((uint32_t *)output, 0x100);
|
|
if (memcmp(golden, output, OUTPUT_SIZE * sizeof(float)) != 0) { printf("FAILURE\n"); return -1; }
|
|
|
|
printf("************** execute 4 **************\n");
|
|
while (1) {
|
|
memset(output, 0, OUTPUT_SIZE * sizeof(float));
|
|
//t->record = 2; // debug print w/o record
|
|
t->execute(inputs, output);
|
|
hexdump((uint32_t *)output, 0x100);
|
|
if (memcmp(golden, output, OUTPUT_SIZE * sizeof(float)) != 0) { printf("FAILURE\n"); return -1; }
|
|
break;
|
|
}
|
|
|
|
printf("************** execute done **************\n");
|
|
}
|
|
|
|
|