VOLT is an end-to-end, open-source compiler framework for the Vortex open-source GPU and its variants. It supports multiple front-end languages, including CUDA and OpenCL, by extending two open-source projects, PoCL and CuPBoP. VOLT also extends LLVM to enable SIMT-aware IR-level optimizations for portability across GPU variants, and augments LLVM-RISC-V to provide full support for the Vortex ISA.
The figure shows an overview of VOLT, with the modules extended or introduced by VOLT highlighted in blue.
The VOLT paper was accepted to CC 2026 and will appear in January 2026.
Arixv Paper (link)
@misc{jeong2025insidevoltdesigningopensource,
title={Inside VOLT: Designing an Open-Source GPU Compiler},
author={Shinnung Jeong and Chihyo Ahn and Huanzhi Pu and Jisheng Zhao and Hyesoon Kim and Blaise Tine},
year={2025},
eprint={2511.13751},
archivePrefix={arXiv},
primaryClass={cs.DC},
url={https://arxiv.org/abs/2511.13751},
}<VOLT>
├── tools # location of libraries and bin files
│ ├── libc32
│ ├── libc64
│ ├── libcrt32
│ ├── libcrt64
│ ├── llvm-vortex
│ ├── pocl
│ ├── riscv32-gnu-toolchain
│ ├── riscv64-gnu-toolchain
│ ├── sv2v
│ ├── verilator
│ ├── vortex
│ └── yosys
├── pocl
├── llvm-vortex
└── vortexcd Volt
mkdir tools export PRJ=<path-to-volt-folder>
export TOOL_DIR=$PRJ/tools
export VORTEX_PREFIX=$TOOL_DIR/vortex
export LLVM_PREFIX=$TOOL_DIR/llvm-vortex
export POCL_PREFIX=$TOOL_DIR/pocl
source $PRJ/vortex/build/ci/toolchain_env.shcd $PRJ/vortex
sudo ./ci/install_dependencies.sh
mkdir build && cd build
../configure --xlen=64 --tooldir=$TOOL_DIR --prefix=$VORTEX_PREFIX #setup 32bit
./ci/toolchain_install.sh --all # install prebuilt toolchain
source ./ci/toolchain_env.sh
make -s
make install
./ci/blackbox.sh --cores=2 --app=opencl/vecadd # testcd $PRJ
mv $LLVM_PREFIX $TOOL_DIR/llvm-vortex-prebuilt
mkdir $TOOL_DIR/llvm-vortex
cd llvm
mkdir build && cd build
export RISCV_TOOLCHAIN_ELF_PATH=$PRJ/tools/riscv64-gnu-toolchain/riscv64-unknown-elf
cmake -G "Unix Makefiles" -DLLVM_ABI_BREAKING_CHECKS=FORCE_OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DBUILD_SHARED_LIBS=True -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_INSTALL_PREFIX=$LLVM_PREFIX -DDEFAULT_SYSROOT=$RISCV_TOOLCHAIN_ELF_PATH -DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" -DLLVM_TARGETS_TO_BUILD="X86;RISCV;NVPTX" ../llvm
make -j`nproc`
make installcd $PRJ
mv $POCL_PREFIX $TOOL_DIR/pocl-vortex-prebuilt
mkdir $TOOL_DIR/pocl-vortex
cd $PRJ/pocl
mkdir build && cd build
cmake -G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=$POCL_PREFIX \
-DWITH_LLVM_CONFIG=$LLVM_PREFIX/bin/llvm-config \
-DVORTEX_HOME=$VORTEX_HOME \
-DVORTEX_BUILD=$VORTEX_PREFIX \
-DENABLE_VORTEX=ON \
-DKERNEL_CACHE_DEFAULT=OFF \
-DENABLE_HOST_CPU_DEVICES=OFF \
-DENABLE_TESTS=OFF \
-DPOCL_DEBUG_MESSAGES=ON \
-DENABLE_ICD=OFF ..
make -j`nproc`
make installcd $PRJ/cupbop
export CuPBoP_PATH=pwd
export LD_LIBRARY_PATH=$CuPBoP_PATH/build/runtime:$CuPBoP_PATH/build/runtime/threadPool:$LD_LIBRARY_PATH
wget "https://dl.dropboxusercontent.com/scl/fi/m9ap1tiybau4zk720t2z7/cuda-header.tar.gz?rlkey=zmdpst5l66t48ywrbtkj426nu&st=luao6zy7" -O cuda-header.tar.gz
tar -xzf 'cuda-header.tar.gz'
cp -r include/* runtime/threadPool/include/
wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run
mkdir -p cuda-12.1
sh cuda_12.1.1_530.30.02_linux.run --silent --toolkit --toolkitpath=$CuPBoP_PATH/cuda-12.1
$CuPBoP_PATH/CuPBoP_env_setup.sh
export VORTEX_ARCHITECTUE = 64 # 64 if using 64-bit vortex
mkdir build && cd build
cmake .. -DLLVM_CONFIG_PATH=`which llvm-config` # need path to llvm-config
make Extend the config file (add to the bash file)
export RISCV_TOOLCHAIN=${TOOL_DIR}/riscv64-gnu-toolchain # Assume Vortex is setup with 64-bit RISC-V
export VORTEX_HOME= # VORTEX repo path
export CuPBoP_PATH= # CUPBOP repo path
export VORTEX_PATH=$VORTEX_HOME/build
export PATH=$LLVM_PREFIX/bin:$PATH
export LD_LIBRARY_PATH=$CuPBoP_PATH/build/runtime:$CuPBoP_PATH/build/runtime/threadPool:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$CuPBoP_PATH/cuda-12.1/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${LLVM_PREFIX}/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=${VORTEX_PATH}/runtime/:${LD_LIBRARY_PATH}CuPBoP Running Test
cd ./exampless/cfd
./kjrun_llvm18.sh- OpenCL to Vortex pipeline is in vortex/tests/opencl
- CUDA to Vortex pipeline is in cupbop/examples
cd $PRJ/tests/test_opencl_w_divergence_opt
./run_evaluation.shcd $PRJ/tests/test_cupbop
./run_isa_extensions.shcd $PRJ/tests/test_cupbop
./run_mem_hierarchy.sh