diff --git a/.travis.yml b/.travis.yml index 00dec06d..f719ce86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,87 +1,83 @@ language: cpp -dist: bionic +dist: focal os: linux compiler: gcc - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - build-essential - - valgrind - - libpng-dev - - libboost-serialization-dev - - libstdc++6 - - hwloc -install: - # Install toolchain - - export TOOLDIR=$HOME/tools - - mkdir -p $TOOLDIR - - DESTDIR=$TOOLDIR ./ci/toolchain_install.sh --all - # Set environments - - export RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv-gnu-toolchain - - export LLVM_POCL=$TOOLDIR/llvm-pocl - - export LLVM_VORTEX=$TOOLDIR/llvm-vortex - - export VERILATOR_ROOT=$TOOLDIR/verilator - - export PATH=$VERILATOR_ROOT/bin:$PATH - - export SV2V_PATH=$TOOLDIR/sv2v - - export PATH=$SV2V_PATH/bin:$PATH - - export YOSYS_PATH=$TOOLDIR/yosys - - export PATH=$YOSYS_PATH/bin:$PATH - - export POCL_CC_PATH=$TOOLDIR/pocl/compiler - - export POCL_RT_PATH=$TOOLDIR/pocl/runtime - # build project - - cp -r $PWD ../build32 && cd ../build32 && make clean-all && make - - cp -r $PWD ../build64 && cd ../build64 && make clean-all && XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain make +addons: + apt: + packages: + - build-essential + - valgrind + - libstdc++6 + +env: + global: + - TOOLDIR=$HOME/tools + +cache: + directories: + - $TOOLDIR + - $HOME/build32 + - $HOME/build64 + +before_install: + - if [ ! -d "$TOOLDIR" ] || [ -z "$(ls -A $TOOLDIR)" ]; then + mkdir -p $TOOLDIR; + OSDIR=ubuntu/focal ./ci/toolchain_install.sh --all; + fi + - source ./ci/toolchain_env.sh -# stages ordering stages: + - setup - test jobs: include: - - stage: test + - stage: setup + script: + - rm -rf $HOME/build32 && cp -r $PWD $HOME/build32 + - rm -rf $HOME/build64 && cp -r $PWD $HOME/build64 + - make -C $HOME/build32 + - XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain make -C $HOME/build64 + - stage: test name: unittest - script: cp -r ../build32 ../build32_unittest && cd ../build32_unittest && ./ci/travis_run.py ./ci/regression.sh --unittest - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --unittest + - stage: test name: isa - script: cp -r ../build32 ../build32_isa && cd ../build32_isa && ./ci/travis_run.py ./ci/regression.sh --isa - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --isa + - stage: test name: isa64 - script: cp -r ../build64 ../build64_isa && cd ../build64_isa && XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain ./ci/travis_run.py ./ci/regression.sh --isa - - stage: test + script: cp -r $HOME/build64 build && cd build && XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain ./ci/travis_run.py ./ci/regression.sh --isa + - stage: test name: regression - script: cp -r ../build32 ../build32_regression && cd ../build32_regression && ./ci/travis_run.py ./ci/regression.sh --regression - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --regression + - stage: test name: regression64 - script: cp -r ../build64 ../build64_regression && cd ../build64_regression && XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain ./ci/travis_run.py ./ci/regression.sh --regression - - stage: test + script: cp -r $HOME/build64 build && cd build && XLEN=64 RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv64-gnu-toolchain ./ci/travis_run.py ./ci/regression.sh --regression + - stage: test name: opencl - script: cp -r ../build32 ../build32_opencl && cd ../build32_opencl && ./ci/travis_run.py ./ci/regression.sh --opencl - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --opencl + - stage: test name: cluster - script: cp -r ../build32 ../build32_cluster && cd ../build32_cluster && ./ci/travis_run.py ./ci/regression.sh --cluster - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --cluster + - stage: test name: config - script: cp -r ../build32 ../build32_config && cd ../build32_config && ./ci/travis_run.py ./ci/regression.sh --config + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --config - stage: test name: debug - script: cp -r ../build32 ../build32_debug && cd ../build32_debug && ./ci/travis_run.py ./ci/regression.sh --debug - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --debug + - stage: test name: stress0 - script: cp -r ../build32 ../build32_stress0 && cd ../build32_stress0 && ./ci/travis_run.py ./ci/regression.sh --stress0 - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --stress0 + - stage: test name: stress1 - script: cp -r ../build32 ../build32_stress1 && cd ../build32_stress1 && ./ci/travis_run.py ./ci/regression.sh --stress1 - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --stress1 + - stage: test name: synthesis - script: cp -r ../build32 ../build32_isa && cd ../build32_isa && ./ci/travis_run.py ./ci/regression.sh --synthesis - - stage: test + script: cp -r $HOME/build32 build && cd build && ./ci/travis_run.py ./ci/regression.sh --synthesis + - stage: test name: synthesis64 - script: cp -r ../build64 ../build64_isa && cd ../build64_isa && XLEN=64 ./ci/travis_run.py ./ci/regression.sh --synthesis - - stage: test - name: compiler - script: cp -r ../build32 ../build32_compiler && cd ../build32_compiler && ./ci/travis_run.py ./ci/test_compiler.sh + script: cp -r $HOME/build64 build && cd build && XLEN=64 ./ci/travis_run.py ./ci/regression.sh --synthesis after_success: # Gather code coverage diff --git a/README.md b/README.md index 5a122f91..34343a28 100644 --- a/README.md +++ b/README.md @@ -53,18 +53,11 @@ Vortex is a full-stack open-source RISC-V GPGPU. $ git clone --recursive https://github.com/vortexgpgpu/vortex.git $ cd Vortex ### Install prebuilt toolchain - $ ./ci/toolchain_install.sh --all - By default, the toolchain will install to /opt folder. - You can install the toolchain to a different directory by overiding DESTDIR. - - $ DESTDIR=$TOOLDIR ./ci/toolchain_install.sh --all - $ export VORTEX_HOME=$TOOLDIR/vortex - $ export LLVM_VORTEX=$TOOLDIR/llvm-vortex - $ export LLVM_POCL=$TOOLDIR/llvm-pocl - $ export RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv-gnu-toolchain - $ export VERILATOR_ROOT=$TOOLDIR/verilator - $ export PATH=$VERILATOR_ROOT/bin:$PATH + You can install the toolchain to a different directory by overriding TOOLDIR (e.g. export TOOLDIR=$HOME/tools). + + $ ./ci/toolchain_install.sh --all + $ source ./ci/toolchain_env.sh ### Build Vortex sources $ make -s ### Quick demo running vecadd OpenCL kernel on 2 cores diff --git a/ci/test_compiler.sh b/ci/test_compiler.sh deleted file mode 100755 index a270a060..00000000 --- a/ci/test_compiler.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Copyright © 2019-2023 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# exit when any command fails -set -e - -# clear POCL cache -rm -rf ~/.cache/pocl - -# force rebuild test kernels -make -C tests clean-all - -# ensure build -make -s - -# run tests -make -C tests/kernel run-simx -make -C tests/regression run-simx -make -C tests/opencl run-simx \ No newline at end of file diff --git a/ci/toolchain_env.sh b/ci/toolchain_env.sh new file mode 100644 index 00000000..4046a6a7 --- /dev/null +++ b/ci/toolchain_env.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# Copyright 2023 blaise +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +TOOLDIR=${TOOLDIR:=/opt} + +export RISCV_TOOLCHAIN_PATH=$TOOLDIR/riscv-gnu-toolchain +export LLVM_POCL=$TOOLDIR/llvm-pocl +export LLVM_VORTEX=$TOOLDIR/llvm-vortex +export VERILATOR_ROOT=$TOOLDIR/verilator +export PATH=$VERILATOR_ROOT/bin:$PATH +export SV2V_PATH=$TOOLDIR/sv2v +export PATH=$SV2V_PATH/bin:$PATH +export YOSYS_PATH=$TOOLDIR/yosys +export PATH=$YOSYS_PATH/bin:$PATH +export POCL_CC_PATH=$TOOLDIR/pocl/compiler +export POCL_RT_PATH=$TOOLDIR/pocl/runtime diff --git a/ci/toolchain_install.sh b/ci/toolchain_install.sh index 69c20327..0fa38c36 100755 --- a/ci/toolchain_install.sh +++ b/ci/toolchain_install.sh @@ -17,50 +17,50 @@ set -e REPOSITORY=https://github.com/vortexgpgpu/vortex-toolchain-prebuilt/raw/master - -DESTDIR="${DESTDIR:=/opt}" +TOOLDIR=${TOOLDIR:=/opt} +OSDIR=${OSDIR:=ubuntu/bionic} OS="${OS:=ubuntu/bionic}" riscv() { - case $OS in + case $OSDIR in "centos/7") parts=$(eval echo {a..h}) ;; *) parts=$(eval echo {a..j}) ;; esac rm -f riscv-gnu-toolchain.tar.bz2.parta* for x in $parts do - wget $REPOSITORY/riscv-gnu-toolchain/$OS/riscv-gnu-toolchain.tar.bz2.parta$x + wget $REPOSITORY/riscv-gnu-toolchain/$OSDIR/riscv-gnu-toolchain.tar.bz2.parta$x done cat riscv-gnu-toolchain.tar.bz2.parta* > riscv-gnu-toolchain.tar.bz2 tar -xvf riscv-gnu-toolchain.tar.bz2 - cp -r riscv-gnu-toolchain $DESTDIR + cp -r riscv-gnu-toolchain $TOOLDIR rm -f riscv-gnu-toolchain.tar.bz2* rm -rf riscv-gnu-toolchain } riscv64() { - case $OS in + case $OSDIR in "centos/7") parts=$(eval echo {a..h}) ;; *) parts=$(eval echo {a..j}) ;; esac rm -f riscv64-gnu-toolchain.tar.bz2.parta* for x in $parts do - wget $REPOSITORY/riscv64-gnu-toolchain/$OS/riscv64-gnu-toolchain.tar.bz2.parta$x + wget $REPOSITORY/riscv64-gnu-toolchain/$OSDIR/riscv64-gnu-toolchain.tar.bz2.parta$x done cat riscv64-gnu-toolchain.tar.bz2.parta* > riscv64-gnu-toolchain.tar.bz2 tar -xvf riscv64-gnu-toolchain.tar.bz2 - cp -r riscv64-gnu-toolchain $DESTDIR + cp -r riscv64-gnu-toolchain $TOOLDIR rm -f riscv64-gnu-toolchain.tar.bz2* rm -rf riscv64-gnu-toolchain } llvm-vortex() { - case $OS in + case $OSDIR in "centos/7") parts=$(eval echo {a..b}) ;; *) parts=$(eval echo {a..b}) ;; esac @@ -68,18 +68,18 @@ llvm-vortex() rm -f llvm-vortex.tar.bz2.parta* for x in $parts do - wget $REPOSITORY/llvm-vortex/$OS/llvm-vortex.tar.bz2.parta$x + wget $REPOSITORY/llvm-vortex/$OSDIR/llvm-vortex.tar.bz2.parta$x done cat llvm-vortex.tar.bz2.parta* > llvm-vortex.tar.bz2 tar -xvf llvm-vortex.tar.bz2 - cp -r llvm-vortex $DESTDIR + cp -r llvm-vortex $TOOLDIR rm -f llvm-vortex.tar.bz2* rm -rf llvm-vortex } llvm-pocl() { - case $OS in + case $OSDIR in "centos/7") parts=$(eval echo {a..b}) ;; *) parts=$(eval echo {a..b}) ;; esac @@ -87,45 +87,45 @@ llvm-pocl() rm -f llvm-pocl.tar.bz2.parta* for x in $parts do - wget $REPOSITORY/llvm-pocl/$OS/llvm-pocl.tar.bz2.parta$x + wget $REPOSITORY/llvm-pocl/$OSDIR/llvm-pocl.tar.bz2.parta$x done cat llvm-pocl.tar.bz2.parta* > llvm-pocl.tar.bz2 tar -xvf llvm-pocl.tar.bz2 - cp -r llvm-pocl $DESTDIR + cp -r llvm-pocl $TOOLDIR rm -f llvm-pocl.tar.bz2* rm -rf llvm-pocl } pocl() { - wget $REPOSITORY/pocl/$OS/pocl.tar.bz2 + wget $REPOSITORY/pocl/$OSDIR/pocl.tar.bz2 tar -xvf pocl.tar.bz2 rm -f pocl.tar.bz2 - cp -r pocl $DESTDIR + cp -r pocl $TOOLDIR rm -rf pocl } verilator() { - wget $REPOSITORY/verilator/$OS/verilator.tar.bz2 + wget $REPOSITORY/verilator/$OSDIR/verilator.tar.bz2 tar -xvf verilator.tar.bz2 - cp -r verilator $DESTDIR + cp -r verilator $TOOLDIR rm -f verilator.tar.bz2 rm -rf verilator } sv2v() { - wget $REPOSITORY/sv2v/$OS/sv2v.tar.bz2 + wget $REPOSITORY/sv2v/$OSDIR/sv2v.tar.bz2 tar -xvf sv2v.tar.bz2 rm -f sv2v.tar.bz2 - cp -r sv2v $DESTDIR + cp -r sv2v $TOOLDIR rm -rf sv2v } yosys() { - case $OS in + case $OSDIR in "centos/7") parts=$(eval echo {a..c}) ;; *) parts=$(eval echo {a..c}) ;; esac @@ -133,11 +133,11 @@ yosys() rm -f yosys.tar.bz2.parta* for x in $parts do - wget $REPOSITORY/yosys/$OS/yosys.tar.bz2.parta$x + wget $REPOSITORY/yosys/$OSDIR/yosys.tar.bz2.parta$x done cat yosys.tar.bz2.parta* > yosys.tar.bz2 tar -xvf yosys.tar.bz2 - cp -r yosys $DESTDIR + cp -r yosys $TOOLDIR rm -f yosys.tar.bz2* rm -rf yosys } @@ -160,20 +160,19 @@ while [ "$1" != "" ]; do ;; --llvm-vortex ) llvm-vortex ;; - --llvm-pocl ) llvm-pocl + --llvm-pocl ) llvm-pocl ;; --sv2v ) sv2v ;; --yosys ) yosys ;; - --all ) riscv - riscv64 - llvm-vortex - llvm-pocl - pocl + --all ) pocl verilator sv2v yosys + llvm-vortex + riscv + riscv64 ;; -h | --help ) show_usage exit diff --git a/ci/toolchain_prebuilt.sh b/ci/toolchain_prebuilt.sh index acd5fb3f..d819858a 100755 --- a/ci/toolchain_prebuilt.sh +++ b/ci/toolchain_prebuilt.sh @@ -16,77 +16,72 @@ # exit when any command fails set -e -OS_DIR=${OS_DIR:-'ubuntu/bionic'} -SRCDIR=${SRCDIR:-'/opt'} -DESTDIR=${DESTDIR:-'.'} - -echo "OS_DIR=${OS_DIR}" -echo "SRCDIR=${SRCDIR}" -echo "DESTDIR=${DESTDIR}" +TOOLDIR=${TOOLDIR:=/opt} +OSDIR=${OSDIR:=ubuntu/bionic} riscv() { echo "prebuilt riscv-gnu-toolchain..." - tar -C $SRCDIR -cvjf riscv-gnu-toolchain.tar.bz2 riscv-gnu-toolchain + tar -C $TOOLDIR -cvjf riscv-gnu-toolchain.tar.bz2 riscv-gnu-toolchain split -b 50M riscv-gnu-toolchain.tar.bz2 "riscv-gnu-toolchain.tar.bz2.part" - mv riscv-gnu-toolchain.tar.bz2.part* $DESTDIR/riscv-gnu-toolchain/$OS_DIR + mv riscv-gnu-toolchain.tar.bz2.part* ./riscv-gnu-toolchain/$OSDIR rm riscv-gnu-toolchain.tar.bz2 } riscv64() { echo "prebuilt riscv64-gnu-toolchain..." - tar -C $SRCDIR -cvjf riscv64-gnu-toolchain.tar.bz2 riscv64-gnu-toolchain + tar -C $TOOLDIR -cvjf riscv64-gnu-toolchain.tar.bz2 riscv64-gnu-toolchain split -b 50M riscv64-gnu-toolchain.tar.bz2 "riscv64-gnu-toolchain.tar.bz2.part" - mv riscv64-gnu-toolchain.tar.bz2.part* $DESTDIR/riscv64-gnu-toolchain/$OS_DIR + mv riscv64-gnu-toolchain.tar.bz2.part* ./riscv64-gnu-toolchain/$OSDIR rm riscv64-gnu-toolchain.tar.bz2 } llvm-vortex() { echo "prebuilt llvm-vortex..." - tar -C $SRCDIR -cvjf llvm-vortex.tar.bz2 llvm-vortex + tar -C $TOOLDIR -cvjf llvm-vortex.tar.bz2 llvm-vortex split -b 50M llvm-vortex.tar.bz2 "llvm-vortex.tar.bz2.part" - mv llvm-vortex.tar.bz2.part* $DESTDIR/llvm-vortex/$OS_DIR + mv llvm-vortex.tar.bz2.part* ./llvm-vortex/$OSDIR rm llvm-vortex.tar.bz2 } llvm-pocl() { echo "prebuilt llvm-pocl..." - tar -C $SRCDIR -cvjf llvm-pocl.tar.bz2 llvm-pocl + tar -C $TOOLDIR -cvjf llvm-pocl.tar.bz2 llvm-pocl split -b 50M llvm-pocl.tar.bz2 "llvm-pocl.tar.bz2.part" - mv llvm-pocl.tar.bz2.part* $DESTDIR/llvm-pocl/$OS_DIR + mv llvm-pocl.tar.bz2.part* ./llvm-pocl/$OSDIR rm llvm-pocl.tar.bz2 } pocl() { echo "prebuilt pocl..." - tar -C $SRCDIR -cvjf pocl.tar.bz2 pocl - mv pocl.tar.bz2 $DESTDIR/pocl/$OS_DIR + tar -C $TOOLDIR -cvjf pocl.tar.bz2 pocl + mv pocl.tar.bz2 ./pocl/$OSDIR } verilator() { echo "prebuilt verilator..." - tar -C $SRCDIR -cvjf verilator.tar.bz2 verilator - mv verilator.tar.bz2 $DESTDIR/verilator/$OS_DIR + tar -C $TOOLDIR -cvjf verilator.tar.bz2 verilator + mv verilator.tar.bz2 ./verilator/$OSDIR } sv2v() { echo "prebuilt sv2v..." - tar -C $SRCDIR -cvjf sv2v.tar.bz2 sv2v - mv sv2v.tar.bz2 $DESTDIR/sv2v/$OS_DIR + tar -C $TOOLDIR -cvjf sv2v.tar.bz2 sv2v + mv sv2v.tar.bz2 ./sv2v/$OSDIR } yosys() { echo "prebuilt yosys..." - tar -C $SRCDIR -cvjf yosys.tar.bz2 yosys + tar -C $TOOLDIR -cvjf yosys.tar.bz2 yosys split -b 50M yosys.tar.bz2 "yosys.tar.bz2.part" - mv yosys.tar.bz2.part* $DESTDIR/yosys/$OS_DIR + mv yosys.tar.bz2.part* ./yosys/$OSDIR rm yosys.tar.bz2 } diff --git a/ci/travis_run.py b/ci/travis_run.py index eaa85275..f55a4b0a 100755 --- a/ci/travis_run.py +++ b/ci/travis_run.py @@ -21,7 +21,7 @@ import subprocess # This script executes a long-running command while outputing "still running ..." periodically # to notify Travis build system that the program has not hanged -PING_INTERVAL=15 +PING_INTERVAL=300 # 5 minutes def monitor(stop): wait_time = 0 diff --git a/sim/opaesim/Makefile b/sim/opaesim/Makefile index 439b41b3..3b906bc5 100644 --- a/sim/opaesim/Makefile +++ b/sim/opaesim/Makefile @@ -116,7 +116,7 @@ CXXFLAGS += -DNOPAE PROJECT = libopae-c-sim.so -all: $(PROJECT) +all: $(DESTDIR)/$(PROJECT) $(DESTDIR)/vortex.xml: verilator --xml-only -O0 $(VL_FLAGS) $(TOP) --xml-output $(DESTDIR)/vortex.xml diff --git a/sim/rtlsim/Makefile b/sim/rtlsim/Makefile index 1dd8a731..1d43ea4f 100644 --- a/sim/rtlsim/Makefile +++ b/sim/rtlsim/Makefile @@ -85,7 +85,7 @@ endif PROJECT = rtlsim -all: $(PROJECT) +all: $(DESTDIR)/$(PROJECT) $(DESTDIR)/$(PROJECT): $(SRCS) main.cpp verilator --build $(VL_FLAGS) $^ -CFLAGS '$(CXXFLAGS) -DSTARTUP_ADDR=0x80000000' -LDFLAGS '$(LDFLAGS)' -o ../$@ diff --git a/tests/opencl/common.mk b/tests/opencl/common.mk index 8a3dc21e..fc55ee0a 100644 --- a/tests/opencl/common.mk +++ b/tests/opencl/common.mk @@ -38,6 +38,7 @@ K_LDFLAGS += -Wl,-Bstatic,--gc-sections,-T$(VORTEX_KN_PATH)/linker/vx_link$(XLE CXXFLAGS += -std=c++11 -Wall -Wextra -Wfatal-errors CXXFLAGS += -Wno-deprecated-declarations -Wno-unused-parameter -Wno-narrowing +CXXFLAGS += -pthread CXXFLAGS += -I$(POCL_RT_PATH)/include LDFLAGS += -L$(POCL_RT_PATH)/lib -L$(VORTEX_RT_PATH)/stub -lvortex