Skip to content

Commit 5b1a4e4

Browse files
authored
Merge pull request #3 from GAMS-dev/cuda13
Modify workflow to build both CUDA 12 and CUDA 13 links and runtime archives
2 parents 4cb2485 + a8008cf commit 5b1a4e4

4 files changed

Lines changed: 2040 additions & 119 deletions

File tree

.github/workflows/main.yml

Lines changed: 91 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
push:
55
# branches: [main]
66
tags:
7-
- '*' # Run also when a tag is pushed
7+
- '*' # Run only when a new tag is pushed
88
pull_request:
99

1010
jobs:
@@ -21,81 +21,139 @@ jobs:
2121
run: |
2222
apt-get update && apt-get install -y patchelf curl unzip zip gcc
2323
24-
- name: Set up python virtual environment with NVIDIA dependencies
24+
# Get CUDA runtimes via pip
25+
- name: Set up python virtual environments with NVIDIA dependencies for CUDA 12 and CUDA 13 (respectively)
2526
run: |
2627
mkdir -p venvs
2728
python -m venv venvs/cu12
2829
bash -c "source venvs/cu12/bin/activate && \
2930
pip install --upgrade pip -qq && \
30-
pip install --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple/ cuopt-cu12==25.10.0 nvidia-cuda-runtime-cu12==12.8.* nvidia-nvjitlink-cu12 -qq"
31+
pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu12==25.10.* cuda-toolkit[cudart,nvjitlink]==12.9.* -qq &&
32+
deactivate"
33+
python -m venv venvs/cu13
34+
bash -c "source venvs/cu13/bin/activate && \
35+
pip install --upgrade pip -qq && \
36+
pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu13==25.10.* cuda-toolkit[cudart,nvjitlink]==13.0.* -qq &&
37+
deactivate"
3138
39+
# Get GAMS
3240
- name: Download and extract latest GAMS distribution
3341
run: |
3442
curl https://d37drm4t2jghv5.cloudfront.net/distributions/latest/linux/linux_x64_64_sfx.exe --output linux_x64_64_sfx.exe
3543
unzip -q linux_x64_64_sfx.exe
3644
mv gams*_linux_x64_64_sfx gamsdist
3745
rm linux_x64_64_sfx.exe
3846
39-
- name: Compile gmscuopt
47+
# Build link
48+
- name: Compile GAMS/cuOpt-link binary "gmscuopt.out" for CUDA 12 and then for CUDA 13
4049
run: |
4150
export GAMSCAPI="gamsdist/apifiles/C/api"
4251
export CUOPT="venvs/cu12/lib/python3.12/site-packages/libcuopt"
4352
export JITLINK="venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib"
4453
export CUOPT_VERSION="`cat "$CUOPT/VERSION"`"
4554
export CUOPT_HASH="`cat "$CUOPT/GIT_COMMIT"`"
46-
gcc -Wall gmscuopt.c -o gmscuopt.out \
55+
gcc -Wall gmscuopt.c -o gmscuopt-cu12.out \
4756
-DCUOPT_VERSION=\"$CUOPT_VERSION\" -DCUOPT_HASH=\"$CUOPT_HASH\" \
4857
-I $GAMSCAPI $GAMSCAPI/gmomcc.c $GAMSCAPI/optcc.c $GAMSCAPI/gevmcc.c \
4958
-I $CUOPT/include $JITLINK/libnvJitLink.so.12 -L $CUOPT/lib64 -lcuopt
50-
patchelf --set-rpath \$ORIGIN gmscuopt.out
59+
patchelf --set-rpath \$ORIGIN gmscuopt-cu12.out
60+
export CUOPT="venvs/cu13/lib/python3.12/site-packages/libcuopt"
61+
export JITLINK="venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib"
62+
export CUOPT_VERSION="`cat "$CUOPT/VERSION"`"
63+
export CUOPT_HASH="`cat "$CUOPT/GIT_COMMIT"`"
64+
gcc -Wall gmscuopt.c -o gmscuopt-cu13.out \
65+
-DCUOPT_VERSION=\"$CUOPT_VERSION\" -DCUOPT_HASH=\"$CUOPT_HASH\" \
66+
-I $GAMSCAPI $GAMSCAPI/gmomcc.c $GAMSCAPI/optcc.c $GAMSCAPI/gevmcc.c \
67+
-I $CUOPT/include $JITLINK/libnvJitLink.so.13 -L $CUOPT/lib64 -lcuopt
68+
patchelf --set-rpath \$ORIGIN gmscuopt-cu13.out
5169
70+
# Collect dependencies for link and runtime convenience archive
5271
- name: Prepare release artifact and runtime bundle
5372
run: |
54-
mkdir release
55-
cp gmscuopt.out release/
56-
cp assets/* release/
57-
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release/
58-
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release/
59-
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libgomp-*.so.1.0.0 release/
60-
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbb-*.so.2 release/
61-
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbbmalloc-*.so.2 release/
62-
cp venvs/cu12/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release/
63-
cp venvs/cu12/lib/python3.12/site-packages/librmm/lib64/librmm.so release/
64-
mkdir runtime
65-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cu12/lib/libcudss.so.0 runtime/
66-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusolver/lib/libcusolver.so.11 runtime/
67-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublas.so.12 runtime/
68-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12 runtime/
69-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 runtime/
70-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/curand/lib/libcurand.so.10 runtime/
71-
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusparse/lib/libcusparse.so.12 runtime/
73+
mkdir release-cu12
74+
cp gmscuopt-cu12.out release-cu12/gmscuopt.out
75+
cp assets/* release-cu12/
76+
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release-cu12/
77+
cp venvs/cu12/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release-cu12/
78+
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libgomp-*.so.1.0.0 release-cu12/
79+
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbb-*.so.2 release-cu12/
80+
cp venvs/cu12/lib/python3.12/site-packages/libcuopt_cu12.libs/libtbbmalloc-*.so.2 release-cu12/
81+
cp venvs/cu12/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release-cu12/
82+
cp venvs/cu12/lib/python3.12/site-packages/librmm/lib64/librmm.so release-cu12/
83+
mkdir runtime-cu12
84+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cu12/lib/libcudss.so.0 runtime-cu12/
85+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusolver/lib/libcusolver.so.11 runtime-cu12/
86+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublas.so.12 runtime-cu12/
87+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cublas/lib/libcublasLt.so.12 runtime-cu12/
88+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 runtime-cu12/
89+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/curand/lib/libcurand.so.10 runtime-cu12/
90+
cp venvs/cu12/lib/python3.12/site-packages/nvidia/cusparse/lib/libcusparse.so.12 runtime-cu12/
91+
mkdir release-cu13
92+
cp gmscuopt-cu13.out release-cu13/gmscuopt.out
93+
cp assets/* release-cu13/
94+
cp venvs/cu13/lib/python3.12/site-packages/libcuopt/lib64/libcuopt.so release-cu13/
95+
cp venvs/cu13/lib/python3.12/site-packages/libcuopt/lib64/libmps_parser.so release-cu13/
96+
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libgomp-*.so.1.0.0 release-cu13/
97+
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libtbb-*.so.2 release-cu13/
98+
cp venvs/cu13/lib/python3.12/site-packages/libcuopt_cu13.libs/libtbbmalloc-*.so.2 release-cu13/
99+
cp venvs/cu13/lib/python3.12/site-packages/rapids_logger/lib64/librapids_logger.so release-cu13/
100+
cp venvs/cu13/lib/python3.12/site-packages/librmm/lib64/librmm.so release-cu13/
101+
mkdir runtime-cu13
102+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcudss.so.0 runtime-cu13/
103+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libnvJitLink.so.13 runtime-cu13/
104+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcublas.so.13 runtime-cu13/
105+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcublasLt.so.13 runtime-cu13/
106+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcurand.so.10 runtime-cu13/
107+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcusolver.so.12 runtime-cu13/
108+
cp venvs/cu13/lib/python3.12/site-packages/nvidia/cu13/lib/libcusparse.so.12 runtime-cu13/
72109
73-
- name: Upload link artifact to GitHub Actions (always)
110+
# Upload artifacts
111+
- name: Upload CUDA 12 link artifact to GitHub Actions (always)
74112
uses: actions/upload-artifact@v4
75113
with:
76-
name: cuopt-link
77-
path: release/
114+
name: cuopt-link-cu12
115+
path: release-cu12/
78116

79-
- name: Upload runtime artifact to GitHub Actions (always)
117+
- name: Upload CUDA 12 runtime artifact to GitHub Actions (always)
80118
uses: actions/upload-artifact@v4
81119
with:
82120
name: cu12-runtime
83-
path: runtime/
121+
path: runtime-cu12/
122+
123+
- name: Upload CUDA 13 link artifact to GitHub Actions (always)
124+
uses: actions/upload-artifact@v4
125+
with:
126+
name: cuopt-link-cu13
127+
path: release-cu13/
128+
129+
- name: Upload CUDA 13 runtime artifact to GitHub Actions (always)
130+
uses: actions/upload-artifact@v4
131+
with:
132+
name: cu13-runtime
133+
path: runtime-cu13/
84134

135+
# Bundle into archives
85136
- name: Create zip archive (only on tag push)
86137
if: startsWith(github.ref, 'refs/tags/')
87138
run: |
88-
cd release
89-
zip -r ../cuopt-link-release.zip .
90-
cd ../runtime
139+
cd release-cu12
140+
zip -r ../cuopt-link-release-cu12.zip .
141+
cd ../runtime-cu12
91142
zip -r ../cu12-runtime.zip .
143+
cd ../release-cu13
144+
zip -r ../cuopt-link-release-cu13.zip .
145+
cd ../runtime-cu13
146+
zip -r ../cu13-runtime.zip .
92147
148+
# Create new release with archives
93149
- name: Create GitHub Release (only on tag push)
94150
if: startsWith(github.ref, 'refs/tags/')
95151
uses: softprops/action-gh-release@v2
96152
with:
97153
files: |
98-
cuopt-link-release.zip
154+
cuopt-link-release-cu12.zip
99155
cu12-runtime.zip
156+
cuopt-link-release-cu13.zip
157+
cu13-runtime.zip
100158
env:
101159
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,20 @@ You can get more details and tips by reading the blog post ["GPU-Accelerated Opt
88

99
## Requirements
1010

11-
- **Operating System:** Linux, Windows through WSL2
11+
- **Operating System:** Linux, Windows 11 through WSL2
1212
- **GAMS:** Version 49 or newer.
1313
- **GAMSPy:** Version 1.12.1 or newer
1414
- **NVIDIA GPU:** Volta architecture or better
15-
- **CUDA Runtime Libraries:** 12.0+
15+
- **CUDA Runtime Libraries:** 12 and 13
1616

1717
## Getting started / installation
1818

1919
- Make sure [CUDA runtime](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64) is installed
20-
- Download and unpack `cuopt-link-release.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases):
21-
- Unpack the contents of `cuopt-link-release.zip` into your GAMS system directory. For GAMSPy, you can find out your system directory by running `gamspy show base`. So for example you can run `unzip -o cuopt-link-release.zip -d $(gamspy show base)`.
20+
- Download and unpack `cuopt-link-release-cu12.zip` or `cuopt-link-release-cu13.zip` (for CUDA 12 and 13 respectively) from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases):
21+
- Unpack the contents of `cuopt-link-release-cu*.zip` into your GAMS system directory. For GAMSPy, you can find out your system directory by running `gamspy show base`. So for example you can run `unzip -o cuopt-link-release-cu*.zip -d $(gamspy show base)`.
2222
- **Caution:** This will overwrite any existing `gamsconfig.yaml` file in that directory. The contained `gamsconfig.yaml` contains a `solverConfig` section to make cuOpt available to GAMS.
2323

24-
More specifically, the files from the CUDA runtime needed are
25-
```
26-
libcublas.so.12
27-
libcublasLt.so.12
28-
libcudss.so.0
29-
libcurand.so.10
30-
libcusolver.so.11
31-
libnvJitLink.so.12
32-
```
33-
and can be installed e.g. via `pip install --extra-index-url=https://pypi.nvidia.com cuopt-cu12==25.5.* nvidia-cuda-runtime-cu12==12.8.* nvidia-nvjitlink-cu12` into a Python environment or downloaded as archive `cu12-runtime.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases).
24+
The neccessary files from the CUDA 12 or 13 runtime can also be downloaded as convenient archive `cu12-runtime.zip` or `cu13-runtime.zip` from the [releases page](https://github.com/GAMS-dev/cuoptlink-builder/releases).
3425

3526
## Test the setup
3627

@@ -42,4 +33,5 @@ gams trnsport lp cuopt
4233

4334
## Examples
4435

45-
- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt.ipynb)
36+
- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt.ipynb) for CUDA 12
37+
- [examples/trnsport_cuopt.ipynb](examples/trnsport_cuopt_cu13.ipynb) for CUDA 13

0 commit comments

Comments
 (0)