Files
fn_registry/cpp/functions/datascience/mc_metropolis_hastings_gpu.h
T
egutierrez 9d69953110 feat(cpp/datascience): GPU Monte Carlo kernels (K1-K3)
Tres kernels Monte Carlo intensivos sobre las primitivas G1-G7 + las puras
CPU como oraculo de tests numericos. Apuntados a hyper-paralelizar los
calculadores de sources/calculadoras (vr_tiered_lab, mcmc-bayes / full / lab,
mcmc-visualizer) en RTX-class GPUs.

- mc_session_sim_gpu (K1): N sesiones independientes de K spins en paralelo
  (1 thread = 1 sesion). Modelo variable-ratio escalonado con tiers (q, m),
  modes Pure/Pity/Streak, miss_streak, drawdown. SSBOs summary[N*8] y
  tier_counts[N*max_tiers]. Portea vr_tiered_lab.
- mc_metropolis_hastings_gpu (K2): M cadenas independientes 1D. Target
  log-pdf inyectable como string GLSL (mismo patron de gl_shader). u_user[16]
  para cambiar parametros desde sliders sin recompilar. Output compatible
  con rhat_split / ess_basic.
- mc_random_walk_2d_gpu (K3): walkers 2D MH con trace_xy xy-interleaved en
  SSBO; pasable directamente a gpu_histogram_2d sin readback intermedio.
  Pipeline GPU-only para mcmc-visualizer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 11:52:41 +02:00

72 lines
2.6 KiB
C++

#pragma once
#include "gfx/gpu_ssbo.h"
#include <string>
namespace fn::ds {
// Estado del MH GPU. Cada walker (cadena) tiene su propio thread; el
// shader hace n_steps iteraciones por dispatch. Subsiguientes dispatches
// continuan donde se quedaron. Output:
// chains[m_chains * n_samples_per_run] floats — cadena completa
// accept_counts[m_chains] uints — # de aceptaciones (pace)
// curr_x[m_chains] floats — x actual por chain
struct McMetropolisHastingsGpu {
unsigned int program = 0;
fn::gfx::Ssbo chains;
fn::gfx::Ssbo accept_counts;
fn::gfx::Ssbo curr_x;
fn::gfx::Ssbo rng_seeds;
int m_chains = 0;
int n_samples_per_run = 0;
unsigned int loc_n_chains = 0;
unsigned int loc_n_steps = 0;
unsigned int loc_proposal_sigma = 0;
};
// Crea el sampler para m_chains cadenas, con n_samples_per_run steps por
// cada llamada a run. La log-pdf se inyecta como GLSL: el snippet debe
// definir
//
// float target_log_pdf(float x) { ... }
//
// y puede usar uniforms float u_user[16] (predeclarados en el preamble)
// para parametros que cambien sin recompilar. Se usan en el snippet con
// "u_user[0]", "u_user[1]", etc.
//
// Si la compilacion falla, m_chains=0 y program=0 — comprobar antes del
// run.
McMetropolisHastingsGpu mc_mh_gpu_create(int m_chains, int n_samples_per_run,
const std::string& target_log_pdf_glsl);
// Re-siembra los seeds y resetea curr_x a x0 (mismo valor para todas las
// cadenas, o array de m_chains valores si initial_xs != nullptr).
void mc_mh_gpu_reset(McMetropolisHastingsGpu& s,
unsigned long long master_seed,
float x0,
const float* initial_xs = nullptr);
// Ejecuta n_samples_per_run steps por chain. proposal_sigma controla el
// random-walk Gaussian. user_params (si != nullptr) se sube a u_user[0..15].
void mc_mh_gpu_run(McMetropolisHastingsGpu& s,
float proposal_sigma,
const float* user_params = nullptr,
int n_user_params = 0);
// Lee chains a CPU. out debe tener m_chains * n_samples_per_run floats,
// layout out[j * n + i] = sample i de la cadena j (compatible con
// rhat_split / ess_basic).
void mc_mh_gpu_readback_chains(const McMetropolisHastingsGpu& s, float* out);
// Lee accept counts a CPU. out debe tener m_chains uints. accept_rate de
// la cadena j: accept_counts[j] / n_samples_per_run.
void mc_mh_gpu_readback_accepts(const McMetropolisHastingsGpu& s,
unsigned int* out);
void mc_mh_gpu_destroy(McMetropolisHastingsGpu& s);
} // namespace fn::ds