Skip to content

Commit

Permalink
[RVV] Add RVV environment guide and update examples.
Browse files Browse the repository at this point in the history
  • Loading branch information
zhanghb97 committed Jun 27, 2024
1 parent b227b88 commit 4b142bb
Show file tree
Hide file tree
Showing 7 changed files with 569 additions and 206 deletions.
19 changes: 19 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ project(buddy-mlir LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
include(ExternalProject)

#-------------------------------------------------------------------------------
# Options and settings
Expand Down Expand Up @@ -188,6 +189,24 @@ if(BUDDY_MLIR_USE_MIMALLOC)
find_package(mimalloc REQUIRED)
endif()

#-------------------------------------------------------------------------------
# The RISC-V toolchain
#-------------------------------------------------------------------------------

if(BUDDY_MLIR_ENABLE_RISCV_GNU_TOOLCHAIN)
set(RISCV_GNU_TOOLCHAIN_DIR "${BUDDY_SOURCE_DIR}/thirdparty/riscv-gnu-toolchain")
set(RISCV_GNU_TOOLCHAIN_INSTALL_DIR "${CMAKE_BINARY_DIR}/thirdparty/riscv-gnu-toolchain")
ExternalProject_Add(
riscv-gnu-toolchain
SOURCE_DIR ${RISCV_GNU_TOOLCHAIN_DIR}
PREFIX ${RISCV_GNU_TOOLCHAIN_INSTALL_DIR}
CONFIGURE_COMMAND ${RISCV_GNU_TOOLCHAIN_DIR}/configure --prefix=${RISCV_GNU_TOOLCHAIN_INSTALL_DIR}
BUILD_COMMAND make clean && make linux build-qemu -j
BUILD_IN_SOURCE TRUE
INSTALL_COMMAND ""
)
endif()

#-------------------------------------------------------------------------------
# Initialize Python packages
#-------------------------------------------------------------------------------
Expand Down
153 changes: 153 additions & 0 deletions docs/RVVEnviroment.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Environment Setup Guide for MLIR and RVV Testing and Experiments

This guide provides instructions on setting up an environment to test the RISC-V Vector Extension using the buddy-mlir project.
The target platform for emulation is QEMU.

## Requirements

Before proceed any further make sure that you installed dependencies below

* [LLVM dependecies](https://llvm.org/docs/GettingStarted.html#requirements)
* [GNU Toolchain dependecies](https://github.com/riscv-collab/riscv-gnu-toolchain#prerequisites)
* [QEMU dependecies](https://wiki.qemu.org/Hosts/Linux)

## Build Steps

> **_NOTE:_** The build process includes several heavy stages. It may take significant time to clone and build all components.
0. Prepare `buddy-mlir` and Submodules

```
$ git clone https://github.com/buddy-compiler/buddy-mlir.git
$ cd buddy-mlir
$ git submodule update --init
```

1. Build Local LLVM/MLIR

```
$ cd buddy-mlir
$ mkdir llvm/build
$ cd llvm/build
$ cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir;clang;openmp" \
-DLLVM_TARGETS_TO_BUILD="host;RISCV" \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DOPENMP_ENABLE_LIBOMPTARGET=OFF \
-DCMAKE_BUILD_TYPE=RELEASE \
-DMLIR_ENABLE_BINDINGS_PYTHON=ON \
-DPython3_EXECUTABLE=$(which python3)
$ ninja check-clang check-mlir omp
$ export BUILD_LOCAL_LLVM_DIR=$PWD
```

2. Build Local `buddy-mlir`

```
$ cd buddy-mlir
$ mkdir build
$ cd build
$ cmake -G Ninja .. \
-DMLIR_DIR=$PWD/../llvm/build/lib/cmake/mlir \
-DLLVM_DIR=$PWD/../llvm/build/lib/cmake/llvm \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DCMAKE_BUILD_TYPE=RELEASE \
-DBUDDY_MLIR_ENABLE_RISCV_GNU_TOOLCHAIN=ON \
-DBUDDY_MLIR_ENABLE_PYTHON_PACKAGES=ON \
-DPython3_EXECUTABLE=$(which python3)
$ ninja
$ ninja check-buddy
$ export BUILD_RISCV_GNU_TOOLCHAIN_DIR=$PWD/thirdparty/riscv-gnu-toolchain/
$ export RISCV_GNU_TOOLCHAIN_SYSROOT_DIR=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}/sysroot/
```

3. Build Cross-Compiled Clang

```
$ cd buddy-mlir
$ mkdir llvm/build-cross-clang-rv
$ cd llvm/build-cross-clang-rv
$ cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="clang" \
-DLLVM_TARGETS_TO_BUILD="RISCV" \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_C_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang \
-DCMAKE_CXX_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang++ \
-DCMAKE_C_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DCMAKE_CXX_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DLLVM_TABLEGEN=${BUILD_LOCAL_LLVM_DIR}/bin/llvm-tblgen \
-DCLANG_TABLEGEN=${BUILD_LOCAL_LLVM_DIR}/bin/clang-tblgen \
-DLLVM_DEFAULT_TARGET_TRIPLE=riscv64-unknown-linux-gnu \
-DLLVM_TARGET_ARCH=RISCV64 \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ZSTD=Off
$ ninja clang lli
```

4. Build Cross-Compiled MLIR

```
$ cd buddy-mlir
$ mkdir llvm/build-cross-mlir-rv
$ cd llvm/build-cross-mlir-rv
$ cmake -G Ninja ../../llvm/llvm \
-DLLVM_ENABLE_PROJECTS="mlir" \
-DLLVM_BUILD_EXAMPLES=OFF \
-DCMAKE_CROSSCOMPILING=True \
-DLLVM_TARGET_ARCH=RISCV64 \
-DLLVM_TARGETS_TO_BUILD=RISCV \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_NATIVE_ARCH=RISCV \
-DLLVM_HOST_TRIPLE=riscv64-unknown-linux-gnu \
-DLLVM_DEFAULT_TARGET_TRIPLE=riscv64-unknown-linux-gnu \
-DCMAKE_C_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang \
-DCMAKE_CXX_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang++ \
-DCMAKE_C_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DCMAKE_CXX_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DMLIR_TABLEGEN=${BUILD_LOCAL_LLVM_DIR}/bin/mlir-tblgen \
-DLLVM_TABLEGEN=${BUILD_LOCAL_LLVM_DIR}/bin/llvm-tblgen \
-DMLIR_LINALG_ODS_YAML_GEN=${BUILD_LOCAL_LLVM_DIR}/bin/mlir-linalg-ods-yaml-gen \
-DMLIR_PDLL_TABLEGEN=${BUILD_LOCAL_LLVM_DIR}/bin/mlir-pdll \
-DLLVM_ENABLE_ZSTD=Off
$ ninja
$ export BUILD_CROSS_MLIR_DIR=$PWD
```

5. Build Cross-Compiled `buddy-mlir`

```
$ cd buddy-mlir
$ mkdir build-cross-rv
$ cd build-cross-rv
$ cmake -G Ninja .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DMLIR_DIR=${BUILD_CROSS_MLIR_DIR}/lib/cmake/mlir \
-DLLVM_DIR=${BUILD_CROSS_MLIR_DIR}/lib/cmake/llvm \
-DCMAKE_CROSSCOMPILING=True \
-DLLVM_TARGETS_TO_BUILD=RISCV \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_NATIVE_ARCH=RISCV \
-DLLVM_HOST_TRIPLE=riscv64-unknown-linux-gnu \
-DCMAKE_C_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang \
-DCMAKE_CXX_COMPILER=${BUILD_LOCAL_LLVM_DIR}/bin/clang++ \
-DCMAKE_C_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DCMAKE_CXX_FLAGS="--target=riscv64-unknown-linux-gnu --sysroot=${RISCV_GNU_TOOLCHAIN_SYSROOT_DIR} --gcc-toolchain=${BUILD_RISCV_GNU_TOOLCHAIN_DIR}" \
-DLLVM_ENABLE_ZSTD=Off
$ ninja StaticMLIRCRunnerUtils StaticMLIRRunnerUtils
```

## Testing RVV Environment

```
$ cd buddy-mlir
$ cd examples/RVVDialect/
$ make rvv-mul-add-run
// Expected Output:
Unranked Memref base@ = 0x55555729aaa0 rank = 1 offset = 0 sizes = [20] strides = [1] data =
[0, 12, 26, 42, 60, 80, 102, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

Congratulations! Your RVV environment is now fully set up. Enjoy exploring and testing!
35 changes: 0 additions & 35 deletions docs/rvv-enviroment.md

This file was deleted.

74 changes: 56 additions & 18 deletions examples/RVVDialect/makefile
Original file line number Diff line number Diff line change
@@ -1,18 +1,48 @@
#!/bin/bash
BUDDY_OPT := ../../build/bin/buddy-opt
BUDDY_TRANSLATE := ../../build/bin/buddy-translate
LLC := ../../llvm/build/bin/llc

# Build Directories
MLIR_BUILD_DIR := ../../llvm/build/
BUDDY_MLIR_BUILD_DIR := ../../build/
CROSS_BUDDY_MLIR_BUILD_DIR := ../../build-cross-rv/
CROSS_LLVM_BUILD_DIR := ../../llvm/build-cross-clang-rv/
CROSS_MLIR_BUILD_DIR := ../../llvm/build-cross-mlir-rv/

# Buddy MLIR Tools
BUDDY_OPT := ${BUDDY_MLIR_BUILD_DIR}/bin/buddy-opt
BUDDY_TRANSLATE := ${BUDDY_MLIR_BUILD_DIR}/bin/buddy-translate

# Core LLVM/MLIR Tools
MLIR_OPT := ${MLIR_BUILD_DIR}/bin/mlir-opt
MLIR_TRANSLATE := ${MLIR_BUILD_DIR}/bin/mlir-translate
MLIR_CPU_RUNNER := ${MLIR_BUILD_DIR}/bin/mlir-cpu-runner
LLC := ${MLIR_BUILD_DIR}/bin/llc
LOCAL_CLANG := ${MLIR_BUILD_DIR}/bin/clang

# RISC-V GNU Toolchain
RISCV_GNU_TOOLCHAIN := ${BUDDY_MLIR_BUILD_DIR}/thirdparty/riscv-gnu-toolchain
RISCV_GNU_TOOLCHAIN_SYSROOT := ${RISCV_GNU_TOOLCHAIN}/sysroot
QEMU := ${RISCV_GNU_TOOLCHAIN}/bin/qemu-riscv64

# Cross Compiled Toolchain
CROSS_BUDDY_MLIR_LIB := ${CROSS_BUDDY_MLIR_BUILD_DIR}/lib/
CROSS_LLI := ${CROSS_LLVM_BUILD_DIR}/bin/lli
CROSS_MLIR_CPU_RUNNER := ${CROSS_MLIR_BUILD_DIR}/bin/mlir-cpu-runner
CROSS_MLIR_C_RUNNER_UTILS := ${CROSS_MLIR_BUILD_DIR}/lib/libmlir_c_runner_utils.so
CROSS_MLIR_RUNNER_UTILS := ${CROSS_MLIR_BUILD_DIR}/lib/libmlir_runner_utils.so
CROSS_MLIR_LIB := ${CROSS_MLIR_BUILD_DIR}/lib

# Optimization Flag
OPT_FLAG := -O0

RISCV_GNU_TOOLCHAIN := ../../thirdparty/build-riscv-gnu-toolchain
RISCV_GNU_TOOLCHAIN_SYSROOT := ../../thirdparty/build-riscv-gnu-toolchain/sysroot
QEMU := ../../thirdparty/qemu/build/riscv64-linux-user/qemu-riscv64
LOCAL_CLANG := ../../thirdparty/build-local-clang/bin/clang
CROSS_LLI := ../../thirdparty/build-cross-clang/bin/lli
CROSS_MLIR_CPU_RUNNER := ../../thirdparty/build-cross-mlir/bin/mlir-cpu-runner
CROSS_MLIR_C_RUNNER_UTILS := ../../thirdparty/build-cross-mlir/lib/libmlir_c_runner_utils.so
CROSS_MLIR_RUNNER_UTILS := ../../thirdparty/build-cross-mlir/lib/libmlir_runner_utils.so
CROSS_MLIR_LIB := ../../thirdparty/build-cross-mlir/lib
ifeq ($(shell uname),Linux)
MLIR_RUNNER_UTILS := ${MLIR_BUILD_DIR}/lib/libmlir_runner_utils.so
MLIR_C_RUNNER_UTILS := ${MLIR_BUILD_DIR}//lib/libmlir_c_runner_utils.so
MTRIPLE := x86_64-unknown-linux-gnu
else ifeq ($(shell uname),Darwin)
MLIR_RUNNER_UTILS := ${MLIR_BUILD_DIR}/lib/libmlir_runner_utils.dylib
MLIR_C_RUNNER_UTILS := ${MLIR_BUILD_DIR}/lib/libmlir_c_runner_utils.dylib
MTRIPLE := x86_64-apple-darwin
endif

rvv-setvl-lower:
@${BUDDY_OPT} ./rvv-setvl.mlir \
Expand Down Expand Up @@ -43,7 +73,7 @@ rvv-setvl-128-run:
-convert-func-to-llvm \
-reconcile-unrealized-casts | \
${BUDDY_TRANSLATE} -buddy-to-llvmir | \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu rv64,x-v=true,vlen=128 \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu max \
${CROSS_LLI} -march=riscv64 -mattr=+m,+d,+v \
-dlopen=${CROSS_MLIR_C_RUNNER_UTILS}

Expand All @@ -56,7 +86,7 @@ rvv-setvl-256-run:
-convert-func-to-llvm \
-reconcile-unrealized-casts | \
${BUDDY_TRANSLATE} -buddy-to-llvmir | \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu rv64,x-v=true,vlen=256 \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu max \
${CROSS_LLI} -march=riscv64 -mattr=+m,+d,+v \
-dlopen=${CROSS_MLIR_C_RUNNER_UTILS}

Expand Down Expand Up @@ -87,7 +117,7 @@ rvv-rsqrt-aot:
@${RISCV_GNU_TOOLCHAIN}/bin/riscv64-unknown-linux-gnu-gcc log.o -mabi=lp64d \
-L${CROSS_MLIR_LIB} -lmlir_runner_utils -lmlir_c_runner_utils \
-o a.out
@LD_LIBRARY_PATH=${CROSS_MLIR_LIB} ${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu rv64,x-v=true,vlen=128 a.out
@LD_LIBRARY_PATH=${CROSS_MLIR_LIB} ${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu max a.out

rvv-mul-add-lower:
@${BUDDY_OPT} ./rvv-mul-add.mlir \
Expand Down Expand Up @@ -122,7 +152,7 @@ rvv-mul-add-run:
-reconcile-unrealized-casts | \
${BUDDY_TRANSLATE} --buddy-to-llvmir | \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} \
-cpu rv64,x-v=true,vlen=128 \
-cpu max \
${CROSS_LLI} -march=riscv64 -mattr=+m,+d,+v \
-dlopen=${CROSS_MLIR_C_RUNNER_UTILS} \
-dlopen=${CROSS_MLIR_RUNNER_UTILS}
Expand All @@ -132,6 +162,8 @@ rvv-stripmining-lower:
-convert-scf-to-cf \
-convert-math-to-llvm \
-lower-rvv \
-convert-vector-to-scf \
-convert-scf-to-cf \
-convert-vector-to-llvm \
-finalize-memref-to-llvm \
-convert-func-to-llvm \
Expand All @@ -143,6 +175,8 @@ rvv-stripmining-translate:
-convert-scf-to-cf \
-convert-math-to-llvm \
-lower-rvv \
-convert-vector-to-scf \
-convert-scf-to-cf \
-convert-vector-to-llvm \
-finalize-memref-to-llvm \
-convert-func-to-llvm \
Expand All @@ -154,13 +188,15 @@ rvv-stripmining-run:
-convert-scf-to-cf \
-convert-math-to-llvm \
-lower-rvv \
-convert-vector-to-scf \
-convert-scf-to-cf \
-convert-vector-to-llvm \
-finalize-memref-to-llvm \
-convert-func-to-llvm \
-reconcile-unrealized-casts | \
${BUDDY_TRANSLATE} --buddy-to-llvmir | \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} \
-cpu rv64,x-v=true,vlen=128 \
-cpu max \
${CROSS_LLI} -march=riscv64 -mattr=+m,+d,+v \
-dlopen=${CROSS_MLIR_C_RUNNER_UTILS} \
-dlopen=${CROSS_MLIR_RUNNER_UTILS}
Expand All @@ -170,6 +206,8 @@ rvv-stripmining-aot:
-convert-scf-to-cf \
-convert-math-to-llvm \
-lower-rvv \
-convert-vector-to-scf \
-convert-scf-to-cf \
-convert-vector-to-llvm \
-finalize-memref-to-llvm \
-convert-func-to-llvm \
Expand All @@ -182,4 +220,4 @@ rvv-stripmining-aot:
-L${CROSS_MLIR_LIB} -lmlir_runner_utils -lmlir_c_runner_utils \
-o a.out
@LD_LIBRARY_PATH=${CROSS_MLIR_LIB} \
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu rv64,x-v=true,vlen=128 a.out
${QEMU} -L ${RISCV_GNU_TOOLCHAIN_SYSROOT} -cpu max a.out
Loading

0 comments on commit 4b142bb

Please sign in to comment.