Skip to content

Commit 3fa1410

Browse files
committed
Update OSACA version to 0.7.0 and refactor RISC-V parser for improved instruction handling and normalization
1 parent 388982a commit 3fa1410

File tree

13 files changed

+1805
-523
lines changed

13 files changed

+1805
-523
lines changed

examples/add/Makefile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Makefile for RISC-V add example
2+
3+
CC = gcc
4+
CFLAGS = -O3
5+
CFLAGS_VEC = -O3 -march=rv64gcv
6+
7+
# Default target with -O3
8+
all: add_riscv add_riscv_vec
9+
10+
# Build with -O3 optimization
11+
add_riscv: add_riscv.c
12+
$(CC) $(CFLAGS) -o add_riscv add_riscv.c
13+
$(CC) $(CFLAGS) -S -o add_riscv.s add_riscv.c
14+
15+
# Build with vector extensions
16+
add_riscv_vec: add_riscv.c
17+
$(CC) $(CFLAGS_VEC) -o add_riscv_vec add_riscv.c
18+
$(CC) $(CFLAGS_VEC) -S -o add_riscv_vec.s add_riscv.c
19+
20+
# Clean up
21+
clean:
22+
rm -f add_riscv add_riscv_vec add_riscv.s add_riscv_vec.s
23+
24+
.PHONY: all clean

examples/add/add_riscv.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Vector add benchmark for RISC-V testing
2+
// a[i] = b[i] + c[i]
3+
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
7+
#define DTYPE double
8+
9+
void kernel(DTYPE* a, DTYPE* b, DTYPE* c, const int size)
10+
{
11+
// OSACA start marker will be added around this loop
12+
for(int i=0; i<size; i++) {
13+
a[i] = b[i] + c[i];
14+
}
15+
// OSACA end marker will be added
16+
}
17+
18+
int main(int argc, char *argv[]) {
19+
int size = 1000;
20+
if(argc > 1) {
21+
size = atoi(argv[1]);
22+
}
23+
24+
printf("RISC-V Vector add: a[i] = b[i] + c[i], size=%d\n", size);
25+
26+
// Allocate memory
27+
DTYPE* a = (DTYPE*)malloc(size * sizeof(DTYPE));
28+
DTYPE* b = (DTYPE*)malloc(size * sizeof(DTYPE));
29+
DTYPE* c = (DTYPE*)malloc(size * sizeof(DTYPE));
30+
31+
// Initialize arrays
32+
for(int i=0; i<size; i++) {
33+
a[i] = 0.0;
34+
b[i] = i;
35+
c[i] = i * 2.0;
36+
}
37+
38+
// Run kernel
39+
kernel(a, b, c, size);
40+
41+
// Check result (to prevent optimization)
42+
DTYPE checksum = 0.0;
43+
for(int i=0; i<size; i++) {
44+
checksum += a[i];
45+
}
46+
printf("Checksum: %f\n", checksum);
47+
48+
// Cleanup
49+
free(a);
50+
free(b);
51+
free(c);
52+
53+
return 0;
54+
}

examples/riscy_asm_files/add_riscv.s

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
.file "add_riscv.c"
2+
.option pic
3+
.attribute arch, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0"
4+
.attribute unaligned_access, 0
5+
.attribute stack_align, 16
6+
.text
7+
.align 1
8+
.globl kernel
9+
.type kernel, @function
10+
kernel:
11+
.LFB22:
12+
.cfi_startproc
13+
ble a3,zero,.L1
14+
slli a3,a3,3
15+
add a5,a1,a3
16+
.L3:
17+
fld fa5,0(a1)
18+
fld fa4,0(a2)
19+
addi a1,a1,8
20+
addi a2,a2,8
21+
fadd.d fa5,fa5,fa4
22+
addi a0,a0,8
23+
fsd fa5,-8(a0)
24+
bne a1,a5,.L3
25+
.L1:
26+
ret
27+
.cfi_endproc
28+
.LFE22:
29+
.size kernel, .-kernel
30+
.section .rodata.str1.8,"aMS",@progbits,1
31+
.align 3
32+
.LC0:
33+
.string "RISC-V Vector add: a[i] = b[i] + c[i], size=%d\n"
34+
.align 3
35+
.LC1:
36+
.string "Checksum: %f\n"
37+
.section .text.startup,"ax",@progbits
38+
.align 1
39+
.globl main
40+
.type main, @function
41+
main:
42+
.LFB23:
43+
.cfi_startproc
44+
addi sp,sp,-48
45+
.cfi_def_cfa_offset 48
46+
sd ra,40(sp)
47+
sd s0,32(sp)
48+
sd s1,24(sp)
49+
sd s2,16(sp)
50+
sd s3,8(sp)
51+
sd s4,0(sp)
52+
.cfi_offset 1, -8
53+
.cfi_offset 8, -16
54+
.cfi_offset 9, -24
55+
.cfi_offset 18, -32
56+
.cfi_offset 19, -40
57+
.cfi_offset 20, -48
58+
li a5,1
59+
bgt a0,a5,.L21
60+
li a1,1000
61+
lla a0,.LC0
62+
call printf@plt
63+
li a0,8192
64+
addi a0,a0,-192
65+
call malloc@plt
66+
mv s1,a0
67+
li a0,8192
68+
addi a0,a0,-192
69+
call malloc@plt
70+
mv s2,a0
71+
li a0,8192
72+
addi a0,a0,-192
73+
call malloc@plt
74+
li s0,8192
75+
mv s3,a0
76+
addi s0,s0,-192
77+
li s4,1000
78+
.L13:
79+
slli a5,s4,32
80+
srli a2,a5,29
81+
li a1,0
82+
mv a0,s1
83+
call memset@plt
84+
mv a4,s2
85+
mv a3,s2
86+
li a5,0
87+
.L9:
88+
fcvt.d.w fa5,a5
89+
mv a1,a5
90+
addiw a5,a5,1
91+
fsd fa5,0(a3)
92+
addi a3,a3,8
93+
bne a5,s4,.L9
94+
mv a2,s3
95+
mv a3,s3
96+
li a5,0
97+
.L10:
98+
fcvt.d.w fa5,a5
99+
mv a0,a5
100+
addi a3,a3,8
101+
fadd.d fa5,fa5,fa5
102+
addiw a5,a5,1
103+
fsd fa5,-8(a3)
104+
bne a0,a1,.L10
105+
mv a5,s1
106+
add a1,s2,s0
107+
mv a3,s1
108+
.L11:
109+
fld fa5,0(a4)
110+
fld fa4,0(a2)
111+
addi a4,a4,8
112+
addi a2,a2,8
113+
fadd.d fa5,fa5,fa4
114+
addi a3,a3,8
115+
fsd fa5,-8(a3)
116+
bne a4,a1,.L11
117+
fmv.d.x fa5,zero
118+
add s0,s1,s0
119+
.L12:
120+
fld fa4,0(a5)
121+
addi a5,a5,8
122+
fadd.d fa5,fa5,fa4
123+
bne a5,s0,.L12
124+
.L8:
125+
fmv.x.d a1,fa5
126+
lla a0,.LC1
127+
call printf@plt
128+
mv a0,s1
129+
call free@plt
130+
mv a0,s2
131+
call free@plt
132+
mv a0,s3
133+
call free@plt
134+
ld ra,40(sp)
135+
.cfi_remember_state
136+
.cfi_restore 1
137+
ld s0,32(sp)
138+
.cfi_restore 8
139+
ld s1,24(sp)
140+
.cfi_restore 9
141+
ld s2,16(sp)
142+
.cfi_restore 18
143+
ld s3,8(sp)
144+
.cfi_restore 19
145+
ld s4,0(sp)
146+
.cfi_restore 20
147+
li a0,0
148+
addi sp,sp,48
149+
.cfi_def_cfa_offset 0
150+
jr ra
151+
.L21:
152+
.cfi_restore_state
153+
ld a0,8(a1)
154+
li a2,10
155+
li a1,0
156+
call strtol@plt
157+
sext.w s4,a0
158+
mv a1,s4
159+
lla a0,.LC0
160+
call printf@plt
161+
slli s0,s4,3
162+
mv a0,s0
163+
call malloc@plt
164+
mv s1,a0
165+
mv a0,s0
166+
call malloc@plt
167+
mv s2,a0
168+
mv a0,s0
169+
call malloc@plt
170+
mv s3,a0
171+
bgt s4,zero,.L13
172+
fmv.d.x fa5,zero
173+
j .L8
174+
.cfi_endproc
175+
.LFE23:
176+
.size main, .-main
177+
.ident "GCC: (GNU) 14.2.1 20250207"
178+
.section .note.GNU-stack,"",@progbits

0 commit comments

Comments
 (0)