Skip to content

Commit 142cef2

Browse files
author
Germain Haugou
committed
Added gvsoc script to handle verify step
1 parent 8c60065 commit 142cef2

File tree

4 files changed

+104
-22
lines changed

4 files changed

+104
-22
lines changed

sw/blas/axpy/src/axpy.h

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,27 @@ static inline void axpy_opt(uint32_t n, double a, double *x, double *y,
4343
int frac = n / snrt_cluster_compute_core_num();
4444
int offset = core_idx;
4545

46-
snrt_ssr_loop_1d(SNRT_SSR_DM_ALL, frac,
47-
snrt_cluster_compute_core_num() * sizeof(double));
48-
49-
snrt_ssr_read(SNRT_SSR_DM0, SNRT_SSR_1D, x + offset);
50-
snrt_ssr_read(SNRT_SSR_DM1, SNRT_SSR_1D, y + offset);
51-
snrt_ssr_write(SNRT_SSR_DM2, SNRT_SSR_1D, z + offset);
52-
53-
snrt_ssr_enable();
54-
55-
asm volatile(
56-
"frep.o %[n_frep], 1, 0, 0 \n"
57-
"fmadd.d ft2, %[a], ft0, ft1\n"
58-
:
59-
: [ n_frep ] "r"(frac - 1), [ a ] "f"(a)
60-
: "ft0", "ft1", "ft2", "memory");
61-
62-
snrt_fpu_fence();
63-
snrt_ssr_disable();
46+
for (int i=0; i<1; i++)
47+
{
48+
snrt_ssr_loop_1d(SNRT_SSR_DM_ALL, frac,
49+
snrt_cluster_compute_core_num() * sizeof(double));
50+
51+
snrt_ssr_read(SNRT_SSR_DM0, SNRT_SSR_1D, x + offset);
52+
snrt_ssr_read(SNRT_SSR_DM1, SNRT_SSR_1D, y + offset);
53+
snrt_ssr_write(SNRT_SSR_DM2, SNRT_SSR_1D, z + offset);
54+
55+
snrt_ssr_enable();
56+
57+
asm volatile(
58+
"frep.o %[n_frep], 1, 0, 0 \n"
59+
"fmadd.d ft2, %[a], ft0, ft1\n"
60+
:
61+
: [ n_frep ] "r"(frac - 1), [ a ] "f"(a)
62+
: "ft0", "ft1", "ft2", "memory");
63+
64+
snrt_fpu_fence();
65+
snrt_ssr_disable();
66+
}
6467
}
6568

6669
static inline void axpy_job(axpy_args_t *args) {
@@ -113,6 +116,8 @@ static inline void axpy_job(axpy_args_t *args) {
113116
iterations = args->n_tiles;
114117
if (DOUBLE_BUFFER) iterations += 2;
115118

119+
uint32_t cycles;
120+
116121
// Iterate over all tiles
117122
for (i = 0; i < iterations; i++) {
118123
if (snrt_is_dm_core()) {
@@ -167,7 +172,7 @@ static inline void axpy_job(axpy_args_t *args) {
167172
if (!DOUBLE_BUFFER) snrt_cluster_hw_barrier();
168173

169174
if (!DOUBLE_BUFFER || (i > 0 && i < (args->n_tiles + 1))) {
170-
snrt_mcycle();
175+
uint32_t start_cycle = snrt_mcycle();
171176

172177
// Compute tile and buffer indices
173178
i_compute = DOUBLE_BUFFER ? i - 1 : i;
@@ -178,7 +183,9 @@ static inline void axpy_job(axpy_args_t *args) {
178183
fp(frac, args->a, local_x[buff_idx], local_y[buff_idx],
179184
local_z[buff_idx]);
180185

181-
snrt_mcycle();
186+
uint32_t end_cycle = snrt_mcycle();
187+
188+
cycles = end_cycle - start_cycle;
182189
}
183190

184191
// Additional barrier required when not double buffering
@@ -188,4 +195,7 @@ static inline void axpy_job(axpy_args_t *args) {
188195
// Synchronize cores after every iteration
189196
snrt_cluster_hw_barrier();
190197
}
198+
199+
200+
printf("Cycles %d\n", cycles);
191201
}

sw/tests/simple.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,19 @@
22
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
33
// SPDX-License-Identifier: Apache-2.0
44

5-
int main() { return 0; }
5+
#include "snrt.h"
6+
7+
uint32_t buffer[32];
8+
9+
int main() {
10+
if (snrt_global_core_idx() != 8) return 0; // only DMA core
11+
uint32_t buffer_src[32], buffer_dst[32];
12+
for (int i = 0; i < 100; i++)
13+
{
14+
snrt_mcycle();
15+
snrt_dma_start_1d_wideptr(buffer_src, buffer_dst, 1);
16+
snrt_dma_wait_all();
17+
snrt_mcycle();
18+
}
19+
return 0;
20+
}

target/common/gvsoc.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ $(BIN_DIR)/$(TARGET).gvsoc:
1111
@echo ' GVSOC_TARGET=snitch' >> $@
1212
@echo 'fi' >> $@
1313
@echo 'gvsoc --target=$${GVSOC_TARGET} --binary $$binary \
14-
--control-script=$${path}/${GVSOC_BUILDDIR}/pulp/pulp/snitch/utils/gvcontrol.py $$2 run' >> $@
14+
--control-script=$${path}/../../util/sim/gvsoc_control.py $$2 run' >> $@
1515
@chmod +x $@
1616

1717
.PHONY: clean-gvsoc

util/sim/gvsoc_control.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python3
2+
3+
import time
4+
import gvsoc.gvsoc_control
5+
import threading
6+
import socket
7+
import struct
8+
9+
def parse_args(parser, args):
10+
parser.add_argument('--ipc', type=str,
11+
help="IPC socket files")
12+
13+
def handle_commands(gv, tx_fd, rx_fd):
14+
15+
axi = gvsoc.gvsoc_control.Router(gv, path='**/chip/soc/narrow_axi')
16+
17+
gv.run()
18+
19+
while True:
20+
data = rx_fd.read(8)
21+
if not data:
22+
return
23+
24+
command = struct.unpack('=Q', data)[0]
25+
26+
if command == 2:
27+
data = rx_fd.read(16)
28+
addr, mask32, exp32 = struct.unpack('=QLL', data)
29+
30+
retval = gv.join()
31+
data = struct.pack('=L', retval)
32+
tx_fd.write(data)
33+
34+
elif command == 0:
35+
data = rx_fd.read(16)
36+
addr, length = struct.unpack('=QQ', data)
37+
data = axi.mem_read(addr, length)
38+
tx_fd.write(data)
39+
40+
elif command == 1:
41+
data = rx_fd.read(16)
42+
addr, length = struct.unpack('=QQ', data)
43+
data = rx_fd.read(length)
44+
axi.mem_write(addr, data)
45+
data = struct.pack('=L', 0)
46+
tx_fd.write(data)
47+
pass
48+
49+
def target_control(args, gv=None):
50+
rx, tx = args.ipc.split(',')
51+
52+
rx_fd = open(rx, 'rb', buffering=0)
53+
tx_fd = open(tx, 'wb', buffering=0)
54+
55+
handle_commands(gv, tx_fd, rx_fd)
56+
57+
return 0

0 commit comments

Comments
 (0)