Skip to content

Commit 90fac97

Browse files
Add Max Matrix Dim checks
1 parent 2ab5c86 commit 90fac97

6 files changed

Lines changed: 455 additions & 12 deletions

File tree

tools/clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8028,8 +8028,6 @@ def err_hlsl_linalg_matrix_layout_is_not_transposable : Error<
80288028
"RowMajor and ColumnMajor matrices are not transposable">;
80298029
def err_hlsl_linalg_optimal_matrix_layout_matrix_stride_must_be_zero : Error<
80308030
"for optimal matrix layout, matrix stride must be zero">;
8031-
def err_hlsl_linalg_exceeds_max_matrix_dim: Error<
8032-
"matrix dimension for linalg operations must be less than %0">;
80338031
def err_hlsl_linalg_matrix_dim_must_not_be_zero: Error<
80348032
"matrix dimension must not be zero">;
80358033
def err_hlsl_linalg_matrix_layout_invalid : Error<
@@ -8049,6 +8047,14 @@ def err_hlsl_linalg_mul_muladd_isUnsigned_for_packed_input_must_be_true : Error<
80498047
def err_hlsl_linalg_mul_muladd_packed_input_vector_must_be_uint : Error<
80508048
"packed input vector type must be a 32-bit unsigned int in linalg mul/muladd operations, "
80518049
"packed formats uint8_t4_packed and sint8_t4_packed are not supported currently">;
8050+
def err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_m: Error<
8051+
"matrix dimension M must be less than %0, in a linalg Mul/MulAdd operation">;
8052+
def err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_k_unpacked_input: Error<
8053+
"matrix dimension K when using unpacked input vectors must be less than %0, in a "
8054+
"linalg Mul/MulAdd operation">;
8055+
def err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_k_packed_input: Error<
8056+
"matrix dimension K when using packed input vectors must be less than %0, in a "
8057+
"linalg Mul/MulAdd operation">;
80528058

80538059
def err_hlsl_linalg_outer_prod_acc_vector_type_mismatch : Error<
80548060
"input vectors of outerproductaccumulate must have the same element type">;

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11987,19 +11987,36 @@ static void CheckCommonMulandMulAddParameters(Sema &S, CallExpr *CE,
1198711987

1198811988
// Check MatrixM and MatrixK values are less than max
1198911989
// Matrix dimension cannot exceed largest vector length in a Mul/MulAdd
11990-
// operation
11990+
// operation.
1199111991
if (MatrixMValue > DXIL::kSM69MaxVectorLength) {
1199211992
S.Diags.Report(MatrixMExpr->getExprLoc(),
11993-
diag::err_hlsl_linalg_exceeds_max_matrix_dim)
11993+
diag::err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_m)
1199411994
<< std::to_string(DXIL::kSM69MaxVectorLength);
1199511995
return;
1199611996
}
1199711997

11998-
if (MatrixKValue > DXIL::kSM69MaxVectorLength) {
11999-
S.Diags.Report(MatrixKExpr->getExprLoc(),
12000-
diag::err_hlsl_linalg_exceeds_max_matrix_dim)
12001-
<< std::to_string(DXIL::kSM69MaxVectorLength);
12002-
return;
11998+
// For packed input vectors 4 values are packed in a uint, so max Matrix K
11999+
// can be 4096
12000+
if (IsInputVectorPacked) {
12001+
const unsigned PackingFactor =
12002+
4; // Only supported packed formats: DATA_TYPE_(U)SINT8_T4_PACKED
12003+
if (MatrixKValue > DXIL::kSM69MaxVectorLength * PackingFactor) {
12004+
S.Diags.Report(
12005+
MatrixKExpr->getExprLoc(),
12006+
diag::
12007+
err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_k_packed_input)
12008+
<< std::to_string(DXIL::kSM69MaxVectorLength * PackingFactor);
12009+
return;
12010+
}
12011+
} else {
12012+
if (MatrixKValue > DXIL::kSM69MaxVectorLength) {
12013+
S.Diags.Report(
12014+
MatrixKExpr->getExprLoc(),
12015+
diag::
12016+
err_hlsl_linalg_mul_muladd_exceeds_max_matrix_dim_k_unpacked_input)
12017+
<< std::to_string(DXIL::kSM69MaxVectorLength);
12018+
return;
12019+
}
1200312020
}
1200412021

1200512022
if (!IsValidVectorAndMatrixDimensions(S, CE, InputVectorSizeValue,

tools/clang/test/SemaHLSL/hlsl/linalg/builtins/mul_add_invalid.hlsl

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,114 @@ void test_invalid_matrix_K_dimension_non_zero() {
464464
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
465465
}
466466

467-
//Check if InputInterpretation is a constant parameter
467+
// Check if Matrix M dimension is less than Max
468+
void test_invalid_matrix_M_dimension_less_than_Max() {
469+
470+
vector<uint, 4> output_vector;
471+
const uint is_output_unsigned = 1;
472+
const uint is_input_unsigned = 1;
473+
const uint matrix_offset = 0;
474+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
475+
const uint matrix_dimK = 4;
476+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
477+
const bool matrix_is_transposed = false;
478+
const uint matrix_stride = matrix_dimK * 4;
479+
const uint bias_offset = 0;
480+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
481+
482+
vector<uint, 4> input_vector_0 =
483+
input_vector_buffer.Load<vector<uint, 4> >(0);
484+
const uint input_interpretation_0 = DataType::DATA_TYPE_FLOAT32;
485+
const uint matrix_dimM_0 = 1025;
486+
487+
// expected-error@+3 {{matrix dimension M must be less than 1024, in a linalg Mul/MulAdd operation}}
488+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
489+
is_input_unsigned, input_interpretation_0, matrix_buffer,
490+
matrix_offset, matrix_interpretation, matrix_dimM_0,
491+
matrix_dimK, matrix_layout, matrix_is_transposed,
492+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
493+
494+
vector<uint, 1> input_vector_1 =
495+
input_vector_buffer.Load<vector<uint, 1> >(0);
496+
const uint input_interpretation_1 = DataType::DATA_TYPE_UINT8_T4_PACKED;
497+
const uint matrix_dimM_1 = 4097;
498+
499+
// expected-error@+3 {{matrix dimension M must be less than 1024, in a linalg Mul/MulAdd operation}}
500+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_1,
501+
is_input_unsigned, input_interpretation_1, matrix_buffer,
502+
matrix_offset, matrix_interpretation, matrix_dimM_1,
503+
matrix_dimK, matrix_layout, matrix_is_transposed,
504+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
505+
}
506+
507+
// Check if Matrix K dimension is less than Max in unpacked input vector case
508+
void test_invalid_matrix_K_dimension_less_than_Max_unpacked_input_vector() {
509+
510+
vector<uint, 4> output_vector;
511+
const uint is_output_unsigned = 1;
512+
const uint is_input_unsigned = 1;
513+
const uint matrix_offset = 0;
514+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
515+
const uint matrix_dimM = 4;
516+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
517+
const bool matrix_is_transposed = false;
518+
const uint matrix_stride = 64;
519+
const uint bias_offset = 0;
520+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
521+
522+
vector<uint, 4> input_vector_0 =
523+
input_vector_buffer.Load<vector<uint, 4> >(0);
524+
const uint input_interpretation_0 = DataType::DATA_TYPE_FLOAT32;
525+
const uint matrix_dimK_0 = 1025;
526+
527+
// expected-error@+4 {{matrix dimension K when using unpacked input vectors must be less than 1024, in a linalg Mul/MulAdd operation}}
528+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
529+
is_input_unsigned, input_interpretation_0, matrix_buffer,
530+
matrix_offset, matrix_interpretation, matrix_dimM,
531+
matrix_dimK_0, matrix_layout, matrix_is_transposed,
532+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
533+
534+
vector<uint, 4> input_vector_1 =
535+
input_vector_buffer.Load<vector<uint, 4> >(0);
536+
const uint input_interpretation_1 = DataType::DATA_TYPE_UINT8;
537+
const uint matrix_dimK_1 = 4096;
538+
// expected-error@+4 {{matrix dimension K when using unpacked input vectors must be less than 1024, in a linalg Mul/MulAdd operation}}
539+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_1,
540+
is_input_unsigned, input_interpretation_1, matrix_buffer,
541+
matrix_offset, matrix_interpretation, matrix_dimM,
542+
matrix_dimK_1, matrix_layout, matrix_is_transposed,
543+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
544+
545+
}
546+
547+
// Check if Matrix M dimension is less than Max in packed input vector case
548+
void test_invalid_matrix_M_dimension_less_than_Max_packed_input_vector() {
549+
550+
vector<uint, 4> output_vector;
551+
const uint is_output_unsigned = 1;
552+
const uint is_input_unsigned = 1;
553+
const uint matrix_offset = 0;
554+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
555+
const uint matrix_dimM = 1024;
556+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
557+
const bool matrix_is_transposed = false;
558+
const uint matrix_stride = 4096;
559+
const uint bias_offset = 0;
560+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
561+
562+
vector<uint, 1024> input_vector_0 =
563+
input_vector_buffer.Load<vector<uint, 1024> >(0);
564+
const uint input_interpretation_0 = DataType::DATA_TYPE_UINT8_T4_PACKED;
565+
const uint matrix_dimK_0 = 4097;
566+
567+
// expected-error@+4 {{matrix dimension K when using packed input vectors must be less than 4096, in a linalg Mul/MulAdd operation}}
568+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
569+
is_input_unsigned, input_interpretation_0, matrix_buffer,
570+
matrix_offset, matrix_interpretation, matrix_dimM,
571+
matrix_dimK_0, matrix_layout, matrix_is_transposed,
572+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
573+
}
574+
468575
void test_invalid_input_interpretation_non_const() {
469576

470577
vector<uint, 4> output_vector;

tools/clang/test/SemaHLSL/hlsl/linalg/builtins/mul_add_valid.hlsl

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,113 @@ void test_valid_packed_input_vector_dimension() {
132132
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
133133
}
134134

135+
// Check if Matrix M dimension is less than Max
136+
void test_valid_matrix_M_dimension_less_than_Max() {
137+
138+
vector<uint, 4> output_vector;
139+
const uint is_output_unsigned = 1;
140+
const uint is_input_unsigned = 1;
141+
const uint matrix_offset = 0;
142+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
143+
const uint matrix_dimK = 4;
144+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
145+
const bool matrix_is_transposed = false;
146+
const uint matrix_stride = matrix_dimK * 4;
147+
const uint bias_offset = 0;
148+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
149+
150+
vector<uint, 4> input_vector_0 =
151+
input_vector_buffer.Load<vector<uint, 4> >(0);
152+
const uint input_interpretation_0 = DataType::DATA_TYPE_FLOAT32;
153+
const uint matrix_dimM_0 = 4;
154+
155+
// expected-no-diagnostics@+1
156+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
157+
is_input_unsigned, input_interpretation_0, matrix_buffer,
158+
matrix_offset, matrix_interpretation, matrix_dimM_0,
159+
matrix_dimK, matrix_layout, matrix_is_transposed,
160+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
161+
162+
vector<uint, 1> input_vector_1 =
163+
input_vector_buffer.Load<vector<uint, 1> >(0);
164+
const uint input_interpretation_1 = DataType::DATA_TYPE_UINT8_T4_PACKED;
165+
const uint matrix_dimM_1 = 4;
166+
167+
// expected-no-diagnostics@+1
168+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_1,
169+
is_input_unsigned, input_interpretation_1, matrix_buffer,
170+
matrix_offset, matrix_interpretation, matrix_dimM_1,
171+
matrix_dimK, matrix_layout, matrix_is_transposed,
172+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
173+
}
174+
175+
// Check if Matrix K dimension is less than Max in unpacked input vector case
176+
void test_valid_matrix_K_dimension_less_than_Max_unpacked_input_vector() {
177+
178+
vector<uint, 4> output_vector;
179+
const uint is_output_unsigned = 1;
180+
const uint is_input_unsigned = 1;
181+
const uint matrix_offset = 0;
182+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
183+
const uint matrix_dimM = 4;
184+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
185+
const bool matrix_is_transposed = false;
186+
const uint matrix_stride = 64;
187+
const uint bias_offset = 0;
188+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
189+
190+
vector<uint, 4> input_vector_0 =
191+
input_vector_buffer.Load<vector<uint, 4> >(0);
192+
const uint input_interpretation_0 = DataType::DATA_TYPE_FLOAT32;
193+
const uint matrix_dimK_0 = 4;
194+
195+
// expected-no-diagnostics@+1
196+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
197+
is_input_unsigned, input_interpretation_0, matrix_buffer,
198+
matrix_offset, matrix_interpretation, matrix_dimM,
199+
matrix_dimK_0, matrix_layout, matrix_is_transposed,
200+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
201+
202+
vector<uint, 4> input_vector_1 =
203+
input_vector_buffer.Load<vector<uint, 4> >(0);
204+
const uint input_interpretation_1 = DataType::DATA_TYPE_UINT8;
205+
const uint matrix_dimK_1 = 4;
206+
// expected-no-diagnostics@+1
207+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_1,
208+
is_input_unsigned, input_interpretation_1, matrix_buffer,
209+
matrix_offset, matrix_interpretation, matrix_dimM,
210+
matrix_dimK_1, matrix_layout, matrix_is_transposed,
211+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
212+
213+
}
214+
215+
// Check if Matrix M dimension is less than Max in packed input vector case
216+
void test_valid_matrix_M_dimension_less_than_Max_packed_input_vector() {
217+
218+
vector<uint, 4> output_vector;
219+
const uint is_output_unsigned = 1;
220+
const uint is_input_unsigned = 1;
221+
const uint matrix_offset = 0;
222+
const uint matrix_interpretation = DataType::DATA_TYPE_FLOAT32;
223+
const uint matrix_dimM = 4;
224+
const uint matrix_layout = MatrixLayout::MATRIX_LAYOUT_ROW_MAJOR;
225+
const bool matrix_is_transposed = false;
226+
const uint matrix_stride = 64;
227+
const uint bias_offset = 0;
228+
const uint bias_interpretation = DataType::DATA_TYPE_FLOAT32;
229+
230+
vector<uint, 1024> input_vector_0 =
231+
input_vector_buffer.Load<vector<uint, 1024> >(0);
232+
const uint input_interpretation_0 = DataType::DATA_TYPE_UINT8_T4_PACKED;
233+
const uint matrix_dimK_0 = 4096;
234+
235+
// expected-no-diagnostics@+1
236+
__builtin_MatVecMulAdd(output_vector, is_output_unsigned, input_vector_0,
237+
is_input_unsigned, input_interpretation_0, matrix_buffer,
238+
matrix_offset, matrix_interpretation, matrix_dimM,
239+
matrix_dimK_0, matrix_layout, matrix_is_transposed,
240+
matrix_stride, bias_buffer, bias_offset, bias_interpretation);
241+
}
242+
135243

136244

0 commit comments

Comments
 (0)