tiny.accy.preparation.kernelization
Defined in preparation.
API (39)
Actions
Public operations.
dotGeneralBlockTileFordotGeneralDescriptionForWorkelementwiseKernelForOperationexpectedInputCountgetKernelizationAnalysiskernelizationPassreductionAtomicPlanForreductionDescriptionForWorkreductionSingleBlockThreadsrowPipelineScheduleCandidatesscanScheduleCandidatesshapeKernelForOperation
Types and contracts
Public types and contracts.
DotGeneralBlockTileDotGeneralDescriptionDotGeneralMmaTileDotGeneralStaticDimsElementwiseKernelGeneratedKernelProgramGeneratedKernelSummariesGeneratedKernelSummaryGeneratedScheduleGeneratedScheduleKindKernelizationAnalysisLoweredKernelLoweredKernelBodyReductionAtomicPlanReductionDescriptionReductionKindReductionStaticDimsShapeKernel
Namespaces
Public namespaces.
Values and defaults
Public values and defaults.
generated_row_pipeline_schedule_versiongenerated_scan_schedule_versionkernelization_analysis_descriptorkernelization_analysis_namekernelization_pass_descriptionkernelization_pass_namemax_row_pipeline_schedule_candidatesmax_scan_schedule_candidates
Source
Source: lib/accy/src/preparation/kernelization/lowering/dot.zig:42
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, };}Source: lib/accy/src/preparation/kernelization/lowering/elementwise.zig:1370
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, };}Source: lib/accy/src/preparation/kernelization/lowering/elementwise.zig:1343
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;}Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:39
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));}Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:52
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
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
pub const kernelization_analysis_name = "accy-choir-kernelization-plan";Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:27
pub const kernelization_pass_description = "Lower scheduled Accy tensor work to kernel-language programs";Source: lib/accy/src/preparation/kernelization/lowering/pass.zig:26
pub const kernelization_pass_name = "accy-choir-plan-kernelization";Source: lib/accy/src/preparation/kernelization/lowering/reduction.zig:37
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, };}Source: lib/accy/src/preparation/kernelization/lowering/row.zig:56
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];}Source: lib/accy/src/preparation/kernelization/lowering/row.zig:53
pub const schedule_version: u32 = 1;Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:36
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];}Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:33
pub const schedule_version: u32 = 1;Source: lib/accy/src/preparation/kernelization/lowering/shape.zig:614
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;}Source: lib/accy/src/preparation/kernelization/lowering/row.zig:54
pub const max_schedule_candidates = block_schedules.len;Source: lib/accy/src/preparation/kernelization/lowering/scan.zig:34
pub const max_schedule_candidates = block_schedules.len;Source: lib/accy/src/preparation/kernelization/root.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
pub const kernelization = @import("kernelization/root.zig");Complete call list for preparation.kernelization.reductionDescriptionForWork
8 direct calls.
lib.accy.src.preparation.kernelization.lowering.common.externalInputIndex[function] — private source atlib/accy/src/preparation/kernelization/lowering/common.zig:110in nearest public ownerlib.accy.src.preparation.kernelization.lowering.commonlib.accy.src.preparation.kernelization.lowering.common.readI64ListAttrBounded[function] — private source atlib/accy/src/preparation/kernelization/lowering/common.zig:37in nearest public ownerlib.accy.src.preparation.kernelization.lowering.commonlib.accy.src.preparation.kernelization.lowering.reduction.concatReductionDescription[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:222in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reductionlib.accy.src.preparation.kernelization.lowering.reduction.reductionInitValue[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:1265in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reductionlib.accy.src.preparation.kernelization.lowering.reduction.reductionKindForOp[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:1257in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reductionlib.accy.src.preparation.kernelization.lowering.reduction.reductionStaticDims[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:1076in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reductionlib.accy.src.preparation.kernelization.lowering.reduction.reductionWorkIsFused[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:82in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reductionlib.accy.src.preparation.kernelization.lowering.reduction.validateReductionDTypes[function] — private source atlib/accy/src/preparation/kernelization/lowering/reduction.zig:1244in nearest public ownerlib.accy.src.preparation.kernelization.lowering.reduction
Audit
| Definitions | 18 |
|---|---|
| Public names | 20 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |