summaryrefslogtreecommitdiff
path: root/src/app/stream/main.cc
blob: 6fe99bcdcf0779231b230344c23b7a4e5e66e224 (plain)
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
/*
 * Copyright 2020 Birte Kristina Friesel
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */
#include "arch.h"
#include "driver/gpio.h"
#include "driver/stdout.h"
#include "driver/counter.h"
#include <stdlib.h>

#define XSTR(x) STR(x)
#define STR(x) #x

static const auto input_size = CONFIG_app_stream_n_elements;
static const auto stride = CONFIG_app_stream_stride;
typedef CONFIG_app_stream_type T;
static T A[input_size];
static T B[input_size];
static T scale;
static T X[input_size];
static T check;

int main(void)
{
	uint16_t i;
	arch.setup();
	gpio.setup();
	kout.setup();

	scale = rand();
	for (i = 0; i < input_size; i++) {
		A[i] = (T)rand();
		B[i] = (T)rand();
		X[i] = (T)0;
	}

	while (1) {
		check = 0;
		/*
		 * Copy
		 */
		counter.start();
		for (i = 0; i < input_size; i += stride) {
			X[i] = A[i];
		}
		counter.stop();

		kout << "[::] STREAM COPY";
		kout << " | n_elements=" << input_size << " e_type=" << XSTR(CONFIG_app_stream_type) << " elem_B=" << sizeof(T) << " n_stride=" << stride;
		kout << " | latency_us=" << counter.value << "/" << counter.overflow;
		kout << endl;

		for (i = 0; i < input_size; i++) {
			check = (uint16_t)check ^ (uint16_t)X[i];
		}

		/*
		 * Scale
		 */
		counter.start();
		for (i = 0; i < input_size; i += stride) {
			X[i] = scale * A[i];
		}
		counter.stop();

		kout << "[::] STREAM SCALE";
		kout << " | n_elements=" << input_size << " e_type=" << XSTR(CONFIG_app_stream_type) << " elem_B=" << sizeof(T) << " n_stride=" << stride;
		kout << " | latency_us=" << counter.value << "/" << counter.overflow;
		kout << endl;

		for (i = 0; i < input_size; i++) {
			check = (uint16_t)check ^ (uint16_t)X[i];
		}

		/*
		 * Add
		 */
		counter.start();
		for (i = 0; i < input_size; i += stride) {
			X[i] = A[i] + B[i];
		}
		counter.stop();

		kout << "[::] STREAM ADD";
		kout << " | n_elements=" << input_size << " e_type=" << XSTR(CONFIG_app_stream_type) << " elem_B=" << sizeof(T) << " n_stride=" << stride;
		kout << " | latency_us=" << counter.value << "/" << counter.overflow;
		kout << endl;

		for (i = 0; i < input_size; i++) {
			check = (uint16_t)check ^ (uint16_t)X[i];
		}

		/*
		 * Triad
		 */
		counter.start();
		for (i = 0; i < input_size; i += stride) {
			X[i] = A[i] + scale * B[i];
		}
		counter.stop();

		kout << "[::] STREAM TRIAD";
		kout << " | n_elements=" << input_size << " e_type=" << XSTR(CONFIG_app_stream_type) << " elem_B=" << sizeof(T) << " n_stride=" << stride;
		kout << " | latency_us=" << counter.value << "/" << counter.overflow;
		kout << endl;

		for (i = 0; i < input_size; i++) {
			check = (uint16_t)check ^ (uint16_t)X[i];
		}

		/*
		 * Avoid optimizations
		 */
		kout << "// " << check << endl;
	}

	return 0;
}