Module Sarek_interp.Sarek_ir_interp_intrinsics

Intrinsic Evaluation Helpers

These helper functions handle specific categories of GPU intrinsics. Split from a monolithic eval_intrinsic for better maintainability and testability. Each helper returns Option to enable clean dispatch logic.

Evaluate GPU thread/block/grid index and dimension intrinsics.

Handles the complete GPU execution model intrinsics:

Example: eval_gpu_index_intrinsic state "global_idx_x" (* Returns: VInt32 (block_idx_x * block_dim_x + thread_idx_x) *)

val eval_gpu_index_intrinsic : Sarek_ir_interp_value.thread_state -> string -> Sarek_ir_interp_value.value option

GPU thread/block/grid indices and dimensions

val eval_barrier_intrinsic : string -> Sarek_ir_interp_value.value option

Barrier synchronization intrinsics

Warp operations

The interpreter simulates the warp: Sarek_warp.simulated_width () consecutive threads of the block (linear thread id, x fastest). A shuffle is an exchange through a per-block array in the block's shared table between two barriers, exactly as Native does (Sarek_cpu_runtime_warp), and the source lane is Sarek_warp.source_lane.

val warp_linear_thread_id : Sarek_ir_interp_value.thread_state -> int
val warp_block_size : Sarek_ir_interp_value.thread_state -> int
val warp_exchange_slots : (string, Sarek_ir_interp_value.value array) Stdlib.Hashtbl.t -> Sarek_warp.value_type -> int -> Sarek_ir_interp_value.value array
val warp_check_block : Sarek_ir_interp_value.thread_state -> width:int -> name:string -> unit
val eval_warp_call : (string, Sarek_ir_interp_value.value array) Stdlib.Hashtbl.t -> Sarek_ir_interp_value.thread_state -> name:string -> Sarek_warp.call -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value

Evaluate a warp operation (warp_shuffle*, warp_size, lane_id). shared is the block's shared table.

val atomic_global_mutex : Stdlib.Mutex.t
val with_atomic_lock : (unit -> 'a) -> 'a
val atomic_index : string -> 'a array -> Sarek_ir_interp_value.value -> int

Global-memory atomics and memory fences.

Atomics on global vectors return the OLD value and update in place. The interpreter models global memory as a shared mutable VArray; fences are no-ops because a single logical memory is already sequentially consistent here. Sufficient for the Sarek_worklist queue pattern (atomic HEAD/TAIL counters + ring slots).

val atomic_arity : string -> int -> 'a -> 'b
val eval_atomic_intrinsic : string -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value option
val eval_float32_math_intrinsic : string -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value option

Float32 math intrinsics

val eval_float64_math_intrinsic : string -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value option

Float64 math intrinsics

val eval_int32_math_intrinsic : string -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value option

Int32 math intrinsics

val eval_type_conversion_intrinsic : string -> Sarek_ir_interp_value.value list -> Sarek_ir_interp_value.value option

Type conversion intrinsics