nbxtensor 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nbxtensor/THIRD_PARTY_NOTICES.md +287 -0
- nbxtensor/__init__.py +17 -0
- nbxtensor/backend/__init__.py +1 -0
- nbxtensor/backend/capabilities.py +207 -0
- nbxtensor/backend/cpu/__init__.py +1 -0
- nbxtensor/backend/cpu/blas.py +102 -0
- nbxtensor/backend/cpu/pool.py +204 -0
- nbxtensor/backend/cpu_backend.py +162 -0
- nbxtensor/backend/device_facts.py +105 -0
- nbxtensor/backend/device_files.py +129 -0
- nbxtensor/backend/device_names.py +18 -0
- nbxtensor/backend/devices/amd/cdna.yml +228 -0
- nbxtensor/backend/devices/amd/cdna2.yml +228 -0
- nbxtensor/backend/devices/amd/cdna3.yml +227 -0
- nbxtensor/backend/devices/apple/apple_m1.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m1_max.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m1_pro.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m1_ultra.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m2.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m2_max.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m2_pro.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m2_ultra.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m3.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m3_max.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m3_pro.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m3_ultra.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m4.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m4_max.yml +266 -0
- nbxtensor/backend/devices/apple/apple_m4_pro.yml +308 -0
- nbxtensor/backend/devices/apple/apple_m5.yml +269 -0
- nbxtensor/backend/devices/apple/apple_m5_max.yml +269 -0
- nbxtensor/backend/devices/apple/apple_m5_pro.yml +269 -0
- nbxtensor/backend/devices/apple/apple_m5_ultra.yml +269 -0
- nbxtensor/backend/devices/apple/apple_m6.yml +269 -0
- nbxtensor/backend/devices/apple/apple_silicon.yml +263 -0
- nbxtensor/backend/devices/nvidia/ampere.yml +214 -0
- nbxtensor/backend/devices/nvidia/hopper.yml +213 -0
- nbxtensor/backend/devices/nvidia/volta.yml +411 -0
- nbxtensor/backend/faults.py +151 -0
- nbxtensor/backend/host_memory.py +185 -0
- nbxtensor/backend/launcher.py +2350 -0
- nbxtensor/backend/launcher_contract.py +429 -0
- nbxtensor/backend/metal_backend.py +661 -0
- nbxtensor/backend/metal_device.py +1274 -0
- nbxtensor/backend/process_memory.py +73 -0
- nbxtensor/backend/replay_graph.py +322 -0
- nbxtensor/backend/runtime.py +409 -0
- nbxtensor/backend/triton_ext_driver.py +735 -0
- nbxtensor/dtype/__init__.py +1 -0
- nbxtensor/dtype/convert.py +107 -0
- nbxtensor/dtype/dtypes.yml +70 -0
- nbxtensor/dtype/itemsize.py +166 -0
- nbxtensor/dtype/nbx_dtype.py +72 -0
- nbxtensor/dtype/operands.py +158 -0
- nbxtensor/dtype/outputs.py +64 -0
- nbxtensor/dtype/policy.py +155 -0
- nbxtensor/dtype/policy.yml +51 -0
- nbxtensor/dtype/promotion.py +112 -0
- nbxtensor/host.py +55 -0
- nbxtensor/io/__init__.py +1 -0
- nbxtensor/io/read_rate.py +197 -0
- nbxtensor/io/safetensors.py +314 -0
- nbxtensor/memory/__init__.py +9 -0
- nbxtensor/memory/allocator.py +1988 -0
- nbxtensor/memory/arena.py +75 -0
- nbxtensor/memory/device_memory.py +150 -0
- nbxtensor/memory/device_transfer.py +154 -0
- nbxtensor/memory/layout.py +43 -0
- nbxtensor/memory/memory_pool.py +191 -0
- nbxtensor/memory/metal.py +96 -0
- nbxtensor/memory/oom_advice.py +91 -0
- nbxtensor/memory/pointer_tables.py +323 -0
- nbxtensor/memory/pool.py +507 -0
- nbxtensor/memory/shadow.py +43 -0
- nbxtensor/memory/slab.py +273 -0
- nbxtensor/memory/trace_replay.py +122 -0
- nbxtensor/memory/traces/sana-video-2b-720p.16g.2026-11-02.tsv +13610 -0
- nbxtensor/memory/vmm.py +118 -0
- nbxtensor/ops/__init__.py +1 -0
- nbxtensor/ops/_autotune_policy.py +90 -0
- nbxtensor/ops/_common.py +32 -0
- nbxtensor/ops/_configs.py +1041 -0
- nbxtensor/ops/_cost.py +231 -0
- nbxtensor/ops/abs.py +17 -0
- nbxtensor/ops/adaptive_avg_pool2d.py +161 -0
- nbxtensor/ops/add.py +96 -0
- nbxtensor/ops/addcdiv.py +29 -0
- nbxtensor/ops/addcmul.py +29 -0
- nbxtensor/ops/addmv_op.py +64 -0
- nbxtensor/ops/addr.py +68 -0
- nbxtensor/ops/all_reduce.py +83 -0
- nbxtensor/ops/amax.py +40 -0
- nbxtensor/ops/any_reduce.py +83 -0
- nbxtensor/ops/arange_op.py +27 -0
- nbxtensor/ops/argmax.py +107 -0
- nbxtensor/ops/argmin.py +93 -0
- nbxtensor/ops/atan2.py +71 -0
- nbxtensor/ops/attention_wrappers.py +1648 -0
- nbxtensor/ops/autotune_bucket.py +137 -0
- nbxtensor/ops/autotune_cache.py +430 -0
- nbxtensor/ops/autotune_certified.py +1262 -0
- nbxtensor/ops/autotune_refusals.py +380 -0
- nbxtensor/ops/autotune_settings.py +58 -0
- nbxtensor/ops/avg_pool2d.py +73 -0
- nbxtensor/ops/baddbmm_op.py +132 -0
- nbxtensor/ops/batch_norm.py +163 -0
- nbxtensor/ops/binary_strided.py +196 -0
- nbxtensor/ops/bitwise_and.py +26 -0
- nbxtensor/ops/bitwise_left_shift.py +47 -0
- nbxtensor/ops/bitwise_not.py +24 -0
- nbxtensor/ops/bitwise_or.py +26 -0
- nbxtensor/ops/bitwise_right_shift.py +47 -0
- nbxtensor/ops/bucketize.py +37 -0
- nbxtensor/ops/cat_op.py +87 -0
- nbxtensor/ops/celu.py +20 -0
- nbxtensor/ops/clamp.py +24 -0
- nbxtensor/ops/clamp_min.py +22 -0
- nbxtensor/ops/conv2d.py +265 -0
- nbxtensor/ops/conv2d_m8n8k4.py +165 -0
- nbxtensor/ops/conv_depthwise2d.py +154 -0
- nbxtensor/ops/conv_transpose2d.py +148 -0
- nbxtensor/ops/conv_wrappers.py +1482 -0
- nbxtensor/ops/copy.py +18 -0
- nbxtensor/ops/copy_op.py +39 -0
- nbxtensor/ops/cos.py +17 -0
- nbxtensor/ops/count_nonzero.py +64 -0
- nbxtensor/ops/cross_entropy.py +67 -0
- nbxtensor/ops/cummax.py +109 -0
- nbxtensor/ops/cummin.py +105 -0
- nbxtensor/ops/cumsum.py +244 -0
- nbxtensor/ops/decode_attn_vec.py +162 -0
- nbxtensor/ops/depthwise_conv2d.py +132 -0
- nbxtensor/ops/dequant_gemv.py +190 -0
- nbxtensor/ops/dft.py +67 -0
- nbxtensor/ops/dispatch.py +1228 -0
- nbxtensor/ops/div.py +75 -0
- nbxtensor/ops/dot_op.py +67 -0
- nbxtensor/ops/dropout.py +23 -0
- nbxtensor/ops/dtype_convert.py +42 -0
- nbxtensor/ops/elementwise_launch.py +81 -0
- nbxtensor/ops/elementwise_wrappers.py +2315 -0
- nbxtensor/ops/elu.py +20 -0
- nbxtensor/ops/embedding.py +69 -0
- nbxtensor/ops/eq.py +32 -0
- nbxtensor/ops/erf.py +18 -0
- nbxtensor/ops/exp.py +17 -0
- nbxtensor/ops/exp2.py +18 -0
- nbxtensor/ops/fft_op.py +125 -0
- nbxtensor/ops/fill_op.py +20 -0
- nbxtensor/ops/flash_attention.py +307 -0
- nbxtensor/ops/flash_attention_m8n8k4.py +384 -0
- nbxtensor/ops/flash_decode.py +78 -0
- nbxtensor/ops/flip_op.py +60 -0
- nbxtensor/ops/floor.py +90 -0
- nbxtensor/ops/full_op.py +24 -0
- nbxtensor/ops/fused_moe.py +417 -0
- nbxtensor/ops/fused_moe_m8n8k4.py +99 -0
- nbxtensor/ops/fused_upsample_conv.py +413 -0
- nbxtensor/ops/gather_op.py +52 -0
- nbxtensor/ops/ge.py +32 -0
- nbxtensor/ops/gelu.py +31 -0
- nbxtensor/ops/gemv_vec.py +80 -0
- nbxtensor/ops/glu.py +43 -0
- nbxtensor/ops/grid_sampler.py +145 -0
- nbxtensor/ops/group_norm_tiled.py +67 -0
- nbxtensor/ops/groupnorm.py +123 -0
- nbxtensor/ops/gt.py +32 -0
- nbxtensor/ops/hardsigmoid.py +18 -0
- nbxtensor/ops/hardswish.py +19 -0
- nbxtensor/ops/im2col.py +57 -0
- nbxtensor/ops/index_add.py +95 -0
- nbxtensor/ops/index_put_op.py +92 -0
- nbxtensor/ops/index_select.py +121 -0
- nbxtensor/ops/index_wrappers.py +770 -0
- nbxtensor/ops/isfinite.py +20 -0
- nbxtensor/ops/isinf.py +20 -0
- nbxtensor/ops/isnan.py +18 -0
- nbxtensor/ops/launch_keys.py +1054 -0
- nbxtensor/ops/launch_observer.py +54 -0
- nbxtensor/ops/layernorm.py +71 -0
- nbxtensor/ops/le.py +35 -0
- nbxtensor/ops/leaky_relu.py +19 -0
- nbxtensor/ops/lerp.py +76 -0
- nbxtensor/ops/linalg_wrappers.py +1370 -0
- nbxtensor/ops/linspace_op.py +47 -0
- nbxtensor/ops/log.py +17 -0
- nbxtensor/ops/log_sigmoid.py +23 -0
- nbxtensor/ops/logical_and.py +26 -0
- nbxtensor/ops/logical_not.py +24 -0
- nbxtensor/ops/logical_or.py +26 -0
- nbxtensor/ops/logical_xor.py +37 -0
- nbxtensor/ops/loss_wrappers.py +282 -0
- nbxtensor/ops/lt.py +32 -0
- nbxtensor/ops/masked_fill.py +21 -0
- nbxtensor/ops/matmul.py +377 -0
- nbxtensor/ops/matmul_m8n8k4.py +235 -0
- nbxtensor/ops/max_pool2d.py +74 -0
- nbxtensor/ops/max_pool3d.py +93 -0
- nbxtensor/ops/max_reduce.py +91 -0
- nbxtensor/ops/maximum.py +18 -0
- nbxtensor/ops/mean.py +40 -0
- nbxtensor/ops/min_reduce.py +91 -0
- nbxtensor/ops/minimum.py +18 -0
- nbxtensor/ops/mish.py +22 -0
- nbxtensor/ops/mma_m8n8k4.py +152 -0
- nbxtensor/ops/moe_align.py +195 -0
- nbxtensor/ops/moe_decode_vec.py +374 -0
- nbxtensor/ops/moe_device_residency.py +141 -0
- nbxtensor/ops/moe_wrappers.py +345 -0
- nbxtensor/ops/mse_loss.py +79 -0
- nbxtensor/ops/mul.py +51 -0
- nbxtensor/ops/nan_to_num.py +23 -0
- nbxtensor/ops/ne.py +32 -0
- nbxtensor/ops/neg.py +17 -0
- nbxtensor/ops/nllloss.py +124 -0
- nbxtensor/ops/nonzero.py +33 -0
- nbxtensor/ops/nonzero_op.py +62 -0
- nbxtensor/ops/norm_wrappers.py +579 -0
- nbxtensor/ops/ones_op.py +20 -0
- nbxtensor/ops/oracles/__init__.py +6 -0
- nbxtensor/ops/oracles/conv2d_fp64.py +450 -0
- nbxtensor/ops/pad_op.py +159 -0
- nbxtensor/ops/paged_decode_attn.py +215 -0
- nbxtensor/ops/pixel_shuffle.py +144 -0
- nbxtensor/ops/pixel_unshuffle.py +72 -0
- nbxtensor/ops/pow.py +137 -0
- nbxtensor/ops/prod.py +81 -0
- nbxtensor/ops/rand_op.py +52 -0
- nbxtensor/ops/random_wrappers.py +366 -0
- nbxtensor/ops/reciprocal.py +17 -0
- nbxtensor/ops/reduction_wrappers.py +845 -0
- nbxtensor/ops/relu.py +18 -0
- nbxtensor/ops/remainder.py +46 -0
- nbxtensor/ops/repeat_interleave.py +48 -0
- nbxtensor/ops/repeat_op.py +132 -0
- nbxtensor/ops/residual_chain.py +374 -0
- nbxtensor/ops/rmsnorm.py +68 -0
- nbxtensor/ops/rope.py +142 -0
- nbxtensor/ops/rsqrt.py +17 -0
- nbxtensor/ops/scaled_softmax.py +96 -0
- nbxtensor/ops/scatter_op.py +139 -0
- nbxtensor/ops/screen_oracle.py +479 -0
- nbxtensor/ops/selu.py +22 -0
- nbxtensor/ops/shape_wrappers.py +1032 -0
- nbxtensor/ops/sigmoid.py +19 -0
- nbxtensor/ops/silu.py +27 -0
- nbxtensor/ops/sin.py +17 -0
- nbxtensor/ops/softmax.py +169 -0
- nbxtensor/ops/softplus.py +27 -0
- nbxtensor/ops/sort_op.py +304 -0
- nbxtensor/ops/spectral_wrappers.py +481 -0
- nbxtensor/ops/sqrt.py +17 -0
- nbxtensor/ops/stack_op.py +84 -0
- nbxtensor/ops/std.py +113 -0
- nbxtensor/ops/strided_copy.py +200 -0
- nbxtensor/ops/sub.py +35 -0
- nbxtensor/ops/sum.py +40 -0
- nbxtensor/ops/tan.py +19 -0
- nbxtensor/ops/tanh.py +21 -0
- nbxtensor/ops/threshold.py +19 -0
- nbxtensor/ops/tiling.yml +91 -0
- nbxtensor/ops/tiling_policy.py +43 -0
- nbxtensor/ops/tiling_sizes.py +370 -0
- nbxtensor/ops/topk.py +267 -0
- nbxtensor/ops/trace_op.py +64 -0
- nbxtensor/ops/tril.py +64 -0
- nbxtensor/ops/triu.py +62 -0
- nbxtensor/ops/unfold_op.py +37 -0
- nbxtensor/ops/unique_op.py +97 -0
- nbxtensor/ops/upsample_bilinear2d.py +106 -0
- nbxtensor/ops/upsample_nearest2d.py +52 -0
- nbxtensor/ops/upsample_nearest3d.py +61 -0
- nbxtensor/ops/var.py +136 -0
- nbxtensor/ops/vector_norm.py +216 -0
- nbxtensor/ops/weight_norm.py +104 -0
- nbxtensor/ops/where.py +39 -0
- nbxtensor/ops/wrappers.py +825 -0
- nbxtensor/ops/zeros_op.py +20 -0
- nbxtensor/quant/__init__.py +1 -0
- nbxtensor/quant/quantized_tensor.py +187 -0
- nbxtensor/random/__init__.py +1 -0
- nbxtensor/random/mt_randn.py +154 -0
- nbxtensor/random/rng_pin.py +59 -0
- nbxtensor/random/rng_stream.py +118 -0
- nbxtensor/random/seeded_draw.py +223 -0
- nbxtensor/shape/__init__.py +157 -0
- nbxtensor/tensor.py +1867 -0
- nbxtensor-0.0.1.dist-info/METADATA +379 -0
- nbxtensor-0.0.1.dist-info/RECORD +291 -0
- nbxtensor-0.0.1.dist-info/WHEEL +4 -0
- nbxtensor-0.0.1.dist-info/licenses/LICENSE +189 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""ConvTranspose2d — pure @triton.jit kernel.
|
|
2
|
+
|
|
3
|
+
Transposed convolution (deconvolution) used in decoder/upsampling paths.
|
|
4
|
+
Implements the scatter-based approach: for each output pixel, accumulate
|
|
5
|
+
contributions from all input pixels whose receptive field covers it.
|
|
6
|
+
|
|
7
|
+
No reference project had a Triton conv_transpose2d, so this is written
|
|
8
|
+
from first principles using the standard relationship:
|
|
9
|
+
output[n, co, oh, ow] = sum over ci,kh,kw of:
|
|
10
|
+
input[n, ci, ih, iw] * weight[ci, co, kh, kw]
|
|
11
|
+
where ih = (oh + pad_h - kh) / stride_h (must be integer)
|
|
12
|
+
iw = (ow + pad_w - kw) / stride_w (must be integer)
|
|
13
|
+
|
|
14
|
+
Grid: (N * C_out, ceil(OH * OW / BLOCK_SIZE))
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import triton
|
|
18
|
+
import triton.language as tl
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@triton.jit
|
|
22
|
+
def conv_transpose2d_kernel(
|
|
23
|
+
input_ptr, # (N, C_in, IH, IW) contiguous
|
|
24
|
+
weight_ptr, # (C_in, C_out/groups, KH, KW) contiguous
|
|
25
|
+
output_ptr, # (N, C_out, OH, OW) contiguous
|
|
26
|
+
N, C_in, IH, IW,
|
|
27
|
+
C_out, KH, KW,
|
|
28
|
+
OH, OW,
|
|
29
|
+
stride_h, stride_w,
|
|
30
|
+
pad_h, pad_w,
|
|
31
|
+
dil_h, dil_w,
|
|
32
|
+
C_in_per_g, C_out_per_g,
|
|
33
|
+
BLOCK_SIZE: tl.constexpr,
|
|
34
|
+
):
|
|
35
|
+
"""Scatter-based transposed convolution kernel (groups + dilation aware).
|
|
36
|
+
|
|
37
|
+
Each program computes a block of output pixels for one (batch, out_channel).
|
|
38
|
+
For each output pixel (oh, ow), it iterates over the (c_in, kh, kw) of the
|
|
39
|
+
output channel's group and checks if the corresponding input pixel exists
|
|
40
|
+
(integer division constraint). Weight layout matches PyTorch ConvTranspose:
|
|
41
|
+
(C_in, C_out/groups, KH, KW). groups=1 (C_in_per_g=C_in, C_out_per_g=C_out)
|
|
42
|
+
reduces exactly to the original full-sum behaviour.
|
|
43
|
+
"""
|
|
44
|
+
# pid_0 = n * C_out + co
|
|
45
|
+
pid_nc = tl.program_id(0).to(tl.int64)
|
|
46
|
+
pid_spatial = tl.program_id(1).to(tl.int64)
|
|
47
|
+
|
|
48
|
+
n = pid_nc // C_out
|
|
49
|
+
co = pid_nc % C_out
|
|
50
|
+
|
|
51
|
+
# Group mapping: which input-channel block + local out-channel index this
|
|
52
|
+
# output channel belongs to (PyTorch grouped-ConvTranspose semantics).
|
|
53
|
+
group = co // C_out_per_g
|
|
54
|
+
co_local = co % C_out_per_g
|
|
55
|
+
ci_start = group * C_in_per_g
|
|
56
|
+
|
|
57
|
+
# Output spatial offsets for this block
|
|
58
|
+
out_base = pid_spatial * BLOCK_SIZE
|
|
59
|
+
out_offsets = out_base + tl.arange(0, BLOCK_SIZE)
|
|
60
|
+
out_mask = out_offsets < (OH * OW)
|
|
61
|
+
|
|
62
|
+
oh = out_offsets // OW
|
|
63
|
+
ow = out_offsets % OW
|
|
64
|
+
|
|
65
|
+
# Accumulate in float32 for numerical stability
|
|
66
|
+
acc = tl.zeros((BLOCK_SIZE,), dtype=tl.float32)
|
|
67
|
+
|
|
68
|
+
# Iterate over the group's input channels and kernel positions
|
|
69
|
+
for ci_local in range(C_in_per_g):
|
|
70
|
+
ci = ci_start + ci_local
|
|
71
|
+
for kh in range(KH):
|
|
72
|
+
for kw in range(KW):
|
|
73
|
+
# Inverse mapping: ih = (oh + pad_h - kh*dil_h) / stride_h
|
|
74
|
+
ih_num = oh + pad_h - kh * dil_h
|
|
75
|
+
iw_num = ow + pad_w - kw * dil_w
|
|
76
|
+
|
|
77
|
+
# Check divisibility and bounds
|
|
78
|
+
ih_valid = (ih_num % stride_h) == 0
|
|
79
|
+
iw_valid = (iw_num % stride_w) == 0
|
|
80
|
+
ih = ih_num // stride_h
|
|
81
|
+
iw = iw_num // stride_w
|
|
82
|
+
|
|
83
|
+
valid = (
|
|
84
|
+
ih_valid & iw_valid
|
|
85
|
+
& (ih >= 0) & (ih < IH)
|
|
86
|
+
& (iw >= 0) & (iw < IW)
|
|
87
|
+
& out_mask
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Load input[n, ci, ih, iw]
|
|
91
|
+
in_offset = (
|
|
92
|
+
n * (C_in * IH * IW)
|
|
93
|
+
+ ci * (IH * IW)
|
|
94
|
+
+ ih * IW
|
|
95
|
+
+ iw
|
|
96
|
+
)
|
|
97
|
+
# Upcast AT THE LOAD, for every dtype. The accumulator is already
|
|
98
|
+
# fp32, so an fp32 product costs nothing and is strictly more accurate
|
|
99
|
+
# than a narrow one. Multiplying in the operands' own dtype is the shape
|
|
100
|
+
# that made depthwise_conv2d return 0.754 relative error in bf16 with
|
|
101
|
+
# padding on Metal (metal-first-light 393570c6, 2026-09-22): there the
|
|
102
|
+
# fp16 arm upcast and every other dtype did not, and bf16 took the
|
|
103
|
+
# native path. This kernel had no fp16 arm at all — neither operand was
|
|
104
|
+
# upcast — so it carries the same defect for any narrow dtype.
|
|
105
|
+
# Invisible on CUDA, which is not a reason to leave it.
|
|
106
|
+
in_val = tl.load(input_ptr + in_offset, mask=valid, other=0.0).to(tl.float32)
|
|
107
|
+
|
|
108
|
+
# Load weight[ci, co_local, kh, kw] — layout (C_in, C_out/groups, KH, KW)
|
|
109
|
+
w_offset = (
|
|
110
|
+
ci * (C_out_per_g * KH * KW)
|
|
111
|
+
+ co_local * (KH * KW)
|
|
112
|
+
+ kh * KW
|
|
113
|
+
+ kw
|
|
114
|
+
)
|
|
115
|
+
# w_offset is scalar (one weight element for the whole output
|
|
116
|
+
# block) — load unmasked; per-position validity is applied below.
|
|
117
|
+
w_val = tl.load(weight_ptr + w_offset).to(tl.float32)
|
|
118
|
+
|
|
119
|
+
acc += tl.where(valid, in_val * w_val, 0.0)
|
|
120
|
+
|
|
121
|
+
# Store output[n, co, oh, ow]
|
|
122
|
+
out_offset = (
|
|
123
|
+
n * (C_out * OH * OW)
|
|
124
|
+
+ co * (OH * OW)
|
|
125
|
+
+ out_offsets
|
|
126
|
+
)
|
|
127
|
+
tl.store(output_ptr + out_offset, acc, mask=out_mask)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@triton.jit
|
|
131
|
+
def col2im1d_kernel(y_ptr, out_ptr, C_out, K, L_in, L_out, stride, pad,
|
|
132
|
+
BLOCK_SIZE: tl.constexpr, TAPS: tl.constexpr):
|
|
133
|
+
"""The overlap-add of a 1-D transposed convolution computed as a GEMM (`conv_wrappers._conv_transpose1d_gemm`):
|
|
134
|
+
Y [L_in, C_out * K] holds, for every input position, each output channel and tap k's products; output position o of
|
|
135
|
+
channel c gathers the TAPS = ceil(K / stride) taps k = (o + pad) mod stride + j * stride whose input position
|
|
136
|
+
i = (o + pad - k) / stride exists — no atomics, fp32 accumulation, one rounding to the output dtype."""
|
|
137
|
+
c = tl.program_id(0).to(tl.int64)
|
|
138
|
+
o = tl.program_id(1).to(tl.int64) * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
|
|
139
|
+
o_ok = o < L_out
|
|
140
|
+
r = (o + pad) % stride
|
|
141
|
+
acc = tl.zeros((BLOCK_SIZE,), dtype=tl.float32)
|
|
142
|
+
for j in tl.static_range(TAPS):
|
|
143
|
+
k = r + j * stride
|
|
144
|
+
num = o + pad - k
|
|
145
|
+
i = num // stride
|
|
146
|
+
m = o_ok & (k < K) & (num >= 0) & (i < L_in)
|
|
147
|
+
acc += tl.load(y_ptr + i * (C_out * K) + c * K + k, mask=m, other=0.0).to(tl.float32)
|
|
148
|
+
tl.store(out_ptr + c * L_out + o, acc.to(out_ptr.dtype.element_ty), mask=o_ok)
|