Scripts to reproduce the flash benchmark results for the paper "Harnessing GPU-Acceleration in Large-Scale Process Optimization".
The main benchmark runs JuMP/Ipopt, ExaModels/MadNLP on CPU, and
ExaModels/MadNLP on GPU for several scenario counts. The output is written to
benchmark_table.csv.
- Julia 1.12.1. The committed
Manifest.tomlwas generated with this version. - An NVIDIA GPU with a working CUDA driver.
- The HSL MA57 linear solver. The scripts use MA57 through
HSL_jllfor JuMP/Ipopt and throughMadNLPHSLfor MadNLP CPU solves. - This repository, including the committed
data/inlet_data_*_scenarios.jlsfiles.
The full benchmark can take about 4 hours, depending on CPU, GPU, and solver configuration.
-
Clone the repository and enter it.
git clone <repository-url> cd FOCAPO_ExaProcess
-
Start Julia in the project environment.
julia --project=.
-
Instantiate the exact package environment from
Manifest.toml.using Pkg Pkg.instantiate()
-
Verify that CUDA is available to Julia.
using CUDA CUDA.functional()
This should print
true. If it printsfalse, fix the NVIDIA driver/CUDA setup before running the GPU benchmark. -
Run the full benchmark table.
include("flash_benchmark_table.jl")
The script runs the default scenario counts:
[1, 10, 100, 1000, 5000]
For each scenario count, it solves:
- JuMP/Ipopt
- ExaModels/MadNLP CPU
- ExaModels/MadNLP GPU
- ExaModels/MadNLP GPU with the two-stage Schur-complement KKT system
-
Confirm the output.
After the script finishes, it writes:
benchmark_table.csvThe CSV contains one row per scenario count and these columns:
omega,jump_build_s,jump_solve_s,jump_iter,jump_status,exa_cpu_build_s,exa_cpu_solve_s,exa_cpu_iter,exa_cpu_status,exa_gpu_build_s,exa_gpu_solve_s,exa_gpu_iter,exa_gpu_status,exa_gpu_schur_build_s,exa_gpu_schur_solve_s,exa_gpu_schur_iter,exa_gpu_schur_statusSuccessful ExaModels/MadNLP runs should report
SOLVE_SUCCEEDED. JuMP/Ipopt runs may reportLOCALLY_SOLVED; for some large cases, the status can depend on solver version, hardware, and runtime limits.
- The benchmark script checks
CUDA.functional()before running and stops if CUDA is not functional. benchmark_table.csvis overwritten each timeflash_benchmark_table.jlcompletes.- Timing values include machine-dependent build and solve times, so exact numbers are not expected to match across different systems.