tiny.accy.preparation.bufferization
Defined in preparation.
API (17)
Actions
Public operations.
BufferPlanAnalysis.deinitBufferPlanAnalysis.elisionCountBufferPlanAnalysis.getElisionBufferPlanAnalysis.getSlotBufferPlanAnalysis.initBufferPlanAnalysis.slotCountBufferSlot.hasStaticSizebufferizationPlanningPassgetBufferPlanAnalysis
Types and contracts
Public types and contracts.
Values and defaults
Public values and defaults.
buffer_plan_analysis_descriptorbuffer_plan_analysis_namebufferization_planning_pass_descriptionbufferization_planning_pass_name
Source
Source: lib/accy/src/preparation/bufferization/pass.zig:83
pub const BufferPlanAnalysis = struct { allocator: std.mem.Allocator, slots: std.ArrayListUnmanaged(BufferSlot), elisions: std.ArrayListUnmanaged(FusionElision), value_to_slot: std.AutoHashMap(*ir.Value, usize), value_to_elision: std.AutoHashMap(*ir.Value, usize), input_slot_count: usize = 0, output_slot_count: usize = 0, temporary_slot_count: usize = 0, constant_slot_count: usize = 0, dynamic_slot_count: usize = 0, total_static_bytes: u64 = 0, pub fn init(allocator: std.mem.Allocator) BufferPlanAnalysis { return .{ .allocator = allocator, .slots = .empty, .elisions = .empty, .value_to_slot = std.AutoHashMap(*ir.Value, usize).init(allocator), .value_to_elision = std.AutoHashMap(*ir.Value, usize).init(allocator), }; } pub fn deinit(self: *BufferPlanAnalysis) void { for (self.slots.items) |*slot| { slot.deinit(self.allocator); } self.slots.deinit(self.allocator); self.elisions.deinit(self.allocator); self.value_to_slot.deinit(); self.value_to_elision.deinit(); self.* = undefined; } pub fn slotCount(self: BufferPlanAnalysis) usize { return self.slots.items.len; } pub fn elisionCount(self: BufferPlanAnalysis) usize { return self.elisions.items.len; } pub fn getSlot(self: *const BufferPlanAnalysis, value: *ir.Value) ?*const BufferSlot { const index = self.value_to_slot.get(value) orelse return null; return &self.slots.items[index]; } pub fn getElision(self: *const BufferPlanAnalysis, value: *ir.Value) ?*const FusionElision { const index = self.value_to_elision.get(value) orelse return null; return &self.elisions.items[index]; } fn addSlot( self: *BufferPlanAnalysis, value: *ir.Value, producer: ?*ir.Operation, function: ?*ir.Operation, role: BufferRole, info: shape_analysis.TensorInfo, ) !usize { if (self.value_to_slot.get(value)) |existing| return existing; const total_bytes = try accounting.add(self.total_static_bytes, byteSize(info) orelse 0); const id = self.slots.items.len; var slot = try BufferSlot.init( self.allocator, id, value, producer, function, role, info, ); errdefer slot.deinit(self.allocator); try self.value_to_slot.put(value, id); errdefer _ = self.value_to_slot.remove(value); try self.slots.append(self.allocator, slot); if (role.input) self.input_slot_count += 1; if (role.output) self.output_slot_count += 1; if (role.temporary) self.temporary_slot_count += 1; if (role.constant) self.constant_slot_count += 1; self.total_static_bytes = total_bytes; if (slot.byte_size == null) self.dynamic_slot_count += 1; return id; } fn addAlias( self: *BufferPlanAnalysis, value: *ir.Value, source: *ir.Value, role: BufferRole, ) !usize { if (self.value_to_slot.get(value)) |existing| return existing; const id = self.value_to_slot.get(source) orelse return error.MissingAliasedBufferSlot; try self.value_to_slot.put(value, id); self.mergeSlotRole(id, role); return id; } fn mergeSlotRole(self: *BufferPlanAnalysis, id: usize, role: BufferRole) void { var slot = &self.slots.items[id]; if (role.input and !slot.role.input) { slot.role.input = true; self.input_slot_count += 1; } if (role.output and !slot.role.output) { slot.role.output = true; self.output_slot_count += 1; } if (role.constant and !slot.role.constant) { slot.role.constant = true; self.constant_slot_count += 1; } if (role.temporary and !slot.role.temporary and !slot.role.input and !slot.role.output and !slot.role.constant) { slot.role.temporary = true; self.temporary_slot_count += 1; } if ((slot.role.input or slot.role.output or slot.role.constant) and slot.role.temporary) { slot.role.temporary = false; self.temporary_slot_count -= 1; } } fn addElision(self: *BufferPlanAnalysis, elision: FusionElision) !void { if (self.value_to_elision.contains(elision.value)) return; const index = self.elisions.items.len; try self.value_to_elision.put(elision.value, index); errdefer _ = self.value_to_elision.remove(elision.value); try self.elisions.append(self.allocator, elision); }};Source: lib/accy/src/preparation/bufferization/pass.zig:21
pub const BufferSlot = struct { id: usize, value: *ir.Value, producer: ?*ir.Operation, function: ?*ir.Operation, role: BufferRole, dtype: choir_abi.DType, dims: []i64, element_count: ?u64, row_major_strides: ?[]u64, byte_size: ?u64, fn init( allocator: std.mem.Allocator, id: usize, value: *ir.Value, producer: ?*ir.Operation, function: ?*ir.Operation, role: BufferRole, info: shape_analysis.TensorInfo, ) !BufferSlot { const dims = try allocator.dupe(i64, info.dims); errdefer allocator.free(dims); var strides: ?[]u64 = null; if (info.row_major_strides) |existing| { strides = try allocator.dupe(u64, existing); errdefer if (strides) |owned| allocator.free(owned); } return .{ .id = id, .value = value, .producer = producer, .function = function, .role = role, .dtype = info.dtype, .dims = dims, .element_count = info.element_count, .row_major_strides = strides, .byte_size = byteSize(info), }; } pub fn hasStaticSize(self: BufferSlot) bool { return self.byte_size != null; } fn deinit(self: *BufferSlot, allocator: std.mem.Allocator) void { allocator.free(self.dims); if (self.row_major_strides) |strides| allocator.free(strides); self.* = undefined; }};Source: lib/accy/src/preparation/bufferization/pass.zig:76
pub const FusionElision = struct { value: *ir.Value, producer: *ir.Operation, root: *ir.Operation, cluster_index: usize,};Source: lib/accy/src/preparation/bufferization/pass.zig:277
pub const buffer_plan_analysis_descriptor = passes.AnalysisDescriptor{ .id = passes.analysisId(buffer_plan_analysis_name), .name = buffer_plan_analysis_name, .work_contract = .{ .identity = .{ .name = buffer_plan_analysis_name, .version = 1 }, .estimate = bufferAnalysisWork, },};Source: lib/accy/src/preparation/bufferization/pass.zig:14
pub const buffer_plan_analysis_name = "accy-choir-buffer-plan";Source: lib/accy/src/preparation/bufferization/pass.zig:299
pub fn bufferizationPlanningPass() passes.Pass { return .{ .name = bufferization_planning_pass_name, .description = bufferization_planning_pass_description, .run_fn = runBufferizationPlanningPass, .work_contract = .{ .identity = .{ .name = bufferization_planning_pass_name, .version = 1 }, .estimate = bufferPassWork, }, };}Source: lib/accy/src/preparation/bufferization/pass.zig:16
pub const bufferization_planning_pass_description = "Plan Accy Choir tensor buffer slots before lowering";Source: lib/accy/src/preparation/bufferization/pass.zig:15
pub const bufferization_planning_pass_name = "accy-choir-plan-buffers";Source: lib/accy/src/preparation/bufferization/pass.zig:286
pub fn getBufferPlanAnalysis( pass_ctx: *passes.PassContext, op: *ir.Operation,) !*BufferPlanAnalysis { const ptr = try pass_ctx.getAnalysis( op, &buffer_plan_analysis_descriptor, computeBufferPlanAnalysis, cleanupBufferPlanAnalysis, ); return @ptrCast(@alignCast(ptr));}Source: lib/accy/src/preparation/bufferization/pass.zig:19
pub const BufferRole = accy_choir.record.memory.BufferRole;Source: lib/accy/src/preparation/bufferization/root.zig
const pass = @import("pass.zig");pub const buffer_plan_analysis_name = pass.buffer_plan_analysis_name;pub const bufferization_planning_pass_name = pass.bufferization_planning_pass_name;pub const bufferization_planning_pass_description = pass.bufferization_planning_pass_description;pub const BufferRole = pass.BufferRole;pub const BufferSlot = pass.BufferSlot;pub const FusionElision = pass.FusionElision;pub const BufferPlanAnalysis = pass.BufferPlanAnalysis;pub const buffer_plan_analysis_descriptor = pass.buffer_plan_analysis_descriptor;pub const getBufferPlanAnalysis = pass.getBufferPlanAnalysis;pub const bufferizationPlanningPass = pass.bufferizationPlanningPass;Source: lib/accy/src/preparation/root.zig:2
pub const bufferization = @import("bufferization/root.zig");Complete caller list for preparation.bufferization.getBufferPlanAnalysis
9 direct callers.
lib.accy.src.preparation.bufferization.pass.checkBufferBoundary[function] — private source atlib/accy/src/preparation/bufferization/pass.zig:949in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.checkBufferChain[function] — private source atlib/accy/src/preparation/bufferization/pass.zig:1077in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.runBufferizationPlanningPass[function] — private source atlib/accy/src/preparation/bufferization/pass.zig:311in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_coalesces_aliased_kernel_call_results[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:689in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_elides_fusion-internal_tensor_values[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:642in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_keeps_non-returned_aliased_results_internal[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:738in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_records_function_boundary_slots[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:598in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_records_returned_constants[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:791in nearest public ownerlib.accy.src.preparation.bufferization.passlib.accy.src.preparation.bufferization.pass.test_bufferization_planning_rejects_aggregate_byte_overflow_before_publishing_slots[function] — test source atlib/accy/src/preparation/bufferization/pass.zig:1031in nearest public ownerlib.accy.src.preparation.bufferization.pass
Audit
| Definitions | 18 |
|---|---|
| Public names | 20 |
| Members | 25 |
| Version | 26.7.0 |
| Revision | daab053ee433 |