Module Spoc_framework_registry.Intrinsic_registry

type intrinsic_impl = {
  1. intr_name : string;
  2. intr_codegen : string;
    (*

    Code to generate (simple string for now)

    *)
  3. intr_convergence : Spoc_framework.Framework_sig.convergence;
}

Generic intrinsic implementation record. This is the concrete type used by backends; the module type INTRINSIC_REGISTRY uses an abstract type to allow flexibility.

Create an intrinsic registry for a specific backend. Each backend should create its own registry instance.

module Global : sig ... end

Global registry that combines all backend registries. Used for intrinsic lookup when the backend is not yet known.

Standard Intrinsic Definitions

module Thread_intrinsics : sig ... end

Thread indexing intrinsics - must be implemented by all GPU backends

module Sync_intrinsics : sig ... end

Synchronization intrinsics

module Atomic_intrinsics : sig ... end

Atomic operation intrinsics

module Math_intrinsics : sig ... end

Math intrinsics - typically map to hardware instructions

Helper Functions

val make_simple_intrinsic : name:string -> codegen:string -> intrinsic_impl

Create a simple intrinsic that maps to a direct code string

val make_sync_intrinsic : name:string -> codegen:string -> intrinsic_impl

Create a synchronization intrinsic

val make_divergent_intrinsic : name:string -> codegen:string -> intrinsic_impl

Create a divergent intrinsic (result varies per thread)

Intrinsic Validation

val is_safe_in_divergent_flow : intrinsic_impl -> bool

Check if an intrinsic is safe to call in divergent control flow

val requires_uniform_execution : intrinsic_impl -> bool

Check if an intrinsic requires all threads to participate