CuLifter: Lifting GPU Binaries to Typed IR
Abstract: GPU compilers merge all data types into a single unified register file, erasing the type information that binary-analysis tools rely on. We show that type recovery from this untyped register file is the central challenge of GPU binary lifting. We present CuLifter, a SASS-to-LLVM IR lifting framework that recovers register types via constraint propagation with conflict detection, reconstructs explicit control flow, and aggregates multi-instruction patterns. Across eight benchmark suites (24,437 GPU functions in 919 cubins) spanning open-source applications, vendor libraries, and optimized ML runtimes, CuLifter successfully lifts 99.98% of functions to valid LLVM IR. An ablation study confirms that type recovery is the only step required to produce semantically correct IR: disabling it drops the x86 pass rate from 73.8% to 0%, a 73.8 percentage-point drop.
Paper Prompts
Sign up for free to create and run prompts on this paper using GPT-5.
Top Community Prompts
Explain it Like I'm 14
A simple explanation of “CuLifter: Lifting GPU Binaries to Typed IR”
1) What is this paper about?
This paper introduces CuLifter, a tool that can take very low-level GPU code (the kind computers actually run) and turn it back into a cleaner, easier-to-analyze form. Think of it like translating a scrambled recipe back into clear cooking steps. The main trick is figuring out what “kind” of data each register (a tiny storage slot inside the chip) holds—like whether it’s an integer, a floating-point number, or a memory address—because the GPU version hides those labels.
2) What questions does it try to answer?
To make this translation work well, the authors focus on three big questions:
- How can we recover the “type” of data in each register when the GPU code erases those labels?
- How can we rebuild the program’s “control flow” (its if-else paths and loops) when the GPU uses a different way of writing conditions?
- How can we recognize multi-step instruction patterns (several small steps that actually form one big operation) so the lifted code is readable and correct?
3) How did they do it? (Methods in everyday language)
Picture you’re a detective trying to make sense of a messy notebook where:
- All labels were removed (no “integer” or “float” tags),
- Many sentences are written as short “do this only if your hat is red” notes (predicated instructions),
- Some big ideas are split across several separate lines (multi-instruction patterns),
- And some tools are used but not named (hidden register groups).
Here’s how CuLifter solves it.
- Type recovery by “clue spreading” and “conflict spotting”
- Many instructions reveal what type they expect (for example, float-add clearly works on floats). These are clues.
- CuLifter spreads these clues along the chain of where values are defined and used (like tracing where a number came from and where it goes).
- If two clues disagree—say one instruction treats the same value as a float and another as an integer—that’s a “type conflict.” The tool then inserts an explicit “bitcast,” which means “we’re not changing the bits, just how we interpret them.” It’s like deciding to read the same 32 bits as either “3.14” (float) or “1065353216” (int), depending on context.
- Rebuilding control flow from predicates
- GPUs often use predicates (tiny on/off flags) instead of normal if-else branches. It’s like writing “if P is true, do this instruction” rather than jumping to a separate “then” block.
- CuLifter turns these into normal if-else choices by inserting “select” operations (a y-function idea), which is like: “r = P ? value_if_true : value_if_false.” This recovers a clear control-flow structure that other tools understand.
- Recognizing multi-instruction patterns
- Compilers often break a single logical operation into several low-level steps (like doing a 64-bit subtraction by stitching together two 32-bit steps).
- CuLifter spots these patterns and combines them back into one higher-level operation so the lifted code is simpler and less error-prone.
- Handling hidden details and embedded helpers
- Some GPU instructions quietly read or write extra registers that aren’t explicitly shown. CuLifter expands each instruction to include all the registers it actually touches so the dataflow is correct.
- Small helper functions can be tucked inside bigger GPU kernels without separate names. CuLifter finds these and recovers the call-and-return structure, so values that flow across calls are handled properly.
After doing all of this, CuLifter outputs strongly typed LLVM IR, a well-known intermediate language that many compilers and analysis tools can use.
4) What did they find, and why does it matter?
The authors tested CuLifter on a huge set of real GPU programs:
- 919 compiled GPU bundles (“cubins”), containing 24,437 GPU functions, from many areas like machine learning, graphics, science, and more.
- CuLifter successfully lifted 99.98% of the functions into valid LLVM IR.
- They showed that type recovery is the critical step. When they turn off type recovery, a downstream test that previously worked 73.8% of the time drops to 0%. In other words, without figuring out types, the whole translation falls apart.
Why this matters:
- Before this, there wasn’t a dependable way to turn NVIDIA GPU binaries into a typed, analyzable form. CuLifter makes it possible to study, check, optimize, or even retarget (move) GPU code to other platforms using existing compiler tools.
- This enables tasks people do all the time with CPU binaries—like security checking, performance analysis, and porting—to now also be done for GPU code, which is central to modern AI and high-performance computing.
5) What’s the bigger impact?
If you’ve ever wanted to understand or improve a high-speed GPU program without having its original source code, CuLifter opens that door. In simple terms:
- Security researchers can inspect closed-source GPU code for bugs or vulnerabilities.
- Performance engineers can analyze and tune GPU kernels using mature LLVM tools.
- Developers can aim to retarget certain GPU computations to other hardware (like CPUs) by starting from the lifted LLVM IR.
- Researchers and tool builders get a common, typed IR to build new analyses and optimizations for GPU software.
Overall, CuLifter turns GPU binaries from a black box into something readable and workable, by solving the toughest problem—reconstructing types—while also restoring control flow and higher-level operations.
Knowledge Gaps
Knowledge gaps, limitations, and open questions
Below is a concise, actionable list of what remains missing, uncertain, or unexplored in the paper that future researchers could address:
- Architecture and ISA coverage
- Implement and validate full support for newer tensor-core instructions (e.g., QGMMA on SM90 and emerging Blackwell ops), which currently cause lift failures in CUTLASS.
- Quantify and report lifting accuracy and correctness on SM75/SM80/SM100/SM120 with the same rigor as SM90, rather than stating qualitative similarity or omitting results due to resource limits.
- Assess portability of the approach to non-NVIDIA GPU ISAs (e.g., AMD GCN/RDNA, Intel Xe) or to PTX/SPIR-V inputs to understand generality.
- Control flow and SIMT semantics
- Extend CFG recovery to handle indirect branches/calls (e.g., BRX or switch-like jump tables), function pointers, and recursion—cases not discussed but present in optimized SASS.
- Provide a formal model/proof that y-function (select) insertion preserves semantics for predicated side-effecting instructions (e.g., stores, atomics, volatile ops) without reordering effects.
- Validate that treating convergence instructions (BSSY/BSYNC, SSY/SYNC) as metadata never permits cross-barrier value merges; add checks for dynamic reconvergence idioms under Independent Thread Scheduling.
- Device function recovery
- Remove reliance on relocation metadata for embedded device function discovery; develop symbol-agnostic heuristics for kernels shipped without relocations or with stripped symbols.
- Handle recursion and mutual recursion reliably in embedded device functions, and evaluate correctness on such cases.
- Type recovery limitations
- Reduce dependence on the “default to Int32” fallback for unconstrained values by integrating additional evidence (e.g., value-range analysis, opcode neighborhood, constant-shape heuristics) and quantify the semantic impact of these defaults.
- Improve reconstruction of 64-bit and 128-bit logical values across register-splitting and packing/unpacking patterns to close the gap in Int64/Float64 width accuracy.
- Incorporate memory-based type inference (beyond register def-use) to recover types that flow through loads/stores, including pointers and structured data, and evaluate its effect on accuracy and conflicts.
- Characterize worst-case propagation behavior (length of transparent chains) and introduce safeguards for scalability (e.g., path pruning, memoization) on large or obfuscated kernels.
- Bitcast insertion correctness
- Distinguish bit reinterpretation from true numeric conversions more robustly; measure and reduce false-positive bitcast insertions where the intended semantics is conversion rather than reinterpretation.
- Provide criteria to decide insertion points (definition vs use) when multiple conflicting uses exist, and quantify effects on downstream analyses.
- Pattern recognition and semantic normalization
- Expand and systematically validate the pattern library across compiler versions, optimization levels, and hand-written SASS to mitigate brittleness of template-based matching.
- Cover additional Hopper/Blackwell async pipelines (e.g., cp.async/TMA variants, dependency-barrier chains) and verify that fence/dependency semantics are preserved in the IR.
- Complete support for warp- and block-level collectives (e.g., all shfl.sync variants, match.any/all, ballot, reductions) and document lowering strategies when no LLVM intrinsic exists.
- Automate discovery of new idioms (e.g., via trace-driven equivalence, superoptimizer-style synthesis, or mining from corpora) to reduce manual maintenance.
- Memory model and address spaces
- Define a systematic lowering for cache and coherence modifiers (.CG, .CS, .LU, .WB, etc.), scopes, and memory fences to LLVM, ensuring both semantic fidelity and portability.
- Specify and implement runtime models for shared/local/global memory when retargeting to CPUs, including allocation, aliasing, and synchronization semantics.
- Evaluate correctness for predicated memory operations and atomics after select-based normalization, especially under CUDA’s memory model.
- Implicit register expansion
- Provide a verifiable, maintainable source for per-opcode implicit register tables (including tensor op register maps), and a plan to keep them current as NVIDIA ISAs evolve.
- Explore automated extraction of implicit operand mappings (e.g., from disassembler traces or microbenchmarks) to reduce manual curation.
- Special registers and SR substitution
- Replace heuristic SR_* identification via constant-memory offsets with a more robust mechanism; validate across CUDA versions and compilers to avoid misclassification.
- Evaluation and downstream validation
- Analyze and address scalability bottlenecks that caused 47 cubin-level timeouts (e.g., parallelizing CFG build, pattern matching, and propagation), and report end-to-end performance and memory usage.
- Demonstrate downstream applications (e.g., vulnerability analysis, performance modeling, cross-ISA recompilation) with quantitative metrics to substantiate practical utility.
- Compare against alternative approaches (e.g., NVBit/SASSI for instrumentation, CASS for translation) on shared tasks to contextualize benefits and limitations.
- Soundness and completeness
- Provide formal soundness arguments (or counterexamples) for the type lattice, propagation rules, and conflict resolution under SIMT execution and predication.
- Add diagnostics and confidence measures for ambiguous or low-evidence inferences so users can assess risk in downstream uses.
- Retargeting and execution model
- Clarify how SIMT parallelism is represented when lowering to CPU backends (e.g., scalarization vs vectorization vs threading), and evaluate correctness w.r.t. CUDA’s memory and synchronization semantics.
- Address the handling of GPU-specific intrinsics (e.g., MMA, shuffles) when retargeting to non-GPU backends lacking equivalent hardware support, including synthesized fallbacks and their performance/correctness.
- Numerics and stability
- Verify numerical equivalence (including rounding and special cases) for reconstructed multi-instruction approximations (e.g., reciprocal chains), especially when targeting different FP environments.
- Evaluate the impact of bitcasts across float/int boundaries on downstream optimizations and numerical stability.
- Robustness and security
- Test robustness on adversarial or obfuscated SASS (e.g., confusing predicate patterns, opaque constants) and document failure modes and mitigations.
- Assess how lifting errors (e.g., mis-typed values, missed implicit operands) propagate into security analyses to prioritize hardening efforts.
Practical Applications
Practical applications derived from “CuLifter: Lifting GPU Binaries to Typed IR”
Below are actionable, real-world applications that follow from the paper’s findings and techniques (typed lifting of NVIDIA SASS to LLVM IR via type recovery, predicated SSA construction with y-functions, and pattern normalization). Applications are grouped by near-term deployability and longer-term opportunities, with sectors, potential tools/workflows, and feasibility notes.
Immediate Applications
- Security auditing of closed-source CUDA binaries (e.g., cuDNN, TensorRT, cuBLAS, NCCL)
- Sectors: software, cloud, ML infrastructure, finance, critical infrastructure
- What: Run LLVM static analyses (e.g., bounds checks, use-after-free heuristics, taint analysis) on typed, SSA-form IR recovered from SASS to surface memory/errors, risky casts, or suspicious control flow; build vulnerability scanners for GPU cubins included in containers/images
- Tools/workflows: LLVM pass pipeline; integration into CI/CD scanners for CUDA containers; SBOM-like reports for cubins (functions, CFG, memory ops, tensor usage)
- Assumptions/dependencies: NVIDIA-only (SM75/SM90/SM100/SM120 supported); analysis must consider SIMT semantics; license/legal review if auditing third-party binaries; incomplete intrinsics (e.g., QGMMA) may require whitelisting
- Software supply-chain and governance checks for GPU workloads
- Sectors: cloud platforms, enterprise IT/security, ML Ops
- What: Gate third-party GPU binaries by scanning for disallowed instructions (e.g., HGMMA on unsupported GPUs), embedded device functions, or missing convergence; produce compliance attestations
- Tools/workflows: Pre-deployment policy engine on top of CuLifter; rule-based instruction/pattern checks; artifact signing with scan results
- Assumptions/dependencies: Keep opcode tables updated per GPU generation; organizational policies defining “disallowed” features
- CPU-based testing, fuzzing, and debugging of GPU kernels via retargeting
- Sectors: software development, ML frameworks, academia
- What: Compile lifted LLVM IR to x86 to run unit tests/fuzzers without GPUs; leverage IR for symbolic execution and sanitizers to reproduce and triage GPU-side bugs
- Tools/workflows: LLVM backends to x86; libFuzzer/AFL harnesses on retargeted kernels; KLEE/SMT tooling on IR; integration into dev CI
- Assumptions/dependencies: Not all GPU intrinsics map cleanly to CPU; performance not representative; functional coverage depends on intrinsics and memory model emulation; paper indicates high pass rate but not 100%
- Reverse engineering and documentation of performance-critical kernels
- Sectors: ML systems, HPC, ISV libraries, education
- What: Generate typed IR and CFG visualizations for understanding and documenting proprietary SASS; identify multi-instruction idioms (carry chains, reciprocal sequences) and reconstruct higher-level intent
- Tools/workflows: IR-to-C decompilers plugged after CuLifter; graph viewers; pattern-matching reports
- Assumptions/dependencies: Coverage for newer instructions must be maintained; potential license/IP considerations
- Static performance characterization and regression detection
- Sectors: HPC, ML/DNN, EDA, simulation
- What: Use typed IR to count/attribute memory ops (global/shared/local), tensor-core usage, control-flow divergence points, and synchronization patterns; flag changes across versions (e.g., extra barriers, altered memory width)
- Tools/workflows: LLVM analysis passes; autogenerated performance “signatures” used in CI regression dashboards
- Assumptions/dependencies: Static metrics are proxies for performance; must be paired with runtime profiling for fidelity
- CUDA cooperative-group and synchronization correctness checks
- Sectors: robotics, autonomous systems, safety-critical HPC, education
- What: Verify presence/placement of BAR.SYNC/WARPSYNC and convergence barriers; flag patterns that could cause deadlock/divergence or misuse of collectives
- Tools/workflows: Pattern-based lints on normalized SSIR; IR-level checks for y/φ merge correctness
- Assumptions/dependencies: SIMT barrier semantics differ by architecture; false positives possible without whole-program context
- Binary compatibility and deployment readiness assessment
- Sectors: cloud, edge/embedded, gaming
- What: Determine if cubins depend on architecture-specific features (e.g., HMMA/HGMMA variants, specific address-space widths), and whether they can run on target fleets
- Tools/workflows: Static “capability manifest” from lifted IR; fleet compatibility checks
- Assumptions/dependencies: Accurate per-ISA opcode tables; evolving GPU generations require continuous updates
- Education and research enablement for SIMT analysis
- Sectors: academia, training programs
- What: Course labs and research exploration using real kernels lifted to typed IR to study SIMT predication, convergence, and type conflicts
- Tools/workflows: Classroom packages with CuLifter outputs; IR-centric exercises
- Assumptions/dependencies: Availability of curated cubins and teaching materials
- High-level decompilation for code comprehension and migration planning
- Sectors: enterprise IT, modernization services
- What: Feed typed IR into existing decompilers to generate pseudo-C; assess feasibility of replacing vendor binaries or porting algorithms
- Tools/workflows: Ghidra/IDA plugins operating on LLVM IR; diff tooling between cubin versions
- Assumptions/dependencies: Decompiler quality depends on IR richness and intrinsics mapping; manual review often needed
Long-Term Applications
- Cross-vendor GPU binary translation and portability (NVIDIA SASS → LLVM IR → AMDGPU/other accelerators)
- Sectors: cloud, hyperscalers, ML systems, HPC centers
- What: Retarget typed GPU binaries to alternative hardware backends via LLVM; reduce vendor lock-in for legacy kernels
- Tools/workflows: LLVM AMDGPU backend; mapping layers for address spaces, wavefront/warp semantics, and tensor intrinsics
- Assumptions/dependencies: Significant semantic gaps (SIMT vs wavefront, memory model, tensor ops); legal/licensing constraints; requires robust intrinsic coverage and testing
- Automated hardening and control-flow integrity (CFI) for GPU kernels
- Sectors: security, regulated industries, multi-tenant cloud
- What: Insert CFI checks, memory safety guards, and sanitizers at IR level and recompile back to GPU targets; reduce exploitability of GPU kernels
- Tools/workflows: LLVM security passes adapted for GPU; NVPTX/PTXAS toolchain for re-emission; deployment hooks to swap hardened kernels
- Assumptions/dependencies: End-to-end toolchain to go back to GPU binaries; performance overhead validation; vendor toolchain integration
- Formal verification and race/determinism proofs for SIMT kernels
- Sectors: safety-critical healthcare imaging, automotive, avionics, finance risk engines
- What: Use typed IR and explicit control flow to model-check barrier placement, absence of data races, and determinism across SIMT paths
- Tools/workflows: SMT-based verifiers on LLVM IR extended with GPU memory spaces and predicates; refinement types for address-space constraints
- Assumptions/dependencies: Precise GPU memory and scheduling model is required; state explosion; may require new verification frameworks
- Robust GPU kernel fuzzing at scale (GPU semantics-aware)
- Sectors: security research, library vendors, cloud platforms
- What: Build a SIMT-aware fuzzing framework that mutates inputs and schedules to uncover divergence bugs, barrier misuse, and precision errors in lifted kernels
- Tools/workflows: Coverage-guided fuzzers on IR; GPU emulation or instrumented recompile; oracles for numerical tolerance
- Assumptions/dependencies: High-fidelity execution environment; defining correctness oracles for floating-point-heavy kernels
- Automatic precision/energy optimization using type-boundary insights
- Sectors: mobile/edge AI, energy-constrained HPC, robotics
- What: Identify safe float-int reinterpretations and precision downgrades (e.g., FP32→BF16/FP16) to trade accuracy for energy/performance, guided by detected type boundaries and patterns
- Tools/workflows: Static pattern analysis + search/auto-tuning; regression-test harnesses; integration with quantization pipelines
- Assumptions/dependencies: Domain-specific tolerances; numeric stability analysis; backends must support targeted precisions
- Binary-level patching and hotfix pipelines for vendor libraries
- Sectors: ML platforms, ISVs, enterprise IT
- What: Apply targeted IR-level fixes (e.g., out-of-bounds checks, barrier corrections) and re-emit patched kernels pending upstream updates
- Tools/workflows: Patch management system; differential testing against original outputs; canary rollouts
- Assumptions/dependencies: Reliable round-trip back to deployable GPU binaries; legal/maintenance risks; potential performance regressions
- Heterogeneous JIT and fallback execution in production
- Sectors: cloud inference/training, edge AI
- What: On unsupported GPUs or transient GPU shortages, JIT-translate hot kernels to CPU/other accelerators as a functional fallback to maintain service continuity
- Tools/workflows: Runtime kernel selection; caching of translated artifacts; SLO-aware routing
- Assumptions/dependencies: Throughput/latency gaps vs GPU; coverage of intrinsics; resource cost trade-offs
- Side-channel and microarchitectural leakage analysis for GPU code
- Sectors: security, privacy, finance
- What: Analyze memory access regularity, bank conflicts, and divergence-driven timing variability in typed IR to assess leak risks and propose mitigations
- Tools/workflows: Static analyzers for coalescing/banking patterns; optional IR transformations (e.g., constant-time rewrites)
- Assumptions/dependencies: Mapping static patterns to real timing/leakage requires hardware models; mitigations may be costly
- Domain-specific compliance validation of GPU pipelines
- Sectors: healthcare (medical imaging), autonomous systems, finance (model risk)
- What: Certify binary-only GPU components by checking explicit properties (e.g., no undefined reinterprets across type families outside annotated boundaries; correct use of barriers in safety-critical kernels)
- Tools/workflows: Property checkers on IR; audit artifacts for regulators; reproducibility harnesses
- Assumptions/dependencies: Domain-tailored specifications; acceptance by regulators; completeness of analyses
Notes on general dependencies affecting feasibility across applications:
- Architecture coverage and evolution: The lifter currently targets NVIDIA SASS (SM75/SM90/SM100/SM120); new generations require parser/pattern updates.
- Intrinsic coverage: Some instructions (e.g., QGMMA) may be treated as opaque intrinsics until modeled; downstream analyses/retargeting must handle these conservatively.
- Memory/address spaces and SIMT semantics: Accurate modeling of global/shared/local spaces and predication/convergence is essential; cross-architecture retargeting requires careful semantic alignment.
- Legal/ethical considerations: Reverse engineering and modifying proprietary binaries can be constrained by EULAs and local law; organizational policies must guide use.
- Scalability: Very large cubins may need higher timeouts or sharding to process within CI budgets.
Glossary
- Ablation study: An experimental analysis that removes or disables components to assess their impact on outcomes. "An ablation study confirms that type recovery is the only step required to produce semantically correct IR"
- address-space annotations: LLVM qualifiers that indicate which memory region (e.g., global, shared) a pointer or load/store targets. "memory-space qualifiers become LLVM address-space annotations."
- BF16: Brain floating point, a 16-bit floating-point format with 8-bit exponent and 7-bit mantissa. "the floating-point family { Float16, BF16, TF32, Float32, Float64}"
- bitcast: A type-punning operation that reinterprets the bit pattern of a value without changing it. "A lifter must detect this implicit type boundary and insert an explicit bitcast; otherwise, it cannot assign a single LLVM type to R25."
- binary lifting: Translating machine code back into a higher-level intermediate representation for analysis or recompilation. "Binary lifting translates machine code back into a higher-level IR amenable to compiler analysis."
- BSSY: A GPU convergence instruction marking the start of a divergent region to be reconverged later. "On Volta and later architectures, BSSY and BSYNC are used"
- BSYNC: A GPU convergence instruction indicating a reconvergence point for divergent threads. "On Volta and later architectures, BSSY and BSYNC are used"
- carry chain: A multi-instruction sequence that propagates carry/borrow across lower-width operations to implement wider arithmetic. "carry chains, reciprocal approximations"
- constraint propagation: Inferring unknown types or properties by propagating constraints along dataflow until a consistent fixpoint is reached. "constraint propagation with conflict detection"
- control-flow graph (CFG): A graph representation of a program where nodes are basic blocks and edges represent flow of control. "After CFG construction, the kernel body and the device function appear as disconnected subgraphs within a single SASS function."
- convergence barriers: Architectural markers that delineate regions of divergent execution and their reconvergence points. "extending it for SIMT-specific predication and convergence barriers."
- cooperative groups: CUDA abstractions that represent collections of threads coordinating with specific synchronization patterns. "CUDA-specific objects such as cooperative groups are not represented by explicit SASS opcodes"
- cubin: A compiled CUDA binary container holding GPU machine code (SASS) and metadata. "Across eight benchmark suites (24,437 GPU functions in 919 cubins)"
- def-use edges: Dataflow links from a value’s definition to its subsequent uses, used for analyses like type propagation. "propagating type constraints from typed opcodes along def-use edges"
- device function: A GPU function callable from kernels that executes on the device and may be embedded within kernel code. "the compiler embeds device functions inside the kernel function."
- DWARF: A standardized debugging data format used to encode source-level information in binaries. "ground truth from debug information (DWARF)"
- fixpoint: A stable state of an iterative analysis where further propagation causes no changes. "A worklist-based fixpoint iterates until no set changes."
- HGMMA: Hopper-generation tensor-core matrix multiply-accumulate instruction family operating on many implicit registers. "On SM90, HGMMA. 64x128x16.F32 accesses 164 registers through four named operands."
- HMMA: Tensor-core matrix multiply-accumulate instruction family (e.g., on SM75) with implicit multi-register operands. "On SM75, HMMA. 16816. F32 names four registers but actually accesses fourteen."
- Independent Thread Scheduling: A GPU feature allowing threads within a warp to progress independently post-divergence. "Starting with the Volta architecture, NVIDIA introduced Independent Thread Scheduling, which gives each thread its own program counter and call stack"
- intrinsics: Target-specific or IR-level built-in functions that map closely to hardware capabilities. "MMA instructions use NVIDIA's standard 11vm. nvvm. mma. * intrinsics;"
- lattice (type lattice): A partially ordered set structuring types to support meet/join operations during inference. "We partition the lattice into width-based subsets"
- LLVM IR: A strongly typed, platform-independent intermediate representation in SSA form used by the LLVM compiler framework. "LLVM IR [38] is a strongly typed, platform-independent assembly in static single assignment (SSA) form"
- NVCC: NVIDIA’s CUDA compiler that lowers CUDA/PTX to SASS and may insert padding or specific code idioms. "NVCC places these as safety padding to prevent threads from falling through to invalid instructions"
- NVPTX: LLVM’s backend/target for NVIDIA’s PTX virtual ISA. "with support for x86, ARM, RISC-V, NVPTX, and others."
- ø-node: A phi-node in SSA that merges values from multiple control-flow predecessors. "where a ø-node selects a value based on which control-flow edge was taken"
- predicated execution: An execution model where instructions are conditionally enabled by predicate registers instead of explicit branches. "Both IA-64 and NVIDIA SASS support predicated execution"
- predicate register: A special boolean register used to guard conditional execution of instructions. "a predicate register (e.g., p0-p63 in IA-64, P0-P7 in SASS)"
- reconvergence points: Locations where divergent threads in SIMT execution are required to rejoin control flow. "Instructions like BSSY/BSYNC (Volta+) or SSY/SYNC (pre-Volta) mark reconvergence points."
- SASS: NVIDIA’s native GPU machine code (assembly) produced from PTX for specific architectures. "SASS [42] is the native machine code for NVIDIA GPUs."
- SIMT: Single Instruction, Multiple Threads; a GPU execution model where warps execute the same instruction across multiple threads. "The NVIDIA GPU architecture is built upon the Single Instruction, Multiple Threads (SIMT) execution model."
- SSA (Static Single Assignment): A representation where each variable is assigned exactly once, simplifying dataflow analyses. "Standard SSA construction [14] assumes every instruction in a basic block executes unconditionally."
- tensor-core instructions: Specialized GPU operations for matrix multiply-accumulate on tensor cores with implicit multi-register operands. "Tensor-core instructions demonstrate an extreme case."
- TF32: TensorFloat-32, a 19-bit precision format encoded within 32-bit containers for tensor operations. "HMMA. *. F32. TF32 selects TF32"
- type-seeding instructions: Instructions whose opcode inherently reveals operand/result types, providing initial evidence for inference. "Type-seeding instruc- tions dominate across all suites"
- type-transparent instructions: Operations (e.g., moves, bitwise, memory) that pass values without revealing their type, requiring propagation to resolve. "Type-transparent instructions (moves, bitwise logic, and memory operations) propagate constraints"
- y-function (psi-function): A predicated SSA construct that merges values based on predicate conditions, analogous to select. "Stoutchinin and de Ferrière [54] introduced the y-function (psi- function) for IA-64 predicated code"
- warp: A group of typically 32 GPU threads that execute in lockstep under SIMT. "Threads are grouped into warps of 32 threads that execute in lockstep."
Collections
Sign up for free to add this paper to one or more collections.