ns = [32, 64, 128, 256, 512, 1024]
K = 100
budget_s = 5.0
records = []
for (variant, f) in (("lexicographic", gs_loss), ("red-black", rb_loss))
for n in ns
θ, uobs = Reactant.to_rarray.(inputs(Float64, n))
compile_s = @elapsed begin
lf = @compile f(θ, uobs, K)
gf = @compile gradient(f, θ, uobs, K)
end
samples = n >= 512 ? 3 : 10
r = (; dtype="Float64", variant, N=n^2, n, K,
forward_s = time_median(() -> lf(θ, uobs, K); sync=Reactant.synchronize, samples),
grad_s = time_median(() -> gf(f, θ, uobs, K); sync=Reactant.synchronize, samples),
compile_s, peak_mem_bytes = nothing)
push!(records, r)
r.grad_s > budget_s && break
end
end
write_results(EXAMPLE, "reactant", "gpu", records)
for r in records
@printf "gpu %-13s n=%-5d forward %9.3f ms gradient %9.3f ms compile %5.1f s\n" r.variant r.n 1e3r.forward_s 1e3r.grad_s r.compile_s
end