[Samples] Update all polybench samples

This commit is contained in:
Hanchen Ye 2021-11-12 02:09:50 -06:00
parent 2fdba859f7
commit 22e59877cb
64 changed files with 67 additions and 1086 deletions

View File

@ -36,14 +36,14 @@ $ export PYTHONPATH=$PYTHONPATH:$PWD/build/tools/scalehls/python_packages/scaleh
### Try ScaleHLS ### Try ScaleHLS
To launch the automatic kernel-level design space exploration, run: To launch the automatic kernel-level design space exploration, run:
```sh ```sh
$ mlir-clang samples/polybench/gemm/gemm_32.c -function=gemm_32 -memref-fullrank -raise-scf-to-affine -S \ $ mlir-clang samples/polybench/gemm/test_gemm.c -function=test_gemm -memref-fullrank -raise-scf-to-affine -S \
| scalehls-opt -dse="top-func=gemm_32 target-spec=samples/polybench/target-spec.ini" -debug-only=scalehls > /dev/null \ | scalehls-opt -dse="top-func=test_gemm target-spec=samples/polybench/target-spec.ini" -debug-only=scalehls > /dev/null \
&& scalehls-translate -emit-hlscpp gemm_32_pareto_0.mlir > gemm_32_pareto_0.cpp && scalehls-translate -emit-hlscpp test_gemm_pareto_0.mlir > test_gemm_pareto_0.cpp
``` ```
Meanwhile, we provide a `pyscalehls` tool to showcase the `scalehls` Python library: Meanwhile, we provide a `pyscalehls` tool to showcase the `scalehls` Python library:
```sh ```sh
$ pyscalehls.py samples/polybench/syrk/syrk_32.c -f syrk_32 $ pyscalehls.py samples/polybench/syrk/test_syrk.c -f test_syrk
``` ```
## Integration with ONNX-MLIR ## Integration with ONNX-MLIR

View File

@ -1,19 +1,8 @@
#!/bin/bash #!/bin/bash
# This test is deprecated and will be removed soon!!
# Please run: source ablation_flt_test.sh -m resnet18 -n 15 -c 0 # Please run: source ablation_flt_test.sh -m resnet18 -n 15 -c 0
# cd samples/onnx-mlir-1/ && source ablation_flt_test.sh -m mobilenet -n 15 -c 0
# cd samples/onnx-mlir-1/ && source ablation_flt_test.sh -m resnet18 -n 15 -c 0
# cd samples/onnx-mlir-1/ && source ablation_flt_test.sh -m vgg16 -n 15 -c 0
# cd samples/onnx-mlir-2/ && source ablation_flt_test.sh -m mobilenet -n 15 -c 0
# cd samples/onnx-mlir-2/ && source ablation_flt_test.sh -m resnet18 -n 15 -c 0
# cd samples/onnx-mlir-2/ && source ablation_flt_test.sh -m vgg16 -n 15 -c 0
# cd samples/onnx-mlir-3/ && source ablation_flt_test.sh -m mobilenet -n 15 -c 0
# cd samples/onnx-mlir-3/ && source ablation_flt_test.sh -m resnet18 -n 15 -c 0
# cd samples/onnx-mlir-3/ && source ablation_flt_test.sh -m vgg16 -n 15 -c 0
# Script options. # Script options.
while getopts 'm:n:c:' opt while getopts 'm:n:c:' opt
do do

View File

@ -1,19 +1,8 @@
#!/bin/bash #!/bin/bash
# This test is deprecated and will be removed soon!!
# Please run: source ablation_int_test.sh -m resnet18 -n 17 -c 0 # Please run: source ablation_int_test.sh -m resnet18 -n 17 -c 0
# cd samples/onnx-mlir-1/ && source ablation_int_test.sh -m mobilenet -n 17 -c 0
# cd samples/onnx-mlir-1/ && source ablation_int_test.sh -m resnet18 -n 17 -c 0
# cd samples/onnx-mlir-1/ && source ablation_int_test.sh -m vgg16 -n 17 -c 0
# cd samples/onnx-mlir-2/ && source ablation_int_test.sh -m mobilenet -n 17 -c 0
# cd samples/onnx-mlir-2/ && source ablation_int_test.sh -m resnet18 -n 17 -c 0
# cd samples/onnx-mlir-2/ && source ablation_int_test.sh -m vgg16 -n 17 -c 0
# cd samples/onnx-mlir-3/ && source ablation_int_test.sh -m mobilenet -n 17 -c 0
# cd samples/onnx-mlir-3/ && source ablation_int_test.sh -m resnet18 -n 17 -c 0
# cd samples/onnx-mlir-3/ && source ablation_int_test.sh -m vgg16 -n 17 -c 0
# Script options. # Script options.
while getopts 'm:n:c:' opt while getopts 'm:n:c:' opt
do do

View File

@ -1,18 +0,0 @@
func @bicg_1024(%A: memref<1024x1024xf32>, %s: memref<1024xf32>, %q: memref<1024xf32>, %p: memref<1024xf32>, %r: memref<1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to 1024 {
%0 = affine.load %s[%j] : memref<1024xf32>
%1 = affine.load %r[%i] : memref<1024xf32>
%2 = affine.load %A[%i, %j] : memref<1024x1024xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<1024xf32>
%5 = affine.load %q[%i] : memref<1024xf32>
%6 = affine.load %p[%j] : memref<1024xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<1024xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_128(%A: memref<128x128xf32>, %s: memref<128xf32>, %q: memref<128xf32>, %p: memref<128xf32>, %r: memref<128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to 128 {
%0 = affine.load %s[%j] : memref<128xf32>
%1 = affine.load %r[%i] : memref<128xf32>
%2 = affine.load %A[%i, %j] : memref<128x128xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<128xf32>
%5 = affine.load %q[%i] : memref<128xf32>
%6 = affine.load %p[%j] : memref<128xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<128xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_2048(%A: memref<2048x2048xf32>, %s: memref<2048xf32>, %q: memref<2048xf32>, %p: memref<2048xf32>, %r: memref<2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to 2048 {
%0 = affine.load %s[%j] : memref<2048xf32>
%1 = affine.load %r[%i] : memref<2048xf32>
%2 = affine.load %A[%i, %j] : memref<2048x2048xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<2048xf32>
%5 = affine.load %q[%i] : memref<2048xf32>
%6 = affine.load %p[%j] : memref<2048xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<2048xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_256(%A: memref<256x256xf32>, %s: memref<256xf32>, %q: memref<256xf32>, %p: memref<256xf32>, %r: memref<256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to 256 {
%0 = affine.load %s[%j] : memref<256xf32>
%1 = affine.load %r[%i] : memref<256xf32>
%2 = affine.load %A[%i, %j] : memref<256x256xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<256xf32>
%5 = affine.load %q[%i] : memref<256xf32>
%6 = affine.load %p[%j] : memref<256xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<256xf32>
}
}
return
}

View File

@ -1,11 +0,0 @@
void bicg_32(float A[32][32], float s[32], float q[32], float p[32],
float r[32]) {
#pragma scop
for (int i = 0; i < 32; i += 1) {
for (int j = 0; j < 32; j += 1) {
s[j] += A[i][j] * r[i];
q[i] += A[i][j] * p[j];
}
}
#pragma endscop
}

View File

@ -1,18 +0,0 @@
func @bicg_32(%A: memref<32x32xf32>, %s: memref<32xf32>, %q: memref<32xf32>, %p: memref<32xf32>, %r: memref<32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to 32 {
%0 = affine.load %s[%j] : memref<32xf32>
%1 = affine.load %r[%i] : memref<32xf32>
%2 = affine.load %A[%i, %j] : memref<32x32xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<32xf32>
%5 = affine.load %q[%i] : memref<32xf32>
%6 = affine.load %p[%j] : memref<32xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<32xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_4096(%A: memref<4096x4096xf32>, %s: memref<4096xf32>, %q: memref<4096xf32>, %p: memref<4096xf32>, %r: memref<4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to 4096 {
%0 = affine.load %s[%j] : memref<4096xf32>
%1 = affine.load %r[%i] : memref<4096xf32>
%2 = affine.load %A[%i, %j] : memref<4096x4096xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<4096xf32>
%5 = affine.load %q[%i] : memref<4096xf32>
%6 = affine.load %p[%j] : memref<4096xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<4096xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_512(%A: memref<512x512xf32>, %s: memref<512xf32>, %q: memref<512xf32>, %p: memref<512xf32>, %r: memref<512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to 512 {
%0 = affine.load %s[%j] : memref<512xf32>
%1 = affine.load %r[%i] : memref<512xf32>
%2 = affine.load %A[%i, %j] : memref<512x512xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<512xf32>
%5 = affine.load %q[%i] : memref<512xf32>
%6 = affine.load %p[%j] : memref<512xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<512xf32>
}
}
return
}

View File

@ -1,18 +0,0 @@
func @bicg_64(%A: memref<64x64xf32>, %s: memref<64xf32>, %q: memref<64xf32>, %p: memref<64xf32>, %r: memref<64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to 64 {
%0 = affine.load %s[%j] : memref<64xf32>
%1 = affine.load %r[%i] : memref<64xf32>
%2 = affine.load %A[%i, %j] : memref<64x64xf32>
%3 = mulf %1, %2 : f32
%4 = addf %0, %3 : f32
affine.store %4, %s[%j] : memref<64xf32>
%5 = affine.load %q[%i] : memref<64xf32>
%6 = affine.load %p[%j] : memref<64xf32>
%7 = mulf %2, %6 : f32
%8 = addf %5, %7 : f32
affine.store %8, %q[%i] : memref<64xf32>
}
}
return
}

View File

@ -0,0 +1,11 @@
#define N 32
void test_bicg(float A[N][N], float s[N], float q[N], float p[N], float r[N]) {
#pragma scop
for (int i = 0; i < N; i += 1) {
for (int j = 0; j < N; j += 1) {
s[j] += A[i][j] * r[i];
q[i] += A[i][j] * p[j];
}
}
#pragma endscop
}

View File

@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
# This test is deprecated and will be removed soon!!
# This test is deprecated!
# Script options. # Script options.
while getopts 'm:c:' opt while getopts 'm:c:' opt

View File

@ -1,14 +1,8 @@
#!/bin/bash #!/bin/bash
# This test is deprecated and will be removed soon!!
# Please run: source dse_scale_test.sh -m gemm -c 0 # Please run: source dse_scale_test.sh -m gemm -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m bicg -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m gemm -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m gesummv -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m syrk -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m syr2k -c 0
# cd samples/polybench/ && source dse_scale_test.sh -m trmm -c 0
# Script options. # Script options.
while getopts 'm:c:' opt while getopts 'm:c:' opt
do do

View File

@ -1,19 +0,0 @@
func @gemm_1024(%alpha: f32, %beta: f32, %C: memref<1024x1024xf32>, %A: memref<1024x1024xf32>, %B: memref<1024x1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to 1024 {
%0 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<1024x1024xf32>
affine.for %k = 0 to 1024 {
%2 = affine.load %A[%i, %k] : memref<1024x1024xf32>
%3 = affine.load %B[%k, %j] : memref<1024x1024xf32>
%4 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<1024x1024xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_128(%alpha: f32, %beta: f32, %C: memref<128x128xf32>, %A: memref<128x128xf32>, %B: memref<128x128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to 128 {
%0 = affine.load %C[%i, %j] : memref<128x128xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<128x128xf32>
affine.for %k = 0 to 128 {
%2 = affine.load %A[%i, %k] : memref<128x128xf32>
%3 = affine.load %B[%k, %j] : memref<128x128xf32>
%4 = affine.load %C[%i, %j] : memref<128x128xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<128x128xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_2048(%alpha: f32, %beta: f32, %C: memref<2048x2048xf32>, %A: memref<2048x2048xf32>, %B: memref<2048x2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to 2048 {
%0 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<2048x2048xf32>
affine.for %k = 0 to 2048 {
%2 = affine.load %A[%i, %k] : memref<2048x2048xf32>
%3 = affine.load %B[%k, %j] : memref<2048x2048xf32>
%4 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<2048x2048xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_256(%alpha: f32, %beta: f32, %C: memref<256x256xf32>, %A: memref<256x256xf32>, %B: memref<256x256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to 256 {
%0 = affine.load %C[%i, %j] : memref<256x256xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<256x256xf32>
affine.for %k = 0 to 256 {
%2 = affine.load %A[%i, %k] : memref<256x256xf32>
%3 = affine.load %B[%k, %j] : memref<256x256xf32>
%4 = affine.load %C[%i, %j] : memref<256x256xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<256x256xf32>
}
}
}
return
}

View File

@ -1,13 +0,0 @@
void gemm_32(float alpha, float beta, float C[32][32], float A[32][32],
float B[32][32]) {
#pragma scop
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
C[i][j] *= beta;
for (int k = 0; k < 32; k++) {
C[i][j] += alpha * A[i][k] * B[k][j];
}
}
}
#pragma endscop
}

View File

@ -1,19 +0,0 @@
func @gemm_32(%alpha: f32, %beta: f32, %C: memref<32x32xf32>, %A: memref<32x32xf32>, %B: memref<32x32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to 32 {
%0 = affine.load %C[%i, %j] : memref<32x32xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<32x32xf32>
affine.for %k = 0 to 32 {
%2 = affine.load %A[%i, %k] : memref<32x32xf32>
%3 = affine.load %B[%k, %j] : memref<32x32xf32>
%4 = affine.load %C[%i, %j] : memref<32x32xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<32x32xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_4096(%alpha: f32, %beta: f32, %C: memref<4096x4096xf32>, %A: memref<4096x4096xf32>, %B: memref<4096x4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to 4096 {
%0 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<4096x4096xf32>
affine.for %k = 0 to 4096 {
%2 = affine.load %A[%i, %k] : memref<4096x4096xf32>
%3 = affine.load %B[%k, %j] : memref<4096x4096xf32>
%4 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<4096x4096xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_512(%alpha: f32, %beta: f32, %C: memref<512x512xf32>, %A: memref<512x512xf32>, %B: memref<512x512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to 512 {
%0 = affine.load %C[%i, %j] : memref<512x512xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<512x512xf32>
affine.for %k = 0 to 512 {
%2 = affine.load %A[%i, %k] : memref<512x512xf32>
%3 = affine.load %B[%k, %j] : memref<512x512xf32>
%4 = affine.load %C[%i, %j] : memref<512x512xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<512x512xf32>
}
}
}
return
}

View File

@ -1,19 +0,0 @@
func @gemm_64(%alpha: f32, %beta: f32, %C: memref<64x64xf32>, %A: memref<64x64xf32>, %B: memref<64x64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to 64 {
%0 = affine.load %C[%i, %j] : memref<64x64xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<64x64xf32>
affine.for %k = 0 to 64 {
%2 = affine.load %A[%i, %k] : memref<64x64xf32>
%3 = affine.load %B[%k, %j] : memref<64x64xf32>
%4 = affine.load %C[%i, %j] : memref<64x64xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<64x64xf32>
}
}
}
return
}

View File

@ -0,0 +1,14 @@
#define N 32
void test_gemm(float alpha, float beta, float C[N][N], float A[N][N],
float B[N][N]) {
#pragma scop
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
C[i][j] *= beta;
for (int k = 0; k < N; k++) {
C[i][j] += alpha * A[i][k] * B[k][j];
}
}
}
#pragma endscop
}

View File

@ -1,25 +0,0 @@
func @gesummv_1024(%alpha: f32, %beta: f32, %A: memref<1024x1024xf32>, %B: memref<1024x1024xf32>, %tmp: memref<1024xf32>, %x: memref<1024xf32>, %y: memref<1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to 1024 {
%0 = affine.load %A[%i, %j] : memref<1024x1024xf32>
%1 = affine.load %x[%j] : memref<1024xf32>
%2 = affine.load %tmp[%i] : memref<1024xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<1024xf32>
%5 = affine.load %B[%i, %j] : memref<1024x1024xf32>
%6 = affine.load %x[%j] : memref<1024xf32>
%7 = affine.load %y[%i] : memref<1024xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<1024xf32>
}
%10 = affine.load %tmp[%i] : memref<1024xf32>
%11 = affine.load %y[%i] : memref<1024xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<1024xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_128(%alpha: f32, %beta: f32, %A: memref<128x128xf32>, %B: memref<128x128xf32>, %tmp: memref<128xf32>, %x: memref<128xf32>, %y: memref<128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to 128 {
%0 = affine.load %A[%i, %j] : memref<128x128xf32>
%1 = affine.load %x[%j] : memref<128xf32>
%2 = affine.load %tmp[%i] : memref<128xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<128xf32>
%5 = affine.load %B[%i, %j] : memref<128x128xf32>
%6 = affine.load %x[%j] : memref<128xf32>
%7 = affine.load %y[%i] : memref<128xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<128xf32>
}
%10 = affine.load %tmp[%i] : memref<128xf32>
%11 = affine.load %y[%i] : memref<128xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<128xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_2048(%alpha: f32, %beta: f32, %A: memref<2048x2048xf32>, %B: memref<2048x2048xf32>, %tmp: memref<2048xf32>, %x: memref<2048xf32>, %y: memref<2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to 2048 {
%0 = affine.load %A[%i, %j] : memref<2048x2048xf32>
%1 = affine.load %x[%j] : memref<2048xf32>
%2 = affine.load %tmp[%i] : memref<2048xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<2048xf32>
%5 = affine.load %B[%i, %j] : memref<2048x2048xf32>
%6 = affine.load %x[%j] : memref<2048xf32>
%7 = affine.load %y[%i] : memref<2048xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<2048xf32>
}
%10 = affine.load %tmp[%i] : memref<2048xf32>
%11 = affine.load %y[%i] : memref<2048xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<2048xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_256(%alpha: f32, %beta: f32, %A: memref<256x256xf32>, %B: memref<256x256xf32>, %tmp: memref<256xf32>, %x: memref<256xf32>, %y: memref<256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to 256 {
%0 = affine.load %A[%i, %j] : memref<256x256xf32>
%1 = affine.load %x[%j] : memref<256xf32>
%2 = affine.load %tmp[%i] : memref<256xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<256xf32>
%5 = affine.load %B[%i, %j] : memref<256x256xf32>
%6 = affine.load %x[%j] : memref<256xf32>
%7 = affine.load %y[%i] : memref<256xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<256xf32>
}
%10 = affine.load %tmp[%i] : memref<256xf32>
%11 = affine.load %y[%i] : memref<256xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<256xf32>
}
return
}

View File

@ -1,12 +0,0 @@
void gesummv_32(float alpha, float beta, float A[32][32], float B[32][32],
float tmp[32], float x[32], float y[32]) {
#pragma scop
for (int i = 0; i < 32; i += 1) {
for (int j = 0; j < 32; j += 1) {
tmp[i] += A[i][j] * x[j];
y[i] += B[i][j] * x[j];
}
y[i] = alpha * tmp[i] + beta * y[i];
}
#pragma endscop
}

View File

@ -1,25 +0,0 @@
func @gesummv_32(%alpha: f32, %beta: f32, %A: memref<32x32xf32>, %B: memref<32x32xf32>, %tmp: memref<32xf32>, %x: memref<32xf32>, %y: memref<32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to 32 {
%0 = affine.load %A[%i, %j] : memref<32x32xf32>
%1 = affine.load %x[%j] : memref<32xf32>
%2 = affine.load %tmp[%i] : memref<32xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<32xf32>
%5 = affine.load %B[%i, %j] : memref<32x32xf32>
%6 = affine.load %x[%j] : memref<32xf32>
%7 = affine.load %y[%i] : memref<32xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<32xf32>
}
%10 = affine.load %tmp[%i] : memref<32xf32>
%11 = affine.load %y[%i] : memref<32xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<32xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_4096(%alpha: f32, %beta: f32, %A: memref<4096x4096xf32>, %B: memref<4096x4096xf32>, %tmp: memref<4096xf32>, %x: memref<4096xf32>, %y: memref<4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to 4096 {
%0 = affine.load %A[%i, %j] : memref<4096x4096xf32>
%1 = affine.load %x[%j] : memref<4096xf32>
%2 = affine.load %tmp[%i] : memref<4096xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<4096xf32>
%5 = affine.load %B[%i, %j] : memref<4096x4096xf32>
%6 = affine.load %x[%j] : memref<4096xf32>
%7 = affine.load %y[%i] : memref<4096xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<4096xf32>
}
%10 = affine.load %tmp[%i] : memref<4096xf32>
%11 = affine.load %y[%i] : memref<4096xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<4096xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_512(%alpha: f32, %beta: f32, %A: memref<512x512xf32>, %B: memref<512x512xf32>, %tmp: memref<512xf32>, %x: memref<512xf32>, %y: memref<512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to 512 {
%0 = affine.load %A[%i, %j] : memref<512x512xf32>
%1 = affine.load %x[%j] : memref<512xf32>
%2 = affine.load %tmp[%i] : memref<512xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<512xf32>
%5 = affine.load %B[%i, %j] : memref<512x512xf32>
%6 = affine.load %x[%j] : memref<512xf32>
%7 = affine.load %y[%i] : memref<512xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<512xf32>
}
%10 = affine.load %tmp[%i] : memref<512xf32>
%11 = affine.load %y[%i] : memref<512xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<512xf32>
}
return
}

View File

@ -1,25 +0,0 @@
func @gesummv_64(%alpha: f32, %beta: f32, %A: memref<64x64xf32>, %B: memref<64x64xf32>, %tmp: memref<64xf32>, %x: memref<64xf32>, %y: memref<64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to 64 {
%0 = affine.load %A[%i, %j] : memref<64x64xf32>
%1 = affine.load %x[%j] : memref<64xf32>
%2 = affine.load %tmp[%i] : memref<64xf32>
%3 = mulf %0, %1 : f32
%4 = addf %2, %3 : f32
affine.store %4, %tmp[%i] : memref<64xf32>
%5 = affine.load %B[%i, %j] : memref<64x64xf32>
%6 = affine.load %x[%j] : memref<64xf32>
%7 = affine.load %y[%i] : memref<64xf32>
%8 = mulf %5, %6 : f32
%9 = addf %7, %8 : f32
affine.store %9, %y[%i] : memref<64xf32>
}
%10 = affine.load %tmp[%i] : memref<64xf32>
%11 = affine.load %y[%i] : memref<64xf32>
%12 = mulf %alpha, %10 : f32
%13 = mulf %beta, %11 : f32
%14 = addf %12, %13 : f32
affine.store %14, %y[%i] : memref<64xf32>
}
return
}

View File

@ -0,0 +1,13 @@
#define N 32
void test_gesummv(float alpha, float beta, float A[N][N], float B[N][N],
float tmp[N], float x[N], float y[N]) {
#pragma scop
for (int i = 0; i < N; i += 1) {
for (int j = 0; j < N; j += 1) {
tmp[i] += A[i][j] * x[j];
y[i] += B[i][j] * x[j];
}
y[i] = alpha * tmp[i] + beta * y[i];
}
#pragma endscop
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_1024(%alpha: f32, %beta: f32, %C: memref<1024x1024xf32>, %A: memref<1024x1024xf32>, %B: memref<1024x1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<1024x1024xf32>
affine.for %k = 0 to 1024 {
%2 = affine.load %A[%i, %k] : memref<1024x1024xf32>
%3 = affine.load %B[%j, %k] : memref<1024x1024xf32>
%4 = affine.load %B[%i, %k] : memref<1024x1024xf32>
%5 = affine.load %A[%j, %k] : memref<1024x1024xf32>
%6 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<1024x1024xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_128(%alpha: f32, %beta: f32, %C: memref<128x128xf32>, %A: memref<128x128xf32>, %B: memref<128x128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<128x128xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<128x128xf32>
affine.for %k = 0 to 128 {
%2 = affine.load %A[%i, %k] : memref<128x128xf32>
%3 = affine.load %B[%j, %k] : memref<128x128xf32>
%4 = affine.load %B[%i, %k] : memref<128x128xf32>
%5 = affine.load %A[%j, %k] : memref<128x128xf32>
%6 = affine.load %C[%i, %j] : memref<128x128xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<128x128xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_2048(%alpha: f32, %beta: f32, %C: memref<2048x2048xf32>, %A: memref<2048x2048xf32>, %B: memref<2048x2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<2048x2048xf32>
affine.for %k = 0 to 2048 {
%2 = affine.load %A[%i, %k] : memref<2048x2048xf32>
%3 = affine.load %B[%j, %k] : memref<2048x2048xf32>
%4 = affine.load %B[%i, %k] : memref<2048x2048xf32>
%5 = affine.load %A[%j, %k] : memref<2048x2048xf32>
%6 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<2048x2048xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_256(%alpha: f32, %beta: f32, %C: memref<256x256xf32>, %A: memref<256x256xf32>, %B: memref<256x256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<256x256xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<256x256xf32>
affine.for %k = 0 to 256 {
%2 = affine.load %A[%i, %k] : memref<256x256xf32>
%3 = affine.load %B[%j, %k] : memref<256x256xf32>
%4 = affine.load %B[%i, %k] : memref<256x256xf32>
%5 = affine.load %A[%j, %k] : memref<256x256xf32>
%6 = affine.load %C[%i, %j] : memref<256x256xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<256x256xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_32(%alpha: f32, %beta: f32, %C: memref<32x32xf32>, %A: memref<32x32xf32>, %B: memref<32x32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<32x32xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<32x32xf32>
affine.for %k = 0 to 32 {
%2 = affine.load %A[%i, %k] : memref<32x32xf32>
%3 = affine.load %B[%j, %k] : memref<32x32xf32>
%4 = affine.load %B[%i, %k] : memref<32x32xf32>
%5 = affine.load %A[%j, %k] : memref<32x32xf32>
%6 = affine.load %C[%i, %j] : memref<32x32xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<32x32xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_4096(%alpha: f32, %beta: f32, %C: memref<4096x4096xf32>, %A: memref<4096x4096xf32>, %B: memref<4096x4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<4096x4096xf32>
affine.for %k = 0 to 4096 {
%2 = affine.load %A[%i, %k] : memref<4096x4096xf32>
%3 = affine.load %B[%j, %k] : memref<4096x4096xf32>
%4 = affine.load %B[%i, %k] : memref<4096x4096xf32>
%5 = affine.load %A[%j, %k] : memref<4096x4096xf32>
%6 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<4096x4096xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_512(%alpha: f32, %beta: f32, %C: memref<512x512xf32>, %A: memref<512x512xf32>, %B: memref<512x512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<512x512xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<512x512xf32>
affine.for %k = 0 to 512 {
%2 = affine.load %A[%i, %k] : memref<512x512xf32>
%3 = affine.load %B[%j, %k] : memref<512x512xf32>
%4 = affine.load %B[%i, %k] : memref<512x512xf32>
%5 = affine.load %A[%j, %k] : memref<512x512xf32>
%6 = affine.load %C[%i, %j] : memref<512x512xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<512x512xf32>
}
}
}
return
}

View File

@ -1,24 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syr2k_64(%alpha: f32, %beta: f32, %C: memref<64x64xf32>, %A: memref<64x64xf32>, %B: memref<64x64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<64x64xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<64x64xf32>
affine.for %k = 0 to 64 {
%2 = affine.load %A[%i, %k] : memref<64x64xf32>
%3 = affine.load %B[%j, %k] : memref<64x64xf32>
%4 = affine.load %B[%i, %k] : memref<64x64xf32>
%5 = affine.load %A[%j, %k] : memref<64x64xf32>
%6 = affine.load %C[%i, %j] : memref<64x64xf32>
%7 = mulf %2, %3 : f32
%8 = mulf %4, %5 : f32
%9 = addf %7, %8 : f32
%10 = mulf %alpha, %9 : f32
%11 = addf %6, %10 : f32
affine.store %11, %C[%i, %j] : memref<64x64xf32>
}
}
}
return
}

View File

@ -1,10 +1,11 @@
void syr2k_32(float alpha, float beta, float C[32][32], float A[32][32], #define N 32
float B[32][32]) { void test_syr2k(float alpha, float beta, float C[N][N], float A[N][N],
float B[N][N]) {
#pragma scop #pragma scop
for (int i = 0; i < 32; i += 1) { for (int i = 0; i < N; i += 1) {
for (int j = 0; j < (i + 1); j += 1) { for (int j = 0; j < (i + 1); j += 1) {
C[i][j] *= beta; C[i][j] *= beta;
for (int k = 0; k < 32; k += 1) { for (int k = 0; k < N; k += 1) {
float tmp = A[i][k] * B[j][k] + B[i][k] * A[j][k]; float tmp = A[i][k] * B[j][k] + B[i][k] * A[j][k];
C[i][j] += alpha * tmp; C[i][j] += alpha * tmp;
} }

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_1024(%alpha: f32, %beta: f32, %C: memref<1024x1024xf32>, %A: memref<1024x1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<1024x1024xf32>
affine.for %k = 0 to 1024 {
%2 = affine.load %A[%i, %k] : memref<1024x1024xf32>
%3 = affine.load %A[%j, %k] : memref<1024x1024xf32>
%4 = affine.load %C[%i, %j] : memref<1024x1024xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<1024x1024xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_128(%alpha: f32, %beta: f32, %C: memref<128x128xf32>, %A: memref<128x128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<128x128xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<128x128xf32>
affine.for %k = 0 to 128 {
%2 = affine.load %A[%i, %k] : memref<128x128xf32>
%3 = affine.load %A[%j, %k] : memref<128x128xf32>
%4 = affine.load %C[%i, %j] : memref<128x128xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<128x128xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_2048(%alpha: f32, %beta: f32, %C: memref<2048x2048xf32>, %A: memref<2048x2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<2048x2048xf32>
affine.for %k = 0 to 2048 {
%2 = affine.load %A[%i, %k] : memref<2048x2048xf32>
%3 = affine.load %A[%j, %k] : memref<2048x2048xf32>
%4 = affine.load %C[%i, %j] : memref<2048x2048xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<2048x2048xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_256(%alpha: f32, %beta: f32, %C: memref<256x256xf32>, %A: memref<256x256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<256x256xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<256x256xf32>
affine.for %k = 0 to 256 {
%2 = affine.load %A[%i, %k] : memref<256x256xf32>
%3 = affine.load %A[%j, %k] : memref<256x256xf32>
%4 = affine.load %C[%i, %j] : memref<256x256xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<256x256xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_32(%alpha: f32, %beta: f32, %C: memref<32x32xf32>, %A: memref<32x32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<32x32xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<32x32xf32>
affine.for %k = 0 to 32 {
%2 = affine.load %A[%i, %k] : memref<32x32xf32>
%3 = affine.load %A[%j, %k] : memref<32x32xf32>
%4 = affine.load %C[%i, %j] : memref<32x32xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<32x32xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_4096(%alpha: f32, %beta: f32, %C: memref<4096x4096xf32>, %A: memref<4096x4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<4096x4096xf32>
affine.for %k = 0 to 4096 {
%2 = affine.load %A[%i, %k] : memref<4096x4096xf32>
%3 = affine.load %A[%j, %k] : memref<4096x4096xf32>
%4 = affine.load %C[%i, %j] : memref<4096x4096xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<4096x4096xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_512(%alpha: f32, %beta: f32, %C: memref<512x512xf32>, %A: memref<512x512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<512x512xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<512x512xf32>
affine.for %k = 0 to 512 {
%2 = affine.load %A[%i, %k] : memref<512x512xf32>
%3 = affine.load %A[%j, %k] : memref<512x512xf32>
%4 = affine.load %C[%i, %j] : memref<512x512xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<512x512xf32>
}
}
}
return
}

View File

@ -1,20 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @syrk_64(%alpha: f32, %beta: f32, %C: memref<64x64xf32>, %A: memref<64x64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to #map(%i) {
%0 = affine.load %C[%i, %j] : memref<64x64xf32>
%1 = mulf %beta, %0 : f32
affine.store %1, %C[%i, %j] : memref<64x64xf32>
affine.for %k = 0 to 64 {
%2 = affine.load %A[%i, %k] : memref<64x64xf32>
%3 = affine.load %A[%j, %k] : memref<64x64xf32>
%4 = affine.load %C[%i, %j] : memref<64x64xf32>
%5 = mulf %alpha, %2 : f32
%6 = mulf %5, %3 : f32
%7 = addf %4, %6 : f32
affine.store %7, %C[%i, %j] : memref<64x64xf32>
}
}
}
return
}

View File

@ -1,9 +1,10 @@
void syrk_32(float alpha, float beta, float C[32][32], float A[32][32]) { #define N 32
void test_syrk(float alpha, float beta, float C[N][N], float A[N][N]) {
#pragma scop #pragma scop
for (int i = 0; i < 32; i++) { for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) { for (int j = 0; j <= i; j++) {
C[i][j] *= beta; C[i][j] *= beta;
for (int k = 0; k < 32; k++) { for (int k = 0; k < N; k++) {
C[i][j] += alpha * A[i][k] * A[j][k]; C[i][j] += alpha * A[i][k] * A[j][k];
} }
} }

View File

@ -1,7 +1,8 @@
void trmm_32(float alpha, float A[32][32], float B[32][32]) { #define N 32
void test_trmm(float alpha, float A[N][N], float B[N][N]) {
#pragma scop #pragma scop
for (int i = 0; i < 32; i += 1) { for (int i = 0; i < N; i += 1) {
for (int j = 0; j < 32; j += 1) { for (int j = 0; j < N; j += 1) {
for (int k = 0; k < (i + 1); k += 1) { for (int k = 0; k < (i + 1); k += 1) {
B[i][j] += A[i][k] * B[k][j]; B[i][j] += A[i][k] * B[k][j];
} }

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_1024(%alpha: f32, %A: memref<1024x1024xf32>, %B: memref<1024x1024xf32>) {
affine.for %i = 0 to 1024 {
affine.for %j = 0 to 1024 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<1024x1024xf32>
%3 = affine.load %B[%k, %j] : memref<1024x1024xf32>
%4 = affine.load %B[%i, %j] : memref<1024x1024xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<1024x1024xf32>
}
%0 = affine.load %B[%i, %j] : memref<1024x1024xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<1024x1024xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_128(%alpha: f32, %A: memref<128x128xf32>, %B: memref<128x128xf32>) {
affine.for %i = 0 to 128 {
affine.for %j = 0 to 128 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<128x128xf32>
%3 = affine.load %B[%k, %j] : memref<128x128xf32>
%4 = affine.load %B[%i, %j] : memref<128x128xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<128x128xf32>
}
%0 = affine.load %B[%i, %j] : memref<128x128xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<128x128xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_2048(%alpha: f32, %A: memref<2048x2048xf32>, %B: memref<2048x2048xf32>) {
affine.for %i = 0 to 2048 {
affine.for %j = 0 to 2048 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<2048x2048xf32>
%3 = affine.load %B[%k, %j] : memref<2048x2048xf32>
%4 = affine.load %B[%i, %j] : memref<2048x2048xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<2048x2048xf32>
}
%0 = affine.load %B[%i, %j] : memref<2048x2048xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<2048x2048xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_256(%alpha: f32, %A: memref<256x256xf32>, %B: memref<256x256xf32>) {
affine.for %i = 0 to 256 {
affine.for %j = 0 to 256 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<256x256xf32>
%3 = affine.load %B[%k, %j] : memref<256x256xf32>
%4 = affine.load %B[%i, %j] : memref<256x256xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<256x256xf32>
}
%0 = affine.load %B[%i, %j] : memref<256x256xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<256x256xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_32(%alpha: f32, %A: memref<32x32xf32>, %B: memref<32x32xf32>) {
affine.for %i = 0 to 32 {
affine.for %j = 0 to 32 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<32x32xf32>
%3 = affine.load %B[%k, %j] : memref<32x32xf32>
%4 = affine.load %B[%i, %j] : memref<32x32xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<32x32xf32>
}
%0 = affine.load %B[%i, %j] : memref<32x32xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<32x32xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_4096(%alpha: f32, %A: memref<4096x4096xf32>, %B: memref<4096x4096xf32>) {
affine.for %i = 0 to 4096 {
affine.for %j = 0 to 4096 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<4096x4096xf32>
%3 = affine.load %B[%k, %j] : memref<4096x4096xf32>
%4 = affine.load %B[%i, %j] : memref<4096x4096xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<4096x4096xf32>
}
%0 = affine.load %B[%i, %j] : memref<4096x4096xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<4096x4096xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_512(%alpha: f32, %A: memref<512x512xf32>, %B: memref<512x512xf32>) {
affine.for %i = 0 to 512 {
affine.for %j = 0 to 512 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<512x512xf32>
%3 = affine.load %B[%k, %j] : memref<512x512xf32>
%4 = affine.load %B[%i, %j] : memref<512x512xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<512x512xf32>
}
%0 = affine.load %B[%i, %j] : memref<512x512xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<512x512xf32>
}
}
return
}

View File

@ -1,19 +0,0 @@
#map = affine_map<(d0) -> (d0 + 1)>
func @trmm_64(%alpha: f32, %A: memref<64x64xf32>, %B: memref<64x64xf32>) {
affine.for %i = 0 to 64 {
affine.for %j = 0 to 64 {
affine.for %k = 0 to #map(%i) {
%2 = affine.load %A[%i, %k] : memref<64x64xf32>
%3 = affine.load %B[%k, %j] : memref<64x64xf32>
%4 = affine.load %B[%i, %j] : memref<64x64xf32>
%5 = mulf %2, %3 : f32
%6 = addf %4, %5 : f32
affine.store %6, %B[%i, %j] : memref<64x64xf32>
}
%0 = affine.load %B[%i, %j] : memref<64x64xf32>
%1 = mulf %alpha, %0 : f32
affine.store %1, %B[%i, %j] : memref<64x64xf32>
}
}
return
}

View File

@ -1,5 +1,7 @@
# REQUIRES: bindings_python # REQUIRES: bindings_python
# RUN: %PYTHON %s # RUN: %PYTHON %s
import mlir.ir
from mlir.dialects import builtin
import scalehls import scalehls
from scalehls.dialects import hlscpp from scalehls.dialects import hlscpp

View File

@ -13,13 +13,16 @@
// CHECK-NEXT: for (int [[j:.*]] = 0; [[j]] < 4; [[j]] += 1) { // CHECK-NEXT: for (int [[j:.*]] = 0; [[j]] < 4; [[j]] += 1) {
// CHECK-NEXT: #pragma HLS pipeline II=3 // CHECK-NEXT: #pragma HLS pipeline II=3
void test_syrk(float alpha, float beta, float C[32][32], float A[32][32]) { #define N 32
for (int i = 0; i < 32; i++) { void test_syrk(float alpha, float beta, float C[N][N], float A[N][N]) {
#pragma scop
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) { for (int j = 0; j <= i; j++) {
C[i][j] *= beta; C[i][j] *= beta;
for (int k = 0; k < 32; k++) { for (int k = 0; k < N; k++) {
C[i][j] += alpha * A[i][k] * A[j][k]; C[i][j] += alpha * A[i][k] * A[j][k];
} }
} }
} }
#pragma endscop
} }