aboutsummaryrefslogtreecommitdiff
path: root/benchmarks/mm/hwacha.h
diff options
context:
space:
mode:
authorYunsup Lee <yunsup@cs.berkeley.edu>2014-04-14 21:15:15 -0700
committerYunsup Lee <yunsup@cs.berkeley.edu>2014-04-14 21:15:15 -0700
commit83ed3f519de9929b6551b98677047228a8ab4d0c (patch)
tree186fe4ed156de7b588d0dac720d544df771fe60f /benchmarks/mm/hwacha.h
parent8f6e2420926471a7bd9a660305ab3d6a22f22dc9 (diff)
downloadriscv-tests-83ed3f519de9929b6551b98677047228a8ab4d0c.zip
riscv-tests-83ed3f519de9929b6551b98677047228a8ab4d0c.tar.gz
riscv-tests-83ed3f519de9929b6551b98677047228a8ab4d0c.tar.bz2
commit high-performance mm (scalar and vector versions)
Diffstat (limited to 'benchmarks/mm/hwacha.h')
-rw-r--r--benchmarks/mm/hwacha.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/benchmarks/mm/hwacha.h b/benchmarks/mm/hwacha.h
new file mode 100644
index 0000000..c12d854
--- /dev/null
+++ b/benchmarks/mm/hwacha.h
@@ -0,0 +1,138 @@
+static const int HCBM = 18;
+static const int HCBN = 80;
+static const int HCBK = 16;
+
+static const int HRBM = 18;
+static const int HRBN = 80;
+static const int HRBK = 1;
+
+extern void hwacha_mm_0();
+extern void hwacha_mm_1();
+extern void hwacha_mm_2();
+extern void hwacha_mm_3();
+extern void hwacha_mm_4();
+extern void hwacha_mm_5();
+extern void hwacha_mm_6();
+extern void hwacha_mm_7();
+extern void hwacha_mm_8();
+extern void hwacha_mm_9();
+extern void hwacha_mm_10();
+extern void hwacha_mm_11();
+extern void hwacha_mm_12();
+extern void hwacha_mm_13();
+extern void hwacha_mm_14();
+extern void hwacha_mm_15();
+extern void hwacha_mm_16();
+extern void hwacha_mm_17();
+
+static inline void nloop(int s, int e, t* a, size_t lda, t* b, size_t ldb, t* c, size_t ldc)
+{
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[0*lda]));
+ asm volatile ("vfld vf20, %[ptr]" : : [ptr]"r"(b) : );
+ if (s) asm volatile ("vfld vf0, %[ptr]" : : [ptr]"r"(&c[ldc*0]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_0) : );
+ if (e) asm volatile ("vfsd vf0, %[ptr]" : : [ptr]"r"(&c[ldc*0]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[1*lda]));
+ if (s) asm volatile ("vfld vf1, %[ptr]" : : [ptr]"r"(&c[ldc*1]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_1) : );
+ if (e) asm volatile ("vfsd vf1, %[ptr]" : : [ptr]"r"(&c[ldc*1]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[2*lda]));
+ if (s) asm volatile ("vfld vf2, %[ptr]" : : [ptr]"r"(&c[ldc*2]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_2) : );
+ if (e) asm volatile ("vfsd vf2, %[ptr]" : : [ptr]"r"(&c[ldc*2]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[3*lda]));
+ if (s) asm volatile ("vfld vf3, %[ptr]" : : [ptr]"r"(&c[ldc*3]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_3) : );
+ if (e) asm volatile ("vfsd vf3, %[ptr]" : : [ptr]"r"(&c[ldc*3]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[4*lda]));
+ if (s) asm volatile ("vfld vf4, %[ptr]" : : [ptr]"r"(&c[ldc*4]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_4) : );
+ if (e) asm volatile ("vfsd vf4, %[ptr]" : : [ptr]"r"(&c[ldc*4]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[5*lda]));
+ if (s) asm volatile ("vfld vf5, %[ptr]" : : [ptr]"r"(&c[ldc*5]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_5) : );
+ if (e) asm volatile ("vfsd vf5, %[ptr]" : : [ptr]"r"(&c[ldc*5]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[6*lda]));
+ if (s) asm volatile ("vfld vf6, %[ptr]" : : [ptr]"r"(&c[ldc*6]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_6) : );
+ if (e) asm volatile ("vfsd vf6, %[ptr]" : : [ptr]"r"(&c[ldc*6]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[7*lda]));
+ if (s) asm volatile ("vfld vf7, %[ptr]" : : [ptr]"r"(&c[ldc*7]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_7) : );
+ if (e) asm volatile ("vfsd vf7, %[ptr]" : : [ptr]"r"(&c[ldc*7]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[8*lda]));
+ if (s) asm volatile ("vfld vf8, %[ptr]" : : [ptr]"r"(&c[ldc*8]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_8) : );
+ if (e) asm volatile ("vfsd vf8, %[ptr]" : : [ptr]"r"(&c[ldc*8]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[9*lda]));
+ if (s) asm volatile ("vfld vf9, %[ptr]" : : [ptr]"r"(&c[ldc*9]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_9) : );
+ if (e) asm volatile ("vfsd vf9, %[ptr]" : : [ptr]"r"(&c[ldc*9]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[10*lda]));
+ if (s) asm volatile ("vfld vf10, %[ptr]" : : [ptr]"r"(&c[ldc*10]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_10) : );
+ if (e) asm volatile ("vfsd vf10, %[ptr]" : : [ptr]"r"(&c[ldc*10]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[11*lda]));
+ if (s) asm volatile ("vfld vf11, %[ptr]" : : [ptr]"r"(&c[ldc*11]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_11) : );
+ if (e) asm volatile ("vfsd vf11, %[ptr]" : : [ptr]"r"(&c[ldc*11]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[12*lda]));
+ if (s) asm volatile ("vfld vf12, %[ptr]" : : [ptr]"r"(&c[ldc*12]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_12) : );
+ if (e) asm volatile ("vfsd vf12, %[ptr]" : : [ptr]"r"(&c[ldc*12]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[13*lda]));
+ if (s) asm volatile ("vfld vf13, %[ptr]" : : [ptr]"r"(&c[ldc*13]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_13) : );
+ if (e) asm volatile ("vfsd vf13, %[ptr]" : : [ptr]"r"(&c[ldc*13]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[14*lda]));
+ if (s) asm volatile ("vfld vf14, %[ptr]" : : [ptr]"r"(&c[ldc*14]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_14) : );
+ if (e) asm volatile ("vfsd vf14, %[ptr]" : : [ptr]"r"(&c[ldc*14]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[15*lda]));
+ if (s) asm volatile ("vfld vf15, %[ptr]" : : [ptr]"r"(&c[ldc*15]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_15) : );
+ if (e) asm volatile ("vfsd vf15, %[ptr]" : : [ptr]"r"(&c[ldc*15]) : );
+
+ asm volatile ("vfmsv.d vf19, %[ptr]" : : [ptr]"r"(a[16*lda]));
+ if (s) asm volatile ("vfld vf16, %[ptr]" : : [ptr]"r"(&c[ldc*16]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_16) : );
+ if (e) asm volatile ("vfsd vf16, %[ptr]" : : [ptr]"r"(&c[ldc*16]) : );
+
+ asm volatile ("vfmsv.d vf18, %[ptr]" : : [ptr]"r"(a[17*lda]));
+ if (s) asm volatile ("vfld vf17, %[ptr]" : : [ptr]"r"(&c[ldc*17]) : );
+ asm volatile ("vf 0(%[vf_ptr])" : : [vf_ptr]"r"(&hwacha_mm_17) : );
+ if (e) asm volatile ("vfsd vf17, %[ptr]" : : [ptr]"r"(&c[ldc*17]) : );
+}
+
+static inline void mm_rb_hwacha(size_t m, size_t n, size_t p,
+ t* a, size_t lda, t* b, size_t ldb, t* c, size_t ldc)
+{
+ int vl;
+ asm volatile ("vsetcfg 4, 21" : : : );
+ asm volatile ("vsetvl %[gvl], %[nvl]" : [gvl]"=r"(vl) : [nvl]"r"(n) : );
+
+ size_t mb = m/HRBM*HRBM, nk=p/HRBK*HRBK;
+
+ for (size_t i=0; i<mb; i+=HRBM)
+ {
+ for (size_t k=0; k<nk; k+=HRBK)
+ {
+ nloop(k==0, k==(p-1), a+i*lda+k, lda, b+k*ldb, ldb, c+i*ldc, ldc);
+ }
+ }
+}