Skip to documentation
SLOP

tiny.accy.preparation.kernelization

Reference tiny.accy preparation kernelization

Defined in preparation.

API (39)

Actions

Public operations.

Types and contracts

Public types and contracts.

Namespaces

Public namespaces.

Values and defaults

Public values and defaults.

No direct callersNo direct callspreparationkernelization
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/accy/src/preparation/kernelization/lowering/dot.zig:42

zig
pub fn dotGeneralDescriptionForWork(    outline: kernelization_model.KernelOutline,    work: schedule_planning.ScheduleWorkItem,    buffer_plan: *const bufferization.BufferPlanAnalysis,) gpu.BackendError!DotGeneralDescription {    if (work.kind != .dot_general) return error.UnsupportedOperation;    if (work.ops.len == 0) return error.UnsupportedOperation;    if (!isName(work.ops[0].name.name, dialect_mod.AccyDialect.DotGeneralOp.operation_name)) return error.UnsupportedOperation;    if (work.ops.len == 1 and outline.inputCount() != 2) return error.UnsupportedOperation;    if (outline.inputCount() < 2) return error.UnsupportedOperation;    const lhs_slot = bufferSlotById(buffer_plan, outline.input_slot_ids[0]) orelse return error.InvalidArtifact;    const rhs_slot = bufferSlotById(buffer_plan, outline.input_slot_ids[1]) orelse return error.InvalidArtifact;    const output_slot = bufferSlotById(buffer_plan, outline.output_slot_id) orelse return error.InvalidArtifact;    try validateCanonicalDotLayout(work.ops[0], lhs_slot.dims.len);    const dims = try dotGeneralStaticDims(lhs_slot.*, rhs_slot.*, output_slot.*);    try validateDotGeneralDTypes(lhs_slot.*, rhs_slot.*, output_slot.*, work);    return .{        .input_dtype = lhs_slot.dtype,        .output_dtype = output_slot.dtype,        .dims = dims,    };}
Called byCallsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerprivate sourcelib.accy.src.preparation.kernelization.loweri...dotGeneralStaticDimsprivate sourcelib.accy.src.preparation.kernelization.loweri...validateCanonicalDotLayoutprivate sourcelib.accy.src.preparation.kernelization.loweri...validateDotGeneralDTypespreparation.kernelizationdotGeneralDescriptionForWork
Static calls · unresolved targets: 2 · external targets: 1.

Source: lib/accy/src/preparation/kernelization/lowering/elementwise.zig:1370

zig
pub fn expectedInputCount(kind: ElementwiseKernel) usize {    return switch (kind) {        .add, .sub, .mul, .div, .min, .max, .pow, .atan2, .compare => 2,        .neg, .abs, .sqrt, .exp, .log, .tanh, .sin, .cos, .tan, .floor, .round, .trunc, .convert => 1,        .select => 3,    };}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerpreparation.kernelizationexpectedInputCount
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/kernelization/lowering/elementwise.zig:1343

zig
pub fn kernelForOperation(op: *ir.Operation) ?ElementwiseKernel {    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.ConvertOp.operation_name)) return .convert;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.CompareOp.operation_name)) return .compare;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.SelectOp.operation_name)) return .select;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.AddOp.operation_name)) return .add;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.SubOp.operation_name)) return .sub;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.MulOp.operation_name)) return .mul;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.DivOp.operation_name)) return .div;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.MinOp.operation_name)) return .min;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.MaxOp.operation_name)) return .max;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.NegOp.operation_name)) return .neg;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.AbsOp.operation_name)) return .abs;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.SqrtOp.operation_name)) return .sqrt;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.ExpOp.operation_name)) return .exp;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.LogOp.operation_name)) return .log;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.TanhOp.operation_name)) return .tanh;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.SinOp.operation_name)) return .sin;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.CosOp.operation_name)) return .cos;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.TanOp.operation_name)) return .tan;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.FloorOp.operation_name)) return .floor;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.RoundOp.operation_name)) return .round;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.TruncOp.operation_name)) return .trunc;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.PowOp.operation_name)) return .pow;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.Atan2Op.operation_name)) return .atan2;    return null;}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.kernelization.loweri...collectVectorInputValueprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerprivate sourcelib.accy.src.preparation.kernelization.loweri...readValueAtPositionpreparation.kernelizationelementwiseKernelForOperation
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:39

zig
pub fn getKernelizationAnalysis(    pass_ctx: *passes.PassContext,    op: *ir.Operation,) !*KernelizationAnalysis {    const ptr = try pass_ctx.getAnalysis(        op,        &kernelization_analysis_descriptor,        computeKernelizationAnalysis,        cleanupKernelizationAnalysis,    );    return @ptrCast(@alignCast(ptr));}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.kernelization.loweri...runKernelizationPasspreparation.kernelizationgetKernelizationAnalysis
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:52

zig
pub fn kernelizationPass() passes.Pass {    return .{        .name = kernelization_pass_name,        .description = kernelization_pass_description,        .run_fn = runKernelizationPass,        .work_contract = .{            .identity = .{ .name = kernelization_pass_name, .version = 1 },            .estimate = lowering.work.pass,        },    };}

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:30

zig
pub const kernelization_analysis_descriptor = passes.AnalysisDescriptor{    .id = passes.analysisId(kernelization_analysis_name),    .name = kernelization_analysis_name,    .work_contract = .{        .identity = .{ .name = kernelization_analysis_name, .version = 1 },        .estimate = lowering.work.analysis,    },};

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:25

zig
pub const kernelization_analysis_name = "accy-choir-kernelization-plan";

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:27

zig
pub const kernelization_pass_description =    "Lower scheduled Accy tensor work to kernel-language programs";

Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:26

zig
pub const kernelization_pass_name = "accy-choir-plan-kernelization";

Source: lib/accy/src/preparation/kernelization/lowering/reduction.zig:37

zig
pub fn reductionDescriptionForWork(    outline: kernelization_model.KernelOutline,    work: schedule_planning.ScheduleWorkItem,    buffer_plan: *const bufferization.BufferPlanAnalysis,) gpu.BackendError!ReductionDescription {    if (work.kind != .reduction) return error.UnsupportedOperation;    if (work.ops.len == 0) return error.UnsupportedOperation;    const root = work.ops[work.ops.len - 1];    if (isName(root.name.name, dialect_mod.AccyDialect.ConcatenateOp.operation_name)) {        return concatReductionDescription(root, outline, work, buffer_plan);    }    const op = root;    if (!isName(op.name.name, dialect_mod.AccyDialect.ReduceOp.operation_name)) return error.UnsupportedOperation;    const operands = op.getOperandValues();    if (operands.len != 2) return error.UnsupportedOperation;    const fused = reductionWorkIsFused(work, buffer_plan);    if (!fused) {        const input_slot = buffer_plan.getSlot(operands[0]) orelse return error.InvalidArtifact;        if (externalInputIndex(outline, input_slot.id) != 0) return error.UnsupportedOperation;    }    var input_arena_buffer: [256]u8 = undefined;    var input_arena = alloc_fixed.FixedBuffer.init(input_arena_buffer[0..]);    const input_type = dialect_mod.decodeTensorType(input_arena.allocator(), operands[0].type) catch return error.InvalidArtifact;    const init_slot = buffer_plan.getSlot(operands[1]) orelse return error.InvalidArtifact;    const output_slot = bufferSlotById(buffer_plan, outline.output_slot_id) orelse return error.InvalidArtifact;    var axes_buffer: [i64_attr_list_stack_capacity]i64 = undefined;    const axes = try readI64ListAttrBounded(op, "dimensions", dialect_mod.AccyDialect.ReduceOp.dialectAttrName("dimensions"), &axes_buffer);    const dims = try reductionStaticDims(input_type.dims, output_slot.dims, axes);    try validateReductionDTypes(input_type.dtype, output_slot.dtype, work);    const kind = try reductionKindForOp(op);    const init = try reductionInitValue(init_slot.*, input_type.dtype, outline);    return .{        .kind = kind,        .input_dtype = input_type.dtype,        .output_dtype = output_slot.dtype,        .dims = dims,        .init = init,    };}
Called byCallsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerprivate sourcelib.accy.src.preparation.kernelization.loweri...externalInputIndexprivate sourcelib.accy.src.preparation.kernelization.loweri...readI64ListAttrBoundedprivate sourcelib.accy.src.preparation.kernelization.loweri...concatReductionDescriptionprivate sourcelib.accy.src.preparation.kernelization.loweri...reductionInitValueprivate sourcelib.accy.src.preparation.kernelization.loweri...reductionKindForOp+3 morepreparation.kernelizationreductionDescriptionForWork
Static calls · unresolved targets: 2 · external targets: 6.

Source: lib/accy/src/preparation/kernelization/lowering/row.zig:56

zig
pub fn scheduleCandidates(    cols: u64,    format: ?gpu.ArtifactFormat,    buffer: *[max_schedule_candidates]Schedule,) []const Schedule {    if (format != .cuda_ptx) return buffer[0..0];    var count: usize = 0;    for (block_schedules) |candidate_threads| {        if (!scheduleViable(candidate_threads, cols)) continue;        buffer[count] = .{ .threads = candidate_threads };        count += 1;    }    return buffer[0..count];}
Called byCallsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerprivate sourcelib.accy.src.preparation.kernelization.loweri...scheduleViablepreparation.kernelizationrowPipelineScheduleCandidates
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/kernelization/lowering/row.zig:53

zig
pub const schedule_version: u32 = 1;

Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:36

zig
pub fn scheduleCandidates(    total: u64,    format: ?gpu.ArtifactFormat,    buffer: *[max_schedule_candidates]Schedule,) []const Schedule {    if (format != .cuda_ptx) return buffer[0..0];    var count: usize = 0;    for (block_schedules) |schedule| {        if (!scheduleViable(schedule, total)) continue;        buffer[count] = schedule;        count += 1;    }    return buffer[0..count];}
Called byCallsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerprivate sourcelib.accy.src.preparation.kernelization.loweri...scheduleViablepreparation.kernelizationscanScheduleCandidates
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:33

zig
pub const schedule_version: u32 = 1;

Source: lib/accy/src/preparation/kernelization/lowering/shape.zig:614

zig
pub fn kernelForOperation(op: *ir.Operation) ?ShapeKernel {    if (isName(op.name.name, dialect_mod.AccyDialect.BroadcastInDimOp.operation_name)) {        return .broadcast_in_dim;    }    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.IotaOp.operation_name)) return .iota;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.ReshapeOp.operation_name)) return .reshape;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.TransposeOp.operation_name)) return .transpose;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.SliceOp.operation_name)) return .slice;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.PadOp.operation_name)) return .pad;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.ConcatenateOp.operation_name)) return .concatenate;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.GatherOp.operation_name)) return .gather;    if (std.mem.eql(u8, op.name.name, dialect_mod.AccyDialect.ScatterOp.operation_name)) return .scatter;    return null;}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.kernelization.loweri...lowerpreparation.kernelizationshapeKernelForOperation
Static calls · unresolved targets: 1 · external targets: 0.

Source: lib/accy/src/preparation/kernelization/lowering/row.zig:54

zig
pub const max_schedule_candidates = block_schedules.len;

Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:34

zig
pub const max_schedule_candidates = block_schedules.len;

Source: lib/accy/src/preparation/kernelization/root.zig

zig
pub const product = @import("model/root.zig");const lowering = @import("lowering/root.zig");pub const ElementwiseKernel = product.ElementwiseKernel;pub const ShapeKernel = product.ShapeKernel;pub const GeneratedScheduleKind = product.GeneratedScheduleKind;pub const GeneratedSchedule = product.GeneratedSchedule;pub const GeneratedKernelProgram = product.GeneratedKernelProgram;pub const GeneratedKernelSummary = product.GeneratedKernelSummary;pub const GeneratedKernelSummaries = product.GeneratedKernelSummaries;pub const LoweredKernel = product.LoweredKernel;pub const KernelizationAnalysis = product.KernelizationAnalysis;pub const DotGeneralStaticDims = product.DotGeneralStaticDims;pub const DotGeneralDescription = product.DotGeneralDescription;pub const DotGeneralBlockTile = product.DotGeneralBlockTile;pub const DotGeneralMmaTile = product.DotGeneralMmaTile;pub const dotGeneralBlockTileFor = product.dotGeneralBlockTileFor;pub const reductionSingleBlockThreads = product.reductionSingleBlockThreads;pub const LoweredKernelBody = product.LoweredKernelBody;pub const ReductionAtomicPlan = product.ReductionAtomicPlan;pub const reductionAtomicPlanFor = product.reductionAtomicPlanFor;pub const ReductionStaticDims = product.ReductionStaticDims;pub const ReductionKind = product.ReductionKind;pub const ReductionDescription = product.ReductionDescription;pub const kernelization_analysis_name = lowering.kernelization_analysis_name;pub const kernelization_pass_name = lowering.kernelization_pass_name;pub const kernelization_pass_description = lowering.kernelization_pass_description;pub const kernelization_analysis_descriptor = lowering.kernelization_analysis_descriptor;pub const getKernelizationAnalysis = lowering.getKernelizationAnalysis;pub const kernelizationPass = lowering.kernelizationPass;pub const dotGeneralDescriptionForWork = lowering.dotGeneralDescriptionForWork;pub const reductionDescriptionForWork = lowering.reductionDescriptionForWork;pub const elementwiseKernelForOperation = lowering.elementwiseKernelForOperation;pub const shapeKernelForOperation = lowering.shapeKernelForOperation;pub const expectedInputCount = lowering.expectedInputCount;pub const generated_scan_schedule_version = lowering.generated_scan_schedule_version;pub const max_scan_schedule_candidates = lowering.max_scan_schedule_candidates;pub const scanScheduleCandidates = lowering.scanScheduleCandidates;pub const generated_row_pipeline_schedule_version = lowering.generated_row_pipeline_schedule_version;pub const max_row_pipeline_schedule_candidates = lowering.max_row_pipeline_schedule_candidates;pub const rowPipelineScheduleCandidates = lowering.rowPipelineScheduleCandidates;

Source: lib/accy/src/preparation/root.zig:14

zig
pub const kernelization = @import("kernelization/root.zig");

Complete call list for preparation.kernelization.reductionDescriptionForWork

8 direct calls.

Audit

Definitions18
Public names20
Members0
Version26.7.0
Revisiondaab053ee433