diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 181c399d..8afad6a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,13 +34,16 @@ jobs: sudo apt-get install ccache sudo apt-get install lld + # install clang for LLVM build + - name: check clang version + run: clang --version + # setup LLVM - name: install a specific version of LLVM working-directory: ${{github.workspace}} run: | - git clone https://github.com/llvm/llvm-project.git + git clone --depth 1 --branch release/19.x https://github.com/llvm/llvm-project.git cd llvm-project - git checkout cd70802 mkdir build && cd build cmake -G Ninja ../llvm \ -DLLVM_ENABLE_PROJECTS="mlir" \ @@ -55,10 +58,16 @@ jobs: -DLLVM_ENABLE_LLD=ON \ -DMLIR_INSTALL_AGGREGATE_OBJECTS=ON \ -DLLVM_ENABLE_RTTI=ON \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache cmake --build . --target check-mlir + dpkg -l | grep llvm + sudo apt-get purge llvm-13 + sudo apt-get purge llvm-14 + sudo apt-get purge llvm-15 # setup mlir-cgra - name: setup dataflow tool-chain diff --git a/README.md b/README.md index 710df7e3..863df2b4 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,21 @@ Build LLVM & Neura -------------------------------------------------------- - - Clone llvm-project. - - - Clone this repo. - + - Clone llvm-project (we prefer llvm-19). +```sh +$ git clone --depth 1 --branch release/19.x https://github.com/llvm/llvm-project.git +``` - Build LLVM: - - Check out to commit `cd70802` (a stable version randomly picked, will sync to the latest version). - - Build: + > **Note:** +> `clang` is optional for building Neura itself, but installing and building `clang` together with `mlir` (by setting `-DLLVM_ENABLE_PROJECTS="clang;mlir"`) ensures that you have a `clang`/`clang++` matching the same LLVM/MLIR version (19). +> This is recommended if you want to use `clang++` for C++ to LLVM IR/MLIR workflows and to avoid version mismatch issues. + ```sh + $ cd llvm-project $ mkdir build && cd build # May need install ccache and lld. $ cmake -G Ninja ../llvm \ - -DLLVM_ENABLE_PROJECTS="mlir" \ + -DLLVM_ENABLE_PROJECTS="clang;mlir" \ -DLLVM_BUILD_EXAMPLES=OFF \ -DLLVM_TARGETS_TO_BUILD="Native" \ -DCMAKE_BUILD_TYPE=Release \ @@ -25,9 +28,14 @@ Build LLVM & Neura -DLLVM_ENABLE_LLD=ON \ -DMLIR_INSTALL_AGGREGATE_OBJECTS=ON \ -DLLVM_ENABLE_RTTI=ON \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache $ cmake --build . --target check-mlir + $ ninja + $ ninja check-clang check-mlir + $ export PATH=/workspace/llvm-project/build/bin:$PATH ``` - Build Neura: @@ -54,3 +62,24 @@ Build LLVM & Neura $ /workspace/llvm-project/build/bin/llvm-lit * ``` +Docker-based Environment Setup +-------------------------------------------------------- +**Option 1: Pull Pre-built Image** + +You can directly pull and use the pre-built Docker image: +```sh +$ docker pull cgra/neura:v1 +$ docker run --name myneura -it cgra/neura:v1 +``` + +**Option 2: Build Image from Dockerfile** + +Alternatively, you can build the Docker image yourself using the provided Dockerfile: +```sh +# In the root directory of this repo: +$ cd docker +$ docker build -t neura:v1 . +$ docker run --name myneura -it neura:v1 +``` + +Both methods will provide a consistent environment with LLVM/MLIR(version 19) and Neura built and ready to use. diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..dda4e3b9 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,61 @@ +FROM ubuntu:22.04 + +SHELL ["/bin/bash", "-c"] + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt install software-properties-common -y \ + && add-apt-repository ppa:deadsnakes/ppa -y \ + && apt update \ + && apt install python3.12 -y \ + && apt-get install ninja-build -y \ + && apt-get install ccache -y \ + && apt-get install lld -y \ + && apt-get install -y clang \ + && apt-get -y install build-essential cmake git libxml2-dev zlib1g-dev libncurses5-dev \ + && mkdir /cgra \ + && cd /cgra \ + && git clone https://github.com/yuqisun/dataflow.git \ + && cd dataflow \ + && until git clone --depth 1 --branch release/19.x https://github.com/llvm/llvm-project.git; do sleep 5; done \ + && cd llvm-project \ + && mkdir build && cd build \ + && cmake -G Ninja ../llvm \ + -DLLVM_ENABLE_PROJECTS="clang;mlir" \ + -DLLVM_BUILD_EXAMPLES=OFF \ + -DLLVM_TARGETS_TO_BUILD="Native" \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_ASSERTIONS=ON \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_CXX_STANDARD=17 \ + -DCMAKE_CXX_FLAGS="-std=c++17 -frtti" \ + -DLLVM_ENABLE_LLD=ON \ + -DMLIR_INSTALL_AGGREGATE_OBJECTS=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + # && cmake --build . --target check-mlir \ + && ninja \ + && ninja check-clang check-mlir \ + && dpkg -l | grep llvm \ + && cd /cgra/dataflow \ + && mkdir build && cd build \ + && cmake -G Ninja .. \ + -DLLVM_DIR=/cgra/dataflow/llvm-project/build/lib/cmake/llvm \ + -DMLIR_DIR=/cgra/dataflow/llvm-project/build/lib/cmake/mlir \ + -DMLIR_SOURCE_DIR=/cgra/dataflow/llvm-project/mlir \ + -DMLIR_BINARY_DIR=/cgra/dataflow/llvm-project/build \ + -DCMAKE_CXX_FLAGS="-std=c++17" \ + && ninja \ + && cd /cgra/dataflow/test \ + && /cgra/dataflow/llvm-project/build/bin/llvm-lit * -v + +ENV PATH=/cgra/dataflow/llvm-project/build/bin:$PATH + +CMD ["tail", "-f", "/dev/null"] + + diff --git a/test/c2llvm2mlir/test.mlir b/test/c2llvm2mlir/test.mlir index fb0bbb78..738a92c4 100644 --- a/test/c2llvm2mlir/test.mlir +++ b/test/c2llvm2mlir/test.mlir @@ -1,3 +1,9 @@ +// Note: +// We recommend using the clang++ built from the same LLVM/MLIR 19.x source. +// Please add your build directory to PATH before running tests: +// `export PATH=/path/to/llvm-project/build/bin:$PATH` +// This ensures all clang++ invocations use the same version. + // Compiles the original kernel. // RUN: clang++ kernel.cpp -o %t-kernel.out