1#![allow(
2 clippy::doc_lazy_continuation,
3 clippy::double_must_use,
4 clippy::manual_div_ceil,
5 clippy::needless_range_loop,
6 clippy::collapsible_if,
7 clippy::match_like_matches_macro,
8 clippy::redundant_closure,
9 clippy::too_many_arguments,
10 clippy::nonminimal_bool,
11 clippy::derivable_impls
12)]
13mod emitter;
67mod error;
68mod index_facts;
69pub mod patterns;
70mod reg;
71mod target;
72
73use vyre_lower::KernelDescriptor;
74
75pub use error::EmitError;
76pub use target::{ComputeCapability, PtxEmitOptions};
77
78pub fn emit(desc: &KernelDescriptor) -> Result<String, EmitError> {
79 emit_with_target(desc, ComputeCapability::default())
80}
81
82pub fn emit_with_target(
83 desc: &KernelDescriptor,
84 target: ComputeCapability,
85) -> Result<String, EmitError> {
86 emit_with_options(desc, PtxEmitOptions::for_target(target))
87}
88
89pub fn emit_with_options(
90 desc: &KernelDescriptor,
91 options: PtxEmitOptions,
92) -> Result<String, EmitError> {
93 if options.subgroup_size == 0
94 || options.subgroup_size > 32
95 || !options.subgroup_size.is_power_of_two()
96 {
97 return Err(EmitError::InvalidDescriptor(format!(
98 "invalid CUDA subgroup size {}. Fix: pass the probed CUDA warp size.",
99 options.subgroup_size
100 )));
101 }
102 emitter::emit_text(desc, options)
103}
104
105pub fn emit_optimized(desc: &KernelDescriptor) -> Result<String, EmitError> {
110 emit_optimized_with_stats(desc).map(|(s, _)| s)
111}
112
113pub fn emit_optimized_with_stats(
116 desc: &KernelDescriptor,
117) -> Result<(String, vyre_lower::rewrites::OptimizationStats), EmitError> {
118 let (optimized, stats) = vyre_lower::rewrites::run_all_with_stats(desc);
119 debug_assert!(
120 vyre_lower::verify::verify(&optimized).is_ok(),
121 "rewrite pipeline produced an invalid descriptor - see vyre_lower::verify for the contract"
122 );
123 let ptx = emit(&optimized)?;
124 Ok((ptx, stats))
125}
126
127pub fn emit_optimized_with_target(
130 desc: &KernelDescriptor,
131 target: ComputeCapability,
132) -> Result<String, EmitError> {
133 emit_optimized_with_target_with_stats(desc, target).map(|(s, _)| s)
134}
135
136pub fn emit_optimized_with_target_with_stats(
140 desc: &KernelDescriptor,
141 target: ComputeCapability,
142) -> Result<(String, vyre_lower::rewrites::OptimizationStats), EmitError> {
143 let (optimized, stats) = vyre_lower::rewrites::run_all_with_stats(desc);
144 debug_assert!(
145 vyre_lower::verify::verify(&optimized).is_ok(),
146 "rewrite pipeline produced an invalid descriptor - see vyre_lower::verify for the contract"
147 );
148 let ptx = emit_with_target(&optimized, target)?;
149 Ok((ptx, stats))
150}
151
152#[cfg(test)]
153mod tests;