Reject CUDA BERT EmbedLayerNorm/SkipLayerNorm shapes exceeding 32-bit output indexing
Summary
The CUDA EmbedLayerNormalization and SkipLayerNormalization kernels compute output write offsets (row_index * hidden_size) using 32-bit arithmetic. For very large output tensors the element count can exceed INT32_MAX, at which point the offset is no longer representable in 32 bits.
Every output write index in these kernels is a pure function of the launch grid and hidden_size — there is no data-dependent write indexing — so the maximum index is exactly output_element_count - 1, which the host knows from the input shapes before launch. This PR adds a host-side guard in each op's ComputeInternal that computes the output element count in 64-bit arithmetic and returns a clear error when it exceeds the supported 32-bit indexing range.
Design
EmbedLayerNormalization(embed_layer_norm.cc):output_element_count = (int64)batch_size * sequence_length * hidden_size, guarded withORT_RETURN_IF_NOT(... <= INT32_MAX, ...).SkipLayerNormalization(skip_layer_norm.cc):output_element_count = input->Shape().Size()(output shares the input shape), same guard.- Kernels are unchanged — they keep the original int32 indexing, so there is no extra register/occupancy cost in the hot path. This is pure host-side validation.
Behavior
This rejects (rather than silently attempting) single-op LayerNorm outputs larger than 2³¹ elements — a regime no real BERT-family model produces (it would require a multi-GB single-op activation). For all supported shapes there is no behavior or numeric change.
Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com