use openvm_cuda_common::{
d_buffer::DeviceBuffer,
error::{check, CudaError},
stream::cudaStream_t,
};
use crate::{
poly::EqEvalSegments,
prelude::{EF, F},
stacked_reduction::UnstackedSlice,
};
pub const NUM_G: usize = 3;
extern "C" {
pub fn _stacked_reduction_r0_required_temp_buffer_size(
trace_height: u32,
trace_width: u32,
l_skip: u32,
) -> u32;
fn _stacked_reduction_sumcheck_round0(
eq_r_ns: *const EF,
trace_ptr: *const F,
lambda_pows: *const EF,
block_sums: *mut EF,
output: *mut EF,
trace_height: u32,
trace_width: u32,
l_skip: u32,
num_x: u32,
stream: cudaStream_t,
) -> i32;
fn _stacked_reduction_fold_ple(
src: *const F,
dst: *mut EF,
omega_skip_pows: *const F,
inv_lagrange_denoms: *const EF,
trace_height: u32,
trace_width: u32,
l_skip: u32,
stream: cudaStream_t,
) -> i32;
fn _initialize_k_rot_from_eq_segments(
eq_r_ns: *const EF,
k_rot_ns: *mut EF,
k_rot_uni_0: EF,
k_rot_uni_1: EF,
max_n: u32,
stream: cudaStream_t,
) -> i32;
fn _stacked_reduction_sumcheck_mle_round(
q_evals: *const *const EF,
eq_r_ns: *const EF,
k_rot_ns: *const EF,
unstacked_cols: *const UnstackedSlice,
lambda_pows: *const EF,
output: *mut u64, q_height: u32,
window_len: u32,
num_y: u32,
sm_count: u32,
stream: cudaStream_t,
) -> i32;
fn _stacked_reduction_sumcheck_mle_round_degenerate(
q_evals: *const *const EF,
eq_ub_ptr: *const EF,
eq_r: EF,
k_rot_r: EF,
unstacked_cols: *const UnstackedSlice,
lambda_pows: *const EF,
output: *mut u64, q_height: u32,
window_len: u32,
l_skip: u32,
round: u32,
stream: cudaStream_t,
) -> i32;
}
#[allow(clippy::too_many_arguments)]
pub unsafe fn stacked_reduction_sumcheck_round0(
eq_r_ns: &EqEvalSegments<EF>,
trace_ptr: *const F,
lambda_pows: *const EF,
block_sums: &mut DeviceBuffer<EF>,
output: &mut DeviceBuffer<EF>,
height: usize,
width: usize,
l_skip: usize,
stream: cudaStream_t,
) -> Result<(), CudaError> {
let output_size = NUM_G << l_skip;
let num_x = (height >> l_skip).max(1) as u32;
debug_assert!(output.len() >= output_size);
check(_stacked_reduction_sumcheck_round0(
eq_r_ns.buffer().as_ptr(),
trace_ptr,
lambda_pows,
block_sums.as_mut_ptr(),
output.as_mut_ptr(),
height as u32,
width as u32,
l_skip as u32,
num_x,
stream,
))
}
#[allow(clippy::too_many_arguments)]
pub unsafe fn stacked_reduction_fold_ple(
src: *const F,
dst: *mut EF,
omega_skip_pows: &DeviceBuffer<F>,
inv_lagrange_denoms: &DeviceBuffer<EF>,
trace_height: usize,
trace_width: usize,
l_skip: usize,
stream: cudaStream_t,
) -> Result<(), CudaError> {
let skip_domain = 1 << l_skip;
debug_assert!(omega_skip_pows.len() >= skip_domain);
debug_assert!(inv_lagrange_denoms.len() >= skip_domain);
check(_stacked_reduction_fold_ple(
src,
dst,
omega_skip_pows.as_ptr(),
inv_lagrange_denoms.as_ptr(),
trace_height as u32,
trace_width as u32,
l_skip as u32,
stream,
))
}
pub unsafe fn initialize_k_rot_from_eq_segments(
eq_r_ns: &EqEvalSegments<EF>,
k_rot_ns: &mut DeviceBuffer<EF>,
k_rot_uni_0: EF,
k_rot_uni_1: EF,
max_n: u32,
stream: cudaStream_t,
) -> Result<(), CudaError> {
debug_assert_eq!(eq_r_ns.buffer.len(), 2 << max_n);
debug_assert_eq!(k_rot_ns.len(), eq_r_ns.buffer.len());
check(_initialize_k_rot_from_eq_segments(
eq_r_ns.buffer.as_ptr(),
k_rot_ns.as_mut_ptr(),
k_rot_uni_0,
k_rot_uni_1,
max_n,
stream,
))
}
#[allow(clippy::too_many_arguments)]
pub unsafe fn stacked_reduction_sumcheck_mle_round(
q_evals: &DeviceBuffer<*const EF>,
eq_r_ns: &EqEvalSegments<EF>,
k_rot_ns: &EqEvalSegments<EF>,
unstacked_cols: *const UnstackedSlice,
lambda_pows: *const EF,
output: *mut u64,
q_height: usize,
window_len: usize,
num_y: usize,
sm_count: u32,
stream: cudaStream_t,
) -> Result<(), CudaError> {
check(_stacked_reduction_sumcheck_mle_round(
q_evals.as_ptr(),
eq_r_ns.buffer.as_ptr(),
k_rot_ns.buffer.as_ptr(),
unstacked_cols,
lambda_pows,
output,
q_height as u32,
window_len as u32,
num_y as u32,
sm_count,
stream,
))
}
#[allow(clippy::too_many_arguments)]
pub unsafe fn stacked_reduction_sumcheck_mle_round_degenerate(
q_evals: &DeviceBuffer<*const EF>,
eq_ub_ptr: *const EF,
eq_r: EF,
k_rot_r: EF,
unstacked_cols: *const UnstackedSlice,
lambda_pows: *const EF,
output: *mut u64,
q_height: usize,
window_len: usize,
l_skip: usize,
round: usize,
stream: cudaStream_t,
) -> Result<(), CudaError> {
check(_stacked_reduction_sumcheck_mle_round_degenerate(
q_evals.as_ptr(),
eq_ub_ptr,
eq_r,
k_rot_r,
unstacked_cols,
lambda_pows,
output,
q_height as u32,
window_len as u32,
l_skip as u32,
round as u32,
stream,
))
}