diff --git a/smoketests/Project.toml b/smoketests/Project.toml new file mode 100644 index 0000000..6820e0c --- /dev/null +++ b/smoketests/Project.toml @@ -0,0 +1,9 @@ +[deps] +ADIOS2 = "e0ce9d3b-0dbd-416f-8264-ccca772f60ec" +CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +GrayScott = "089a57ea-382b-4fd7-9f05-24902db6ec52" +MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + +[extras] +MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" diff --git a/smoketests/run_smoketest.jl b/smoketests/run_smoketest.jl new file mode 100644 index 0000000..50df46d --- /dev/null +++ b/smoketests/run_smoketest.jl @@ -0,0 +1,81 @@ +using TOML + +backend = ARGS[1] + +# Base configuration with fixed parameters +base_config = Dict( + "Du" => 0.2, + "Dv" => 0.1, + "F" => 0.02, + "k" => 0.048, + "dt" => 1.0, + "plotgap" => 10, + "noise" => 0.1, + "checkpoint" => false, + "checkpoint_freq" => 700, + "checkpoint_output" => "ckpt.bp", + "restart" => false, + "restart_input" => "ckpt.bp", + "mesh_type" => "image", + "verbose" => false, +) + +# Parameter ranges for grid search +L_values = [2^i for i in 6:10] # 8 to 1024 in powers of 2 +steps_values = [1000, 10000, 50000, 100000] +precision_values = ["Float32", "Float64"] +kernel_language_values = ["Plain", "KernelAbstractions"] + +# Create output directory if it doesn't exist +mkpath("configs") + +# Counter for configurations +config_count = 0 + +# Generate all combinations and run simulations +for L in L_values, + steps in steps_values, + precision in precision_values, + kernel_language in kernel_language_values + + # Create a copy of base configuration + config = copy(base_config) + + # Add variable parameters + config["L"] = L + config["steps"] = steps + config["precision"] = precision + config["backend"] = backend + config["kernel_language"] = kernel_language + + # Generate unique output filename based on parameters + output_filename = "gs-$(backend)-$(L)L-$(precision).bp" + config["output"] = output_filename + + # Create config filename + config_filename = "configs/config_$(config_count).toml" + + # Write configuration to TOML file + open(config_filename, "w") do io + TOML.print(io, config) + end + + # Run simulation with this configuration + if backend == "CUDA" + run_cmd = `julia --project -e 'import GrayScott, CUDA; GrayScott.main(ARGS)' $config_filename` + else + run_cmd = `julia --project -e 'import GrayScott; GrayScott.main(ARGS)' $config_filename` + end + + # Print information about current run + println("Running configuration $config_count:") + println("L: $L, Steps: $steps, Precision: $precision, Backend: $backend, Kernel: $kernel_language") + + # Run the simulation + run(run_cmd) + println("Successfully completed configuration $config_count") + + global config_count += 1 +end + +println("Completed all $config_count configurations") diff --git a/smoketests/smoke_cpu.sh b/smoketests/smoke_cpu.sh new file mode 100755 index 0000000..1940eab --- /dev/null +++ b/smoketests/smoke_cpu.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +#SBATCH -J smoke_cpu +#SBATCH -A ntrain1 +#SBATCH -q shared +#SBATCH -C cpu +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 128 +#SBATCH -t 02:00:00 +#SBATCH -o smoke_cpu.log + +set -eu + +module load julia/1.10 + +export JULIA_NUM_THREADS=128 + +julia --project=$PWD run_smoketest.jl CPU diff --git a/smoketests/smoke_cpu_mpi.sh b/smoketests/smoke_cpu_mpi.sh new file mode 100755 index 0000000..9e50045 --- /dev/null +++ b/smoketests/smoke_cpu_mpi.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +#SBATCH -J smoke_cmpi +#SBATCH -A ntrain1 +#SBATCH -q shared +#SBATCH -C cpu +#SBATCH -N 1 +#SBATCH -n 2 +#SBATCH -c 64 +#SBATCH -t 02:00:00 +#SBATCH -o smoke_cpu_mpi.log + +set -eu + +module load julia/1.10 + +export JULIA_NUM_THREADS=64 + +srun julia --project=$PWD run_smoketest.jl CPU diff --git a/smoketests/smoke_gpu.sh b/smoketests/smoke_gpu.sh new file mode 100755 index 0000000..7303905 --- /dev/null +++ b/smoketests/smoke_gpu.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +#SBATCH -J smoke_gpu +#SBATCH -A ntrain1 +#SBATCH -q shared +#SBATCH -C gpu +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 32 +#SBATCH -t 02:00:00 +#SBATCH -o smoke_gpu.log + +set -eu + +module load julia/1.10 + +export JULIA_NUM_THREADS=32 + +julia --project=$PWD run_smoketest.jl CUDA diff --git a/smoketests/smoke_gpu_mpi.sh b/smoketests/smoke_gpu_mpi.sh new file mode 100755 index 0000000..7e3d4cb --- /dev/null +++ b/smoketests/smoke_gpu_mpi.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +#SBATCH -J smoke_gmpi +#SBATCH -A ntrain1 +#SBATCH -q shared +#SBATCH -C gpu +#SBATCH -n 2 +#SBATCH -c 32 +#SBATCH --gpus-per-task=1 +#SBATCH -t 02:00:00 +#SBATCH -o smoke_gpu_mpi.log + +set -eu + +module load julia/1.10 + +export JULIA_NUM_THREADS=32 + +srun julia --project=$PWD run_smoketest.jl CUDA diff --git a/smoketests/visualize.jl b/smoketests/visualize.jl new file mode 100644 index 0000000..5300a7b --- /dev/null +++ b/smoketests/visualize.jl @@ -0,0 +1,47 @@ +import ADIOS2 +import CairoMakie + +bp_file = "gs-1MPI-1GPU-64L-F32.bp" + +adios = ADIOS2.adios_init_serial() +io = ADIOS2.declare_io(adios, "reader") +reader = ADIOS2.open(io, bp_file, ADIOS2.mode_read) + +# get the number of available steps in the reader, only works for bp files +steps = ADIOS2.steps(reader) +npixels = 256 +local_count = 32 + +# Grid is 1800x1800x1800. Use Tuples () for selection +local_start = convert(Int64, ceil((npixels - local_count) / 2)) +start = (local_start, local_start, convert(Int64, ceil(npixels / 2))) +count = (local_count, local_count, 1) +sliceU = Array{Float32, 2}(undef, local_count, local_count) +sliceV = Array{Float32, 2}(undef, local_count, local_count) + +for step in 1:steps + ADIOS2.begin_step(reader) + + varU = ADIOS2.inquire_variable(io, "U") + @assert varU isa ADIOS2.Variable string("Could not find variable U") + ADIOS2.set_selection(varU, start, count) + + varV = ADIOS2.inquire_variable(io, "U") + @assert varV isa ADIOS2.Variable string("Could not find variable V") + ADIOS2.set_selection(varV, start, count) + + ADIOS2.get(reader, varU, sliceU) + ADIOS2.get(reader, varV, sliceV) + ADIOS2.end_step(reader) + + println("Showing step ", step) + + f = CairoMakie.Figure() + CairoMakie.heatmap(f[1, 1], sliceU) + CairoMakie.heatmap(f[1, 2], sliceV) + display(f) + CairoMakie.save(string("U_V_", step, ".png"), f) +end + +ADIOS2.close(reader) +ADIOS2.adios_finalize(adios)