Sarek_interp.Sarek_ir_interp_intrinsicsThese 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 optionGPU thread/block/grid indices and dimensions
val eval_barrier_intrinsic : string -> Sarek_ir_interp_value.value optionBarrier synchronization intrinsics
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 -> intval warp_block_size : Sarek_ir_interp_value.thread_state -> intval warp_exchange_slots :
(string, Sarek_ir_interp_value.value array) Stdlib.Hashtbl.t ->
Sarek_warp.value_type ->
int ->
Sarek_ir_interp_value.value arrayval warp_check_block :
Sarek_ir_interp_value.thread_state ->
width:int ->
name:string ->
unitval eval_warp_shuffle :
(string, Sarek_ir_interp_value.value array) Stdlib.Hashtbl.t ->
Sarek_ir_interp_value.thread_state ->
name:string ->
Sarek_warp.op ->
Sarek_warp.value_type ->
Sarek_ir_interp_value.value ->
Sarek_ir_interp_value.value ->
Sarek_ir_interp_value.valueval 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.valueEvaluate a warp operation (warp_shuffle*, warp_size, lane_id). shared is the block's shared table.
val atomic_index : string -> 'a array -> Sarek_ir_interp_value.value -> intGlobal-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 eval_atomic_intrinsic :
string ->
Sarek_ir_interp_value.value list ->
Sarek_ir_interp_value.value optionval eval_float32_math_intrinsic :
string ->
Sarek_ir_interp_value.value list ->
Sarek_ir_interp_value.value optionFloat32 math intrinsics
val eval_float64_math_intrinsic :
string ->
Sarek_ir_interp_value.value list ->
Sarek_ir_interp_value.value optionFloat64 math intrinsics
val eval_int32_math_intrinsic :
string ->
Sarek_ir_interp_value.value list ->
Sarek_ir_interp_value.value optionInt32 math intrinsics
val eval_type_conversion_intrinsic :
string ->
Sarek_ir_interp_value.value list ->
Sarek_ir_interp_value.value optionType conversion intrinsics