7b0384c804
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>
72 lines
2.6 KiB
C++
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
|