tiny.simd.unroll
Defined in unroller.
Source
Source: lib/simd/src/unroller.zig:226
zig
pub fn unroll(unit: anytype, input: anytype, output: anytype) void { const Unit = pointee(@TypeOf(unit)); const Base = unitBase(Unit, 1); if (!@hasDecl(Unit, "func")) @compileError("unroller unit must declare func"); const input_slice: []const Base.Input = input; const output_slice: []Base.Output = output; const lane_count = Base.actual_lanes; std.debug.assert(input_slice.len <= std.math.maxInt(isize)); var x0 = x0Init(Unit, Base, unit); var y = yInit(Unit, Base, unit); var index: usize = 0; if (input_slice.len < lane_count) { const count: isize = @intCast(input_slice.len); x0 = maskLoad(Unit, Base, unit, 0, input_slice, count); y = unit.func(0, x0, y); _ = maskStore(Unit, Base, unit, 0, output_slice, y, count); _ = reduceFinal(Unit, Base, unit, y, output_slice); return; } if (input_slice.len > 4 * lane_count) { var x01 = x0Init(Unit, Base, unit); var y1 = yInit(Unit, Base, unit); var x02 = x0Init(Unit, Base, unit); var y2 = yInit(Unit, Base, unit); var x03 = x0Init(Unit, Base, unit); var y3 = yInit(Unit, Base, unit); while (index + 4 * lane_count <= input_slice.len) { x0 = load(Unit, Base, unit, @intCast(index), input_slice); x01 = load(Unit, Base, unit, @intCast(index + lane_count), input_slice); x02 = load(Unit, Base, unit, @intCast(index + 2 * lane_count), input_slice); x03 = load(Unit, Base, unit, @intCast(index + 3 * lane_count), input_slice); y = unit.func(@intCast(index), x0, y); y1 = unit.func(@intCast(index + lane_count), x01, y1); y2 = unit.func(@intCast(index + 2 * lane_count), x02, y2); y3 = unit.func(@intCast(index + 3 * lane_count), x03, y3); if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y)) return; index += lane_count; if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y1)) return; index += lane_count; if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y2)) return; index += lane_count; if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y3)) return; index += lane_count; } y = reduceUnrolled(Unit, Base, unit, y3, y2, y1, y); } while (index + lane_count <= input_slice.len) : (index += lane_count) { x0 = load(Unit, Base, unit, @intCast(index), input_slice); y = unit.func(@intCast(index), x0, y); if (!storeAndShortCircuit(Unit, Base, unit, @intCast(index), output_slice, y)) return; } if (index != input_slice.len) { const tail_index = input_slice.len - lane_count; const places = @as(isize, @intCast(index)) - @as(isize, @intCast(input_slice.len)); x0 = maskLoad(Unit, Base, unit, @intCast(tail_index), input_slice, places); y = unit.func(@intCast(tail_index), x0, y); _ = maskStore(Unit, Base, unit, @intCast(tail_index), output_slice, y, places); } _ = reduceFinal(Unit, Base, unit, y, output_slice);}Source: lib/simd/src/root.zig:535
zig
pub const unroll = unroller.unroll;Complete call list
10 direct calls.
lib.simd.src.unroller.load[function] — private source atlib/simd/src/unroller.zig:401in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.maskLoad[function] — private source atlib/simd/src/unroller.zig:434in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.maskStore[function] — private source atlib/simd/src/unroller.zig:484in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.pointee[function] — private source atlib/simd/src/unroller.zig:596in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.reduceFinal[function] — private source atlib/simd/src/unroller.zig:499in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.reduceUnrolled[function] — private source atlib/simd/src/unroller.zig:510in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.storeAndShortCircuit[function] — private source atlib/simd/src/unroller.zig:470in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.unitBase[function] — private source atlib/simd/src/unroller.zig:606in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.x0Init[function] — private source atlib/simd/src/unroller.zig:381in nearest public ownertiny.simd.unrollerlib.simd.src.unroller.yInit[function] — private source atlib/simd/src/unroller.zig:396in nearest public ownertiny.simd.unroller
Audit
| Definitions | 1 |
|---|---|
| Public names | 2 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |