Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
8608de6
Fix redundant tile copies
constracktor May 12, 2026
22505e9
Fix spelling error
constracktor Mar 10, 2026
4819317
GPyTorch and GPflow work on AMD
MarcelGraf0710 Mar 12, 2026
9208c65
Adapted scripts such that installation of GPflow and GPyTorch acutall…
MarcelGraf0710 Mar 13, 2026
39e4b61
Adapted paths such that Intel variant compiles
MarcelGraf0710 Mar 15, 2026
f86a6da
Major update to the PyTorch reference
MarcelGraf0710 Mar 26, 2026
3724c1d
Adapted and fixed GPyTorch and GPflow reference implementations
MarcelGraf0710 Mar 28, 2026
85d5a43
Adapted GPRat benchmark
MarcelGraf0710 Mar 29, 2026
840e173
Improvements to compile architecture and correctness test.
MarcelGraf0710 Mar 29, 2026
a7f746b
Add predict_with_full_cov for GPflow and GPyTorch, and minor improvem…
MarcelGraf0710 Mar 29, 2026
5de1da6
Created shell scripts for benchmarking and minor adjustments to GPRat…
MarcelGraf0710 Mar 30, 2026
56872d8
Adapt execute.cpp
MarcelGraf0710 Mar 30, 2026
c6052de
execute.cpp now tests different CPU counts on GPU
MarcelGraf0710 Mar 30, 2026
6e9e275
Update all Python benchmarks to test multiple tile and core counts
MarcelGraf0710 Mar 30, 2026
babbacf
Set common benchmark baseline
MarcelGraf0710 Mar 30, 2026
706ceb7
Thread binding for benchmarks with HPX
MarcelGraf0710 Mar 30, 2026
a92b710
Adapt boilerplate
MarcelGraf0710 Mar 30, 2026
b1a8815
Apply formating
constracktor May 12, 2026
b2f77fb
Remove parallel building
constracktor May 12, 2026
f5e2845
Revert to canonical test data
MarcelGraf0710 May 24, 2026
5b3af5d
Remove commented out code for unused optimization-related functionality
MarcelGraf0710 May 24, 2026
d07f648
Assimilate hyperparam stubs of SYCL to those of CUDA
MarcelGraf0710 May 24, 2026
374c1b0
Comment corrections and code hygiene
MarcelGraf0710 May 24, 2026
1e4e353
Fix formatting
constracktor May 24, 2026
92f9fdd
Remove hardcoded paths from cpp example
constracktor Jun 15, 2026
03f4fc3
Use config.json for data file paths in cpp example
constracktor Jun 16, 2026
598a65d
Fix hardcoded relative output.csv path in cpp example
constracktor Jun 16, 2026
9160ce6
Fix output.csv copy path in benchmark script
constracktor Jun 17, 2026
ecba02e
fix: free training/test input buffers in predict()
constracktor Jun 23, 2026
4cfa0a8
fix: free dot() result in sycl compute_loss
constracktor Jun 23, 2026
633269b
fix: free potrf scratchpad/workspace on exception
constracktor Jun 23, 2026
6c12ab2
fix: remove debug variables test1/test2 in forward_solve_tiled
constracktor Jun 23, 2026
33691a3
fix: pass sycl::queue by const ref in adapter_onemath
constracktor Jun 23, 2026
039d3c1
fix: remove unused sstream include
constracktor Jun 23, 2026
e9db262
docs: mark hardcoded site-specific paths in compile_gprat.sh
constracktor Jun 23, 2026
97ac78d
docs: document SYCL backend in README
constracktor Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ jobs:
cmake "--preset=ci-${{ matrix.os }}"

- name: Build
run: cmake --build build --config Release -j 2
run: cmake --build build --config Release

- name: Install
run: cmake --install build --config Release --prefix prefix

- name: Test
working-directory: build
run: ctest --output-on-failure --no-tests=ignore -C Release -j 2
run: ctest --output-on-failure --no-tests=ignore -C Release

- name: Upload
uses: actions/upload-artifact@v4
Expand All @@ -90,7 +90,7 @@ jobs:
cmake -G "Unix Makefiles" -S examples/gprat_cpp -B build_examples -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PWD/prefix -DUSE_MKL=ON

- name: Build example project
run: cmake --build build_examples --config Release -j 2
run: cmake --build build_examples --config Release

# See: https://github.com/spack/setup-spack?tab=readme-ov-file#example-caching-your-own-binaries-for-public-repositories
- name: Push packages and update index
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,14 @@ examples/*/output.csv
examples/gprat_*/include/
examples/gpflow_reference/GPflow
/.vscode
benchmark_results_*

# Editor related files
ltex*
compile_commands.json

# Build files
build*

# Ignore folder
ignore
41 changes: 35 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Top-level CMakeLists.txt

# CMake initialization
# ##############################################################################
cmake_minimum_required(VERSION 3.23)

project(
Expand All @@ -9,21 +13,28 @@ project(

include(CMakeDependentOption)

# What to build?
# Build options
# ##############################################################################
option(GPRAT_BUILD_CORE "Build the core library" ON)

cmake_dependent_option(GPRAT_BUILD_BINDINGS "Build the Python bindings" ON
"GPRAT_BUILD_CORE" OFF)

cmake_dependent_option(
GPRAT_ENABLE_EXAMPLES "Build example applications as well?"
${PROJECT_IS_TOP_LEVEL} "GPRAT_BUILD_CORE" OFF)

cmake_dependent_option(GPRAT_ENABLE_TESTS "Build unit and integration tests"
${PROJECT_IS_TOP_LEVEL} "GPRAT_BUILD_CORE" OFF)

cmake_dependent_option(GPRAT_ENABLE_MKL "Enable support for Intel oneMKL"
${PROJECT_IS_TOP_LEVEL} "GPRAT_BUILD_CORE" OFF)

option(GPRAT_ENABLE_FORMAT_TARGETS "Enable clang-format / cmake-format targets"
${PROJECT_IS_TOP_LEVEL})

# Format settings
# ##############################################################################
if(GPRAT_ENABLE_FORMAT_TARGETS)
set(CMAKE_FORMAT_EXCLUDE "^external_ports/")

Expand All @@ -39,44 +50,55 @@ if(GPRAT_ENABLE_FORMAT_TARGETS)
endif()
endif()

# GNU install dirs
# ##############################################################################
if(NOT CMAKE_SKIP_INSTALL_RULES)
# Our installs follow the standard GNU directory layout. This include needs to
# come first since we need the CMAKE_INSTALL_* in the CMakeLists.txt of each
# target.
include(GNUInstallDirs)
endif()

# Building the GPRAT core
# ##############################################################################
if(GPRAT_BUILD_CORE)

# MKL backend
if(GPRAT_ENABLE_MKL)
# Try to find Intel oneMKL
set(MKL_INTERFACE_FULL "intel_lp64")
set(MKL_THREADING "sequential")
find_package(MKL CONFIG REQUIRED)

if(MKL_FOUND)
message(STATUS "Intel oneMKL Library found")
else()
message(FATAL_ERROR "No BLAS Library found")
message(FATAL_ERROR "Intel oneMKL Library NOT found")
endif()

# OpenBLAS backend
else()
# Try to find OpenBLAS
find_library(OpenBLAS_LIB NAMES openblas REQUIRED)

if(OpenBLAS_LIB)
message(STATUS "OpenBLAS Library found at ${OpenBLAS_LIB}")
else()
message(FATAL_ERROR "No BLAS Library found")
endif()
endif()

# HPX
find_package(HPX REQUIRED)

# Add core subdirectiory
add_subdirectory(core)

# Bindings subdirectory
if(GPRAT_BUILD_BINDINGS)
add_subdirectory(bindings)
endif()

endif()

# Installation
# ##############################################################################
if(NOT CMAKE_SKIP_INSTALL_RULES AND GPRAT_BUILD_CORE)
include(CMakePackageConfigHelpers)

Expand Down Expand Up @@ -116,11 +138,18 @@ if(NOT CMAKE_SKIP_INSTALL_RULES AND GPRAT_BUILD_CORE)
endif()
endif()

# Examples
# ##############################################################################
if(GPRAT_ENABLE_EXAMPLES)
add_subdirectory(examples/gprat_cpp)
endif()

# Tests
# ##############################################################################
if(GPRAT_ENABLE_TESTS)
enable_testing()
add_subdirectory(test)
endif()

# End of file
# ##############################################################################
50 changes: 38 additions & 12 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,8 @@
}
},
{
"name": "dev-linux-gpu",
"binaryDir": "${sourceDir}/build/dev-linux-gpu",
"name": "dev-linux-cuda",
"binaryDir": "${sourceDir}/build/dev-linux-cuda",
"inherits": ["dev-linux"],
"cacheVariables": {
"GPRAT_WITH_CUDA": "ON",
Expand All @@ -202,15 +202,31 @@
}
},
{
"name": "release-linux-gpu",
"binaryDir": "${sourceDir}/build/release-linux-gpu",
"name": "release-linux-cuda",
"binaryDir": "${sourceDir}/build/release-linux-cuda",
"inherits": ["release-linux"],
"cacheVariables": {
"GPRAT_WITH_CUDA": "ON",
"GPRAT_APEX_STEPS": "OFF",
"GPRAT_APEX_CHOLESKY": "OFF"
}
},
{
"name": "dev-linux-sycl",
"binaryDir": "${sourceDir}/build/dev-linux-sycl",
"inherits": ["dev-linux"],
"cacheVariables": {
"GPRAT_WITH_SYCL": "ON"
}
},
{
"name": "release-linux-sycl",
"binaryDir": "${sourceDir}/build/release-linux-sycl",
"inherits": ["release-linux"],
"cacheVariables": {
"GPRAT_WITH_SYCL": "ON"
}
}
],
"buildPresets": [
{
Expand All @@ -224,13 +240,23 @@
"configuration": "Release"
},
{
"name": "dev-linux-gpu",
"configurePreset": "dev-linux-gpu",
"name": "dev-linux-cuda",
"configurePreset": "dev-linux-cuda",
"configuration": "Debug"
},
{
"name": "release-linux-cuda",
"configurePreset": "release-linux-cuda",
"configuration": "Release"
},
{
"name": "dev-linux-sycl",
"configurePreset": "dev-linux-sycl",
"configuration": "Debug"
},
{
"name": "release-linux-gpu",
"configurePreset": "release-linux-gpu",
"name": "release-linux-sycl",
"configurePreset": "release-linux-sycl",
"configuration": "Release"
}
],
Expand Down Expand Up @@ -258,8 +284,8 @@
}
},
{
"name": "dev-linux-gpu",
"configurePreset": "dev-linux-gpu",
"name": "dev-linux-cuda",
"configurePreset": "dev-linux-cuda",
"configuration": "Debug",
"output": {
"outputOnFailure": true
Expand All @@ -269,8 +295,8 @@
}
},
{
"name": "release-linux-gpu",
"configurePreset": "release-linux-gpu",
"name": "release-linux-cuda",
"configurePreset": "release-linux-cuda",
"configuration": "Release",
"output": {
"outputOnFailure": true
Expand Down
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ code.

GPRat depends on [HPX](https://hpx-docs.stellar-group.org/latest/html/index.html) for asynchronous task-based parallelization.
Furthermore, for CPU-only BLAS computation GPRat requires [OpenBLAS](http://www.openmathlib.org/OpenBLAS/) or [MKL](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html).
A [CUDA](https://developer.nvidia.com/cuda-toolkit) installation is required for GPU-only BLAS computations.
A [CUDA](https://developer.nvidia.com/cuda-toolkit) installation is required for GPU-only BLAS computations on NVIDIA hardware.
For GPU computations on Intel and AMD hardware, GPRat supports [SYCL](https://www.khronos.org/sycl/) via [oneMath](https://github.com/uxlfoundation/oneMath).

### Install dependencies

Expand All @@ -34,8 +35,8 @@ ctest --preset=dev-linux

As a developer, you may create a `CMakeUserPresets.json` file at the root of the project that contains additional
presets local to your machine.
In addition to the build configuration `dev-linux`, there are `release-linux`, `dev-linux-gpu`, and `release-linux-gpu`.
The configurations suffixed with `-gpu` build the library with CUDA.
In addition to the build configuration `dev-linux`, there are `release-linux`, `dev-linux-gpu`, `release-linux-gpu`, `dev-linux-sycl`, and `release-linux-sycl`.
The configurations suffixed with `-gpu` build the library with CUDA for NVIDIA GPUs, and those suffixed with `-sycl` build it with SYCL support for Intel and AMD GPUs.

GPRat can be build with or without Python bindings.
The following options can be set to include / exclude parts of the project:
Expand All @@ -47,7 +48,8 @@ The following options can be set to include / exclude parts of the project:
| GPRAT_ENABLE_FORMAT_TARGETS | Enable/Disable code formatting helper targets | ON if top-level |
| GPRAT_ENABLE_EXAMPLES | Enable/Disable example projects | ON if top-level |
| GPRAT_USE_MKL | Enable/Disable usage of MKL library | OFF |
| GPRAT_WITH_CUDA | Enable/disable compilation with CUDA support | OFF |
| GPRAT_WITH_CUDA | Enable/disable compilation with CUDA support (NVIDIA GPUs) | OFF |
| GPRAT_WITH_SYCL | Enable/disable compilation with SYCL support (Intel and AMD GPUs via oneMath) | OFF |
| GPRAT_APEX_STEPS | Enable/disable compilation for steps duration measurement with APEX | OFF |
| GPRAT_APEX_CHOLESKY | Enable/disable compilation for measuring cholesky assembly and computation with APEX | OFF |

Expand Down Expand Up @@ -103,7 +105,10 @@ We specifically thank the follow contributors:
[Optimization, Python bindings and reference implementations](https://doi.org/10.48550/arXiv.2505.00136).

- [Henrik Möllmann](https://www.linkedin.com/in/moellh/):
[Accelerator Support](tbd.).
[CUDA backend via cuBLAS/cuSOLVER](tbd.).

- Marcel Graf:
[SYCL backend via oneMath](tbd.).

## How To Cite

Expand Down
1 change: 1 addition & 0 deletions Testing/Temporary/CTestCostData.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
---
5 changes: 4 additions & 1 deletion bindings/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@ endif()

# Option for GPU support with CUDA, cuSolver, cuBLAS
option(GPRAT_WITH_CUDA "Enable GPU support with CUDA, cuSolver, cuBLAS" OFF)
option(GPRAT_WITH_SYCL "Enable SYCL support with oneMath" OFF)

# Pass variable to C++ code
add_compile_definitions(GPRAT_WITH_CUDA=$<BOOL:${GPRAT_WITH_CUDA}>)
add_compile_definitions(GPRAT_WITH_CUDA=$<BOOL:${GPRAT_WITH_CUDA}>
GPRAT_WITH_SYCL=$<BOOL:${GPRAT_WITH_SYCL}>)

# Option for steps duration measurement with APEX
option(GPRAT_APEX_STEPS "Enable measuring duration of steps with APEX" OFF)
Expand Down
8 changes: 4 additions & 4 deletions bindings/gprat_py.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ n_streams to a value enables computations on the GPU.
trainable (list): List of booleans for trainable hyperparameters. Default is
{true, true, true}.
gpu_id (int): ID of the GPU to use. Default is 0.
n_streams (int): Number of streams for GPU computation. Default is 1.
n_units (int): Number of streams/queues for GPU computation. Default is 1.
)pbdoc")

// GPU constructor
Expand All @@ -100,11 +100,11 @@ n_streams to a value enables computations on the GPU.
py::arg("kernel_params") = std::vector<double>{ 1.0, 1.0, 0.1 },
py::arg("trainable") = std::vector<bool>{ true, true, true },
py::arg("gpu_id") = 0,
py::arg("n_streams") = 1,
py::arg("n_units") = 1,
R"pbdoc(
Create Gaussian Process including its data, hyperparameters, and target. By
default, the calculations are performed on the CPU. Setting at least gpu_id or
n_streams to a value enables computations on the GPU.
n_units to a value enables computations on the GPU.

Parameters:
input_data (list): Input data for the GP.
Expand All @@ -117,7 +117,7 @@ n_streams to a value enables computations on the GPU.
trainable (list): List of booleans for trainable hyperparameters. Default is
{true, true, true}.
gpu_id (int): ID of the GPU to use. Default is 0.
n_streams (int): Number of streams for GPU computation. Default is 1.
n_units (int): Number of streams/queues for GPU computation. Default is 1.

)pbdoc")
.def_readwrite("n_reg", &gprat::GP::n_reg)
Expand Down
1 change: 1 addition & 0 deletions bindings/utils_py.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ void init_utils(py::module &m)
m.def("stop_hpx", &utils::stop_hpx_runtime);

m.def("compiled_with_cuda", &utils::compiled_with_cuda, "Check if the code was compiled with CUDA support");
m.def("compiled_with_sycl", &utils::compiled_with_sycl, "Check if the code was compiled with SYCL support");

m.def("print_available_gpus", &gprat::print_available_gpus, "Print available GPUs with their properties");
m.def("gpu_count", &gprat::gpu_count, "Return the number of available GPUs");
Expand Down
24 changes: 24 additions & 0 deletions boilerplate-benchmark.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/bash
#
#SBATCH --job-name=gprat
#SBATCH --output=output_gprat.txt
#SBATCH --time=48:00:00

source ~/Setup_Scripts/setup_breyerml.sh

if [[ "$HOSTNAME" == "simcl1n1" || "$HOSTNAME" == "simcl1n2" ]]; then

./execute-benchmark.sh yes yes yes yes gpu nvidia cuda
./execute-benchmark.sh no no yes yes gpu nvidia sycl

elif [[ "$HOSTNAME" == "simcl1n3" ]];
then

./execute-benchmark.sh yes yes yes yes gpu amd

elif [[ "$HOSTNAME" == "simcl1n4" ]];
then

./execute-benchmark.sh yes yes yes yes cpu cpu

fi
Loading
Loading