From 1eb4bac41642eeba661f189e04596cd677e1268c Mon Sep 17 00:00:00 2001 From: shiroha <3202778076@qq.com> Date: Thu, 16 Jan 2025 13:01:28 +0800 Subject: [PATCH 1/2] [examples] 1. Add Gemmini-baremetal examples for spike and verilator evaluation. 2. Add more gemmini conv2d operation examples. --- examples/GemminiDialect/baremetal/README.md | 21 +++++ examples/GemminiDialect/baremetal/makefile | 72 +++++++++++++++++ .../conv_2d_nhwc_fhwc_5x5_i8.mlir | 32 ++++++++ .../GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir | 31 ++++++++ .../GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir | 30 +++++++ .../conv_2d_nhwc_hwcf_5x5_i8.mlir | 32 ++++++++ examples/GemminiDialect/makefile | 79 +++++++++++++++++++ 7 files changed, 297 insertions(+) create mode 100644 examples/GemminiDialect/baremetal/README.md create mode 100644 examples/GemminiDialect/baremetal/makefile create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir diff --git a/examples/GemminiDialect/baremetal/README.md b/examples/GemminiDialect/baremetal/README.md new file mode 100644 index 0000000000..b7478bd8df --- /dev/null +++ b/examples/GemminiDialect/baremetal/README.md @@ -0,0 +1,21 @@ +## Gemmini-Baremetal-Example + +This example demonstrates how to use the gemmini dialect in a baremetal environment. Functional evaluation can be performed using spike, while RTL hardware-based evaluation uses verilator. + +Compiling baremetal workloads requires ``riscv64-unknown-elf-gcc``. The riscv-toolchain in the gemmini chipyard environment already includes ``riscv64-unknown-elf-gcc``, so there's no need to reinstall it. Before running the following test cases, simply switch to the corresponding chipyard **conda environment**. + +### Function Evaluation +Simply execute the generated executable file for testing, for example: +``` +make mvin-mvout-run-baremetal +spike --extension=gemmini mvin-mvout-baremetal +``` + +### Hardware Evaluation +Step 1. Execute `make -run-baremetal` in this folder to generate the baremetal test case. + +Step 2. Copy the generated test case `-baremetal` to the gemmini workload storage path in the chipyard folder (`chipyard/generators/software/gemmini-rocc-tests/build/`) + +Step 3. `cd chipyard/generators/gemmini/` and execute `./scripts/run-verilator.sh ` to run the test. (this step may be different depending on the chipyard/gemmini version) + +It is strongly recommended to use chipyard's MEMORY_LOAD setting, which will significantly speed up the simulation startup time. diff --git a/examples/GemminiDialect/baremetal/makefile b/examples/GemminiDialect/baremetal/makefile new file mode 100644 index 0000000000..4f50f395fc --- /dev/null +++ b/examples/GemminiDialect/baremetal/makefile @@ -0,0 +1,72 @@ +#!/bin/bash +BUDDY_MLIR_DIR := ../../../ +BUDDY_OPT := ${BUDDY_MLIR_DIR}/build/bin/buddy-opt +BUDDY_TRANSLATE := ${BUDDY_MLIR_DIR}/build/bin/buddy-translate +BUDDY_LLC := ${BUDDY_MLIR_DIR}/build/bin/buddy-llc + +GEMMINI_EXAMPLE_DIR := ${BUDDY_MLIR_DIR}/examples/GemminiDialect/ + +ELF_CC := riscv64-unknown-elf-gcc +PK_CC := riscv64-unknown-linux-gnu-gcc + +mvin-mvout-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/mvin-mvout.mlir -lower-gemmini | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${ELF_CC} -static -specs=htif_nano.specs log.o -o mvin-mvout-baremetal + @spike --extension=gemmini mvin-mvout-baremetal + +gemmini-conv2d-nchw-fchw-f32-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fchw_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${ELF_CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fchw-f32-baremetal + @spike --extension=gemmini conv-2d-nchw-fchw-f32-baremetal + +gemmini-conv2d-nchw-fchw-i8-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fchw_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${ELF_CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fchw-i8-baremetal + @spike --extension=gemmini conv-2d-nchw-fchw-i8-baremetal + +gemmini-conv2d-nchw-fhwc-f32-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${ELF_CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fhwc-f32-baremetal + @spike --extension=gemmini conv-2d-nchw-fhwc-f32-baremetal + +gemmini-conv2d-nhwc-fhwc-i8-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${ELF_CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nhwc-fhwc-i8-baremetal + @spike --extension=gemmini conv-2d-nhwc-fhwc-i8-baremetal \ No newline at end of file diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir new file mode 100644 index 0000000000..c59c418272 --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir @@ -0,0 +1,32 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<1x5x5x1xi8> = dense<[[[[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<1x5x5x1xi8> + %output = memref.alloc() : memref<1x3x3x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<25x1xi8> memref<1xi32> memref<9x1xi8> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<1x5x5x1xi8>) + outs(%output : memref<1x3x3x1xi8>) + gemmini.print %output : memref<1x3x3x1xi8> + return %0 : i8 +} \ No newline at end of file diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir new file mode 100644 index 0000000000..309a5dac9e --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir @@ -0,0 +1,31 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini="acc_t=f32" | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x5x5x1xf32> = dense<[[[[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.]]]]> + +memref.global "private" @kernel : memref<1x3x3x1xf32> = dense<[[[[1.], [1.], [1.]], + [[1.], [1.], [1.]], + [[1.], [1.], [1.]]]]> + + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + // batchsize = 2 inputchannel = 2 + %input = memref.get_global @input : memref<1x5x5x1xf32> + // outputchannel = 3 + %kernel = memref.get_global @kernel : memref<1x3x3x1xf32> + // batchsize h w outputchannel + %output = memref.alloc() : memref<1x3x3x1xf32> + // CHECK: gemmini.tile_conv %{{.+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK: memref<1x5x5x1xf32> memref<9x1xf32> memref<1xf32> memref<9x1xf32> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x5x5x1xf32>, memref<1x3x3x1xf32>) + outs(%output : memref<1x3x3x1xf32>) + gemmini.print %output : memref<1x3x3x1xf32> + return %0 : i8 +} diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir new file mode 100644 index 0000000000..ef123fa24c --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir @@ -0,0 +1,30 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<1x3x3x1xi8> = dense<[[[[1], [1], [1]], + [[1], [1], [1]], + [[1], [1], [1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<1x3x3x1xi8> + %output = memref.alloc() : memref<1x5x5x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<9x1xi8> memref<1xi32> memref<25x1xi8> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<1x3x3x1xi8>) + outs(%output : memref<1x5x5x1xi8>) + gemmini.print %output : memref<1x5x5x1xi8> + return %0 : i8 +} \ No newline at end of file diff --git a/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir new file mode 100644 index 0000000000..acb11fbf72 --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir @@ -0,0 +1,32 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<5x5x1x1xi8> = dense<[[[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<5x5x1x1xi8> + %output = memref.alloc() : memref<1x3x3x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<25x1xi8> memref<1xi32> memref<9x1xi8> i64 i64 + linalg.conv_2d_nhwc_hwcf + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<5x5x1x1xi8>) + outs(%output : memref<1x3x3x1xi8>) + gemmini.print %output : memref<1x3x3x1xi8> + return %0 : i8 +} \ No newline at end of file diff --git a/examples/GemminiDialect/makefile b/examples/GemminiDialect/makefile index 6be7693262..4a5e8789b6 100644 --- a/examples/GemminiDialect/makefile +++ b/examples/GemminiDialect/makefile @@ -2484,3 +2484,82 @@ gemmini-conv-13x13-gemmini-run: -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out + + +gemmini-linalg-conv2d-nhwc-fhwc-f32-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" \ + -o log.mlir + +gemmini-linalg-conv2d-nhwc-fhwc-f32-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -o log.o + @riscv64-unknown-linux-gnu-gcc log.o -O2 -static -o a.out + @spike --extension=gemmini pk a.out + +gemmini-linalg-conv2d-nhwc-fhwc-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-linalg-conv2d-nhwc-fhwc-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -o log.o + @riscv64-unknown-linux-gnu-gcc log.o -O2 -static -o a.out + @spike --extension=gemmini pk a.out + +gemmini-conv2d-nhwc-hwcf-5x5-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_hwcf_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-conv2d-nhwc-hwcf-5x5-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_hwcf_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @riscv64-unknown-linux-gnu-gcc -O2 -static log.o -o a.out + @spike --extension=gemmini pk a.out + +gemmini-conv2d-nhwc-fhwc-5x5-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-conv2d-nhwc-fhwc-5x5-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @riscv64-unknown-linux-gnu-gcc -O2 -static log.o -o a.out + @spike --extension=gemmini pk a.out \ No newline at end of file From e608e66121c77c8892c52bd0ca1f94a8830d8be7 Mon Sep 17 00:00:00 2001 From: shiroha <3202778076@qq.com> Date: Tue, 18 Feb 2025 20:41:48 +0800 Subject: [PATCH 2/2] [examples] 1. Add Gemmini-baremetal examples for spike and verilator evaluation. 2. Add more gemmini conv2d operation examples. --- examples/GemminiDialect/baremetal/README.md | 19 ++ examples/GemminiDialect/baremetal/makefile | 71 +++++ .../conv_2d_nhwc_fhwc_5x5_i8.mlir | 32 ++ .../GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir | 31 ++ .../GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir | 30 ++ .../conv_2d_nhwc_hwcf_5x5_i8.mlir | 32 ++ examples/GemminiDialect/makefile | 281 +++++++++++------- git | 0 8 files changed, 395 insertions(+), 101 deletions(-) create mode 100644 examples/GemminiDialect/baremetal/README.md create mode 100644 examples/GemminiDialect/baremetal/makefile create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir create mode 100644 examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir create mode 100644 git diff --git a/examples/GemminiDialect/baremetal/README.md b/examples/GemminiDialect/baremetal/README.md new file mode 100644 index 0000000000..c60aff8b59 --- /dev/null +++ b/examples/GemminiDialect/baremetal/README.md @@ -0,0 +1,19 @@ +## Gemmini-Baremetal-Example + +This example demonstrates how to use the gemmini dialect in a baremetal environment. Functional evaluation can be performed using spike, while RTL hardware-based evaluation uses verilator. + +Compiling baremetal workloads requires ``riscv64-unknown-elf-gcc``. The riscv-toolchain in the gemmini chipyard environment already includes ``riscv64-unknown-elf-gcc``, so there's no need to reinstall it. Before running the following test cases, simply switch to the corresponding chipyard **conda environment**. + +### Function Evaluation +Simply execute the generated executable file for testing, for example: +``` +make mvin-mvout-run-baremetal +spike --extension=gemmini mvin-mvout-baremetal +``` + +### Hardware Evaluation +Step 1. Execute `make -run-baremetal` in this folder to generate the baremetal test case. + +Step 2. `cd chipyard/generators/gemmini/` and execute `./scripts/run-verilator.sh /path/to/-run-baremetal` to run the test. (this step may be different depending on the chipyard/gemmini version) + +It is strongly recommended to use chipyard's MEMORY_LOAD setting, which will significantly speed up the simulation startup time. diff --git a/examples/GemminiDialect/baremetal/makefile b/examples/GemminiDialect/baremetal/makefile new file mode 100644 index 0000000000..40ed7f5377 --- /dev/null +++ b/examples/GemminiDialect/baremetal/makefile @@ -0,0 +1,71 @@ +#!/bin/bash +BUDDY_MLIR_DIR := ../../../ +BUDDY_OPT := ${BUDDY_MLIR_DIR}/build/bin/buddy-opt +BUDDY_TRANSLATE := ${BUDDY_MLIR_DIR}/build/bin/buddy-translate +BUDDY_LLC := ${BUDDY_MLIR_DIR}/build/bin/buddy-llc + +GEMMINI_EXAMPLE_DIR := ${BUDDY_MLIR_DIR}/examples/GemminiDialect/ + +CC := riscv64-unknown-elf-gcc + +mvin-mvout-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/mvin-mvout.mlir -lower-gemmini | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${CC} -static -specs=htif_nano.specs log.o -o mvin-mvout-baremetal + @spike --extension=gemmini mvin-mvout-baremetal + +gemmini-conv2d-nchw-fchw-f32-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fchw_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fchw-f32-baremetal + @spike --extension=gemmini conv-2d-nchw-fchw-f32-baremetal + +gemmini-conv2d-nchw-fchw-i8-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fchw_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fchw-i8-baremetal + @spike --extension=gemmini conv-2d-nchw-fchw-i8-baremetal + +gemmini-conv2d-nchw-fhwc-f32-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nchw_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nchw-fhwc-f32-baremetal + @spike --extension=gemmini conv-2d-nchw-fhwc-f32-baremetal + +gemmini-conv2d-nhwc-fhwc-i8-run-baremetal: + @${BUDDY_OPT} ./${GEMMINI_EXAMPLE_DIR}/conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @${CC} -O2 -static -specs=htif_nano.specs log.o -o conv-2d-nhwc-fhwc-i8-baremetal + @spike --extension=gemmini conv-2d-nhwc-fhwc-i8-baremetal diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir new file mode 100644 index 0000000000..a7d7662b10 --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_5x5_i8.mlir @@ -0,0 +1,32 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<1x5x5x1xi8> = dense<[[[[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]], + [[1], [1], [1], [1], [1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<1x5x5x1xi8> + %output = memref.alloc() : memref<1x3x3x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<25x1xi8> memref<1xi32> memref<9x1xi8> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<1x5x5x1xi8>) + outs(%output : memref<1x3x3x1xi8>) + gemmini.print %output : memref<1x3x3x1xi8> + return %0 : i8 +} diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir new file mode 100644 index 0000000000..998b2d4388 --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_f32.mlir @@ -0,0 +1,31 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini="acc_t=f32" | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x5x5x1xf32> = dense<[[[[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.]]]]> + +memref.global "private" @kernel : memref<1x3x3x1xf32> = dense<[[[[1.], [1.], [1.]], + [[1.], [1.], [1.]], + [[1.], [1.], [1.]]]]> + + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + // batchsize = 2 inputchannel = 2 + %input = memref.get_global @input : memref<1x5x5x1xf32> + // outputchannel = 3 + %kernel = memref.get_global @kernel : memref<1x3x3x1xf32> + // batchsize h w outputchannel + %output = memref.alloc() : memref<1x3x3x1xf32> + // CHECK: gemmini.tile_conv %{{.+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK: memref<1x5x5x1xf32> memref<9x1xf32> memref<1xf32> memref<9x1xf32> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x5x5x1xf32>, memref<1x3x3x1xf32>) + outs(%output : memref<1x3x3x1xf32>) + gemmini.print %output : memref<1x3x3x1xf32> + return %0 : i8 +} diff --git a/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir new file mode 100644 index 0000000000..0bfeafca19 --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_fhwc_i8.mlir @@ -0,0 +1,30 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<1x3x3x1xi8> = dense<[[[[1], [1], [1]], + [[1], [1], [1]], + [[1], [1], [1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<1x3x3x1xi8> + %output = memref.alloc() : memref<1x5x5x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<9x1xi8> memref<1xi32> memref<25x1xi8> i64 i64 + linalg.conv_2d_nhwc_fhwc + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<1x3x3x1xi8>) + outs(%output : memref<1x5x5x1xi8>) + gemmini.print %output : memref<1x5x5x1xi8> + return %0 : i8 +} diff --git a/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir b/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir new file mode 100644 index 0000000000..ee9af7d2ea --- /dev/null +++ b/examples/GemminiDialect/conv_2d_nhwc_hwcf_5x5_i8.mlir @@ -0,0 +1,32 @@ +// RUN: buddy-opt %s \ +// RUN: --convert-linalg-to-gemmini | \ +// RUN: FileCheck %s + +memref.global "private" @input : memref<1x7x7x1xi8> = dense<[[[[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]], + [[1],[1],[1],[1],[1],[1],[1]]]]> + +memref.global "private" @kernel : memref<5x5x1x1xi8> = dense<[[[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]], + [[[1]], [[1]], [[1]], [[1]], [[1]]]]> + +func.func @main() -> i8 { + %0 = arith.constant 0 : i8 + %input = memref.get_global @input : memref<1x7x7x1xi8> + %kernel = memref.get_global @kernel : memref<5x5x1x1xi8> + %output = memref.alloc() : memref<1x3x3x1xi8> + + // CHECK: gemmini.tile_conv %{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %alloc_{{[0-9]+}} %{{.+}} %{{.+}} : + // CHECK-SAME: memref<1x7x7x1xi8> memref<25x1xi8> memref<1xi32> memref<9x1xi8> i64 i64 + linalg.conv_2d_nhwc_hwcf + ins(%input, %kernel : memref<1x7x7x1xi8>, memref<5x5x1x1xi8>) + outs(%output : memref<1x3x3x1xi8>) + gemmini.print %output : memref<1x3x3x1xi8> + return %0 : i8 +} diff --git a/examples/GemminiDialect/makefile b/examples/GemminiDialect/makefile index 6be7693262..a45ce670db 100644 --- a/examples/GemminiDialect/makefile +++ b/examples/GemminiDialect/makefile @@ -1,7 +1,7 @@ #!/bin/bash BUDDY_OPT := ../../build/bin/buddy-opt BUDDY_TRANSLATE := ../../build/bin/buddy-translate -BUDDY_LLC := ../../build/bin/buddy-llc +BUDDY_LLC := ../../build/bin/buddy-llc INTERFACES:= ../../frontend/Interfaces mvin-mvout-lower: @@ -217,7 +217,7 @@ tile-matmul-asm: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=asm -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.s + -o log.s tile-matmul-run: @${BUDDY_OPT} ./tile-matmul.mlir -lower-gemmini | \ @@ -799,17 +799,17 @@ linalg-matmul-32x32-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=1 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-32x32-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=1 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=1 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-32x32-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -860,10 +860,10 @@ linalg-matmul-32x32-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=1 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-32x32-gemmini-lower: @@ -899,11 +899,11 @@ gemmini-matmul-32x32-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=1 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-matmul-64x64-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -942,17 +942,17 @@ linalg-matmul-64x64-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=2 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-64x64-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=2 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=2 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-64x64-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1003,10 +1003,10 @@ linalg-matmul-64x64-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=2 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-64x64-gemmini-lower: @@ -1042,12 +1042,12 @@ gemmini-matmul-64x64-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=2 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out - + @spike --extension=gemmini pk a.out + linalg-matmul-128x128-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ -llvm-request-c-wrappers \ @@ -1085,17 +1085,17 @@ linalg-matmul-128x128-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=3 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-128x128-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=3 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=3 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-128x128-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1146,10 +1146,10 @@ linalg-matmul-128x128-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=3 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-128x128-gemmini-lower: @@ -1185,11 +1185,11 @@ gemmini-matmul-128x128-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=3 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-matmul-256x256-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1228,17 +1228,17 @@ linalg-matmul-256x256-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=4 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-256x256-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=4 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=4 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-256x256-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1289,10 +1289,10 @@ linalg-matmul-256x256-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=4 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-256x256-gemmini-lower: @@ -1328,11 +1328,11 @@ gemmini-matmul-256x256-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=4 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-matmul-512x512-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1371,17 +1371,17 @@ linalg-matmul-512x512-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=5 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-512x512-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=5 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=5 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-512x512-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1432,10 +1432,10 @@ linalg-matmul-512x512-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=5 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-512x512-gemmini-lower: @@ -1452,7 +1452,7 @@ gemmini-matmul-512x512-gemmini-translate: -lower-gemmini | \ ${BUDDY_TRANSLATE} -buddy-to-llvmir \ -o log.ll - + gemmini-matmul-512x512-gemmini-asm: @${BUDDY_OPT} ./ciface.mlir \ -llvm-request-c-wrappers \ @@ -1471,11 +1471,11 @@ gemmini-matmul-512x512-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=5 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-matmul-1024x1024-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1514,17 +1514,17 @@ linalg-matmul-1024x1024-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=6 -DDIALECT=1 \ - performance-test.cpp -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + performance-test.cpp -O2 -static -o a.out -I${INTERFACES} + @spike --extension=gemmini pk a.out c-matmul-1024x1024-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DMATMUL=6 -O2 -static - @spike --extension=gemmini pk a.out + -DMATMUL=6 -O2 -static + @spike --extension=gemmini pk a.out linalg-matmul-1024x1024-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1575,10 +1575,10 @@ linalg-matmul-1024x1024-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=6 \ -DDIALECT=1 performance-test.cpp \ - -O2 -static -o a.out -I${INTERFACES} + -O2 -static -o a.out -I${INTERFACES} @spike --extension=gemmini pk a.out gemmini-matmul-1024x1024-gemmini-lower: @@ -1614,11 +1614,11 @@ gemmini-matmul-1024x1024-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DMATMUL=6 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-3x3-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1657,18 +1657,18 @@ linalg-conv-3x3-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=1 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-3x3-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=1 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=1 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-3x3-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1719,7 +1719,7 @@ linalg-conv-3x3-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=1 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -1758,11 +1758,11 @@ gemmini-conv-3x3-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=1 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-5x5-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1801,18 +1801,18 @@ linalg-conv-5x5-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=2 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-5x5-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=2 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=2 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-5x5-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1863,7 +1863,7 @@ linalg-conv-5x5-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=2 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -1902,11 +1902,11 @@ gemmini-conv-5x5-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=2 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-7x7-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -1945,18 +1945,18 @@ linalg-conv-7x7-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=3 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-7x7-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=3 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=3 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-7x7-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2007,7 +2007,7 @@ linalg-conv-7x7-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=3 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -2046,11 +2046,11 @@ gemmini-conv-7x7-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=3 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-9x9-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2089,18 +2089,18 @@ linalg-conv-9x9-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=4 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-9x9-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=4 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=4 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-9x9-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2151,7 +2151,7 @@ linalg-conv-9x9-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=4 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -2190,11 +2190,11 @@ gemmini-conv-9x9-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=4 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-11x11-gemmini-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2233,18 +2233,18 @@ linalg-conv-11x11-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=5 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-11x11-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=5 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=5 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-11x11-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2295,7 +2295,7 @@ linalg-conv-11x11-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=5 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -2315,7 +2315,7 @@ gemmini-conv-11x11-gemmini-translate: -lower-gemmini | \ ${BUDDY_TRANSLATE} -buddy-to-llvmir \ -o log.ll - + gemmini-conv-11x11-gemmini-asm: @${BUDDY_OPT} ./ciface.mlir \ -llvm-request-c-wrappers \ @@ -2334,11 +2334,11 @@ gemmini-conv-11x11-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=5 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out linalg-conv-13x13-gemmini-lower: @@ -2378,18 +2378,18 @@ linalg-conv-13x13-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=6 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out c-conv-13x13-gemmini-run: @riscv64-unknown-linux-gnu-gcc performance-test.c \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests/include \ -I${RISCV}/../../generators/gemmini/software/gemmini-rocc-tests \ - -DCONV=6 -O2 -static - @spike --extension=gemmini pk a.out + -DCONV=6 -O2 -static + @spike --extension=gemmini pk a.out linalg-conv-13x13-cpu-lower: @${BUDDY_OPT} ./ciface.mlir \ @@ -2440,7 +2440,7 @@ linalg-conv-13x13-cpu-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=6 -DDIALECT=1 \ performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} @@ -2479,8 +2479,87 @@ gemmini-conv-13x13-gemmini-run: ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ -mattr=+buddyext,+D -float-abi=hard \ - -o log.o + -o log.o @riscv64-unknown-linux-gnu-g++ log.o -DCONV=6 \ -DDIALECT=2 performance-test.cpp \ -O2 -static -o a.out -I${INTERFACES} - @spike --extension=gemmini pk a.out + @spike --extension=gemmini pk a.out + + +gemmini-linalg-conv2d-nhwc-fhwc-f32-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" \ + -o log.mlir + +gemmini-linalg-conv2d-nhwc-fhwc-f32-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_f32.mlir \ + -convert-linalg-to-gemmini="acc_t=f32" \ + -convert-linalg-to-loops \ + -lower-gemmini="dim=4 acc_t=f32 elem_t=f32" | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -o log.o + @riscv64-unknown-linux-gnu-gcc log.o -O2 -static -o a.out + @spike --extension=gemmini pk a.out + +gemmini-linalg-conv2d-nhwc-fhwc-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-linalg-conv2d-nhwc-fhwc-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} --buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -o log.o + @riscv64-unknown-linux-gnu-gcc log.o -O2 -static -o a.out + @spike --extension=gemmini pk a.out + +gemmini-conv2d-nhwc-hwcf-5x5-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_hwcf_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-conv2d-nhwc-hwcf-5x5-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_hwcf_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @riscv64-unknown-linux-gnu-gcc -O2 -static log.o -o a.out + @spike --extension=gemmini pk a.out + +gemmini-conv2d-nhwc-fhwc-5x5-i8-lower: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini \ + -o log.mlir + +gemmini-conv2d-nhwc-fhwc-5x5-i8-run-pk: + @${BUDDY_OPT} ./conv_2d_nhwc_fhwc_5x5_i8.mlir \ + -convert-linalg-to-gemmini \ + -convert-linalg-to-loops \ + -lower-gemmini | \ + ${BUDDY_TRANSLATE} -buddy-to-llvmir | \ + ${BUDDY_LLC} -filetype=obj -mtriple=riscv64 \ + -mattr=+buddyext,+D -float-abi=hard \ + -relocation-model=pic \ + -o log.o + @riscv64-unknown-linux-gnu-gcc -O2 -static log.o -o a.out + @spike --extension=gemmini pk a.out diff --git a/git b/git new file mode 100644 index 0000000000..e69de29bb2