cfdf515228
- .claude/CLAUDE.md - .claude/commands/subagentes.md - .claude/rules/INDEX.md - .mcp.json - bash/functions/cybersecurity/analyze_dns.md - bash/functions/cybersecurity/audit_http_headers.md - bash/functions/cybersecurity/audit_ssh_config.md - bash/functions/cybersecurity/check_firewall.md - bash/functions/cybersecurity/detect_suspicious_users.md - bash/functions/cybersecurity/encrypt_file.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.7 KiB
4.7 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, framework, params, output
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | framework | params | output | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mc_metropolis_hastings_gpu | function | cpp | datascience | 1.0.0 | impure | McMetropolisHastingsGpu mc_mh_gpu_create(int m_chains, int n_samples_per_run, const std::string& target_log_pdf_glsl); void mc_mh_gpu_reset(...); void mc_mh_gpu_run(...); void mc_mh_gpu_readback_chains(...); void mc_mh_gpu_readback_accepts(...); void mc_mh_gpu_destroy(...) | Metropolis-Hastings 1D paralelo en GPU: M cadenas independientes (1 thread = 1 chain). Target log-pdf inyectable como string GLSL (igual patron que gl_shader). Soporta u_user[16] para parametros sin recompilar. |
|
|
false | error_go_core |
|
false | cpp/functions/datascience/mc_metropolis_hastings_gpu.cpp | opengl |
|
chains[m * n_samples_per_run] floats row-major (chain j, sample i = out[j*n + i]) — compatible con rhat_split / ess_basic. accept_counts[m] uints — accept_rate = counts[j] / total_steps_acumulado. |
mc_metropolis_hastings_gpu
Equivalente GPU de metropolis_hastings_cpp_datascience. La diferencia clave: la log-pdf se inyecta como string GLSL (no std::function) y se evalua dentro del kernel — sin call overhead, todo el inner loop ocurre en GPU.
Patron tipico (mcmc-bayes Beta-Binomial)
const std::string log_pdf = R"glsl(
float target_log_pdf(float theta) {
if (theta <= 0.0 || theta >= 1.0) return -1e30;
float a = u_user[0]; // alpha + k
float b = u_user[1]; // beta + (n - k)
return (a - 1.0) * log(theta) + (b - 1.0) * log(1.0 - theta);
}
)glsl";
auto mh = fn::ds::mc_mh_gpu_create(/*m_chains=*/8,
/*n_samples_per_run=*/100'000,
log_pdf);
fn::ds::mc_mh_gpu_reset(mh, /*seed=*/0xC0FFEE, /*x0=*/0.5f);
float user[2] = { 8.0f, 4.0f }; // alpha+k, beta+(n-k)
fn::ds::mc_mh_gpu_run(mh, /*proposal_sigma=*/0.1f, user, 2);
std::vector<float> chains(8 * 100'000);
fn::ds::mc_mh_gpu_readback_chains(mh, chains.data());
// Convergencia: convertir a double y pasar a rhat_split
std::vector<double> chains_d(chains.begin(), chains.end());
double r = fn::ds::rhat_split(chains_d.data(), 8, 100'000);
fn::ds::mc_mh_gpu_destroy(mh);
Performance
RTX 3070, 8 cadenas × 10^6 steps con log-pdf simple: ~50 ms total. Comparado con CPU single-thread (~3 s) son 60x. La ganancia se nota cuando arrastras un slider y quieres convergencia visible en cada frame.
u_user[]
Array de 16 floats que el shader puede leer sin recompilar. Asi puedes cambiar alpha, beta, mu_prior, sigma_prior etc. desde sliders sin volver a llamar create. Si necesitas mas de 16 parametros: agrupar en SSBO custom.
Notas
- chains[] se sobreescribe en cada run. Si llamas
rundos veces sin leer, solo conservas la cadena del segundo run. Para muestrear largos en chunks: leer entre runs. - curr_x persiste: el sampler continua de donde estaba. Solo
resetrebobina al x0. - accept_counts se acumulan: para tener accept_rate por run individual, lee antes y despues y resta.
- target_log_pdf devuelve
float— fp32 es suficiente para MC tipico. Para log-likelihoods muy condicionados (donde la diferencia entre log_p_curr y log_p_prop puede ser >10^7) considerar log-sum-exp manual o saturar antes de exp(). - Para sample 2D / d-dim: extender el body a
float[d] target_log_pdf(float[d] x)y arrays de proposal_sigma. No incluido en esta version (usar mc_random_walk_2d_gpu para 2D especificamente).