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

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