summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2025-05-29 16:36:49 -0700
committerGitHub <noreply@github.com>2025-05-29 16:36:49 -0700
commit984d7f22f8a0909dc870c65bb927094c54f55402 (patch)
treeab255bf44e14f6cbaa09522f90b12464f1c6a339 /tests
parentf4d7954e088966c2ae8618b1cc17aac4d64ef013 (diff)
Implement MapElement for CoopMat (#7159)
With this PR, MapElement works for the following signatures: - CoopMat<...>::MapElement(functype(...)); - CoopMat<...>::MapElement(capturing-lambda); - CoopMat<...>::MapElement(not-capturing-lambda); - Tuple<CoopMat<...>,...>::MapElement(functype(...)); - Tuple<CoopMat<...>,...>::MapElement(capturing-lambda); - Tuple<CoopMat<...>,...>::MapElement(not-capturing-lambda);
Diffstat (limited to 'tests')
-rw-r--r--tests/cooperative-matrix/map-element-single.slang40
-rw-r--r--tests/cooperative-matrix/map-element-tuple.slang68
-rw-r--r--tests/language-feature/tuple/tuple-expand-multiple.slang37
-rw-r--r--tests/language-feature/tuple/tuple-expand.slang25
4 files changed, 157 insertions, 13 deletions
diff --git a/tests/cooperative-matrix/map-element-single.slang b/tests/cooperative-matrix/map-element-single.slang
index 1661ee105..ecf35953e 100644
--- a/tests/cooperative-matrix/map-element-single.slang
+++ b/tests/cooperative-matrix/map-element-single.slang
@@ -1,12 +1,14 @@
-//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -render-feature cooperative-matrix-per-element-operations -Xslang -DTEST_MODE=0
-//DISABLE_TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -render-feature cooperative-matrix-per-element-operations -Xslang -DTEST_MODE=1
-//DISABLE_TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -render-feature cooperative-matrix-per-element-operations -Xslang -DTEST_MODE=2
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=0 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=1 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=2 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=3 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=4 -render-feature cooperative-matrix-per-element-operations
//CHECK: type: int32_t
-//CHECK-NEXT: 2
-//CHECK-NEXT: 4
-//CHECK-NEXT: 6
//CHECK-NEXT: 8
+//CHECK-NEXT: 10
+//CHECK-NEXT: 12
+//CHECK-NEXT: 14
//TEST_INPUT:ubuffer(data=[1 2 3 4], stride=4),name=input1
StructuredBuffer<int> input1;
@@ -20,7 +22,7 @@ typealias CoopMatType = CoopMat<int, MemoryScope.Subgroup, 16, 16, CoopMatMatrix
int MapOp(uint32_t row, uint32_t col, int value)
{
- return value * 2;
+ return value * 2 + 1 + 2 + 3;
}
[numthreads(32, 1, 1)]
@@ -29,21 +31,33 @@ void computeMain()
let stride = 16;
CoopMatType mat1 = CoopMatType.Load<CoopMatMatrixLayout.RowMajor>(input1, 0, stride);
+ // Testing the capturing lambda
+ int c0 = 1;
+ int c1 = 2;
+ int c2 = 3;
+
CoopMatType result;
#if TEST_MODE == 0
result = mat1.MapElement(MapOp);
#elif TEST_MODE == 1
- // Lambda through IFunc.
- // TODO: Not working due to issue #7024
- IFunc<int, uint32_t, uint32_t, int> func = ((uint32_t row, uint32_t column, int value) => value * 2);
+ // Lambda via a temp variable (no capture)
+ let func = ((uint32_t row, uint32_t column, int value) => value * 2 + 1 + 2 + 3);
result = mat1.MapElement(func);
#elif TEST_MODE == 2
- // Directly use lambda.
- // TODO: Not working due to issue #7024
- result = mat1.MapElement((uint32_t row, uint32_t column, int value) => (int)(value));
+ // Directly use lambda (no capture)
+ result = mat1.MapElement((uint32_t row, uint32_t column, int value) => value * 2 + 1 + 2 + 3);
+
+#elif TEST_MODE == 3
+ // Lambda via a temp variable (capture)
+ let func = ((uint32_t row, uint32_t column, int value) => value * 2 + c0 + c1 + c2);
+ result = mat1.MapElement(func);
+
+#elif TEST_MODE == 4
+ // Directly use lambda (capture)
+ result = mat1.MapElement((uint32_t row, uint32_t column, int value) => value * 2 + c0 + c1 + c2);
#endif
result.Store<CoopMatMatrixLayout.RowMajor>(outputBuffer, 0, stride);
diff --git a/tests/cooperative-matrix/map-element-tuple.slang b/tests/cooperative-matrix/map-element-tuple.slang
new file mode 100644
index 000000000..06ab99d8f
--- /dev/null
+++ b/tests/cooperative-matrix/map-element-tuple.slang
@@ -0,0 +1,68 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=0 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=1 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=2 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=3 -render-feature cooperative-matrix-per-element-operations
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -Xslang -DTEST_MODE=4 -render-feature cooperative-matrix-per-element-operations
+
+//CHECK:type: int32_t
+//CHECK-NEXT:9
+//CHECK-NEXT:12
+//CHECK-NEXT:15
+//CHECK-NEXT:14
+
+//TEST_INPUT:ubuffer(data=[1 2 3 4], stride=4),name=input1
+StructuredBuffer<int> input1;
+
+//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4),name=input2
+StructuredBuffer<int> input2;
+
+//TEST_INPUT:ubuffer(data=[2 3 4 1], stride=4),name=input3
+StructuredBuffer<int> input3;
+
+//TEST_INPUT:ubuffer(stride=4, count=256):out,name=outputBuffer
+RWStructuredBuffer<int32_t> outputBuffer;
+
+using namespace linalg;
+
+typealias CoopMatType = CoopMat<int, MemoryScope.Subgroup, 16, 16, CoopMatMatrixUse.MatrixAccumulator>;
+
+int MapOp(uint32_t row, uint32_t col, int a, int b, int c)
+{
+ return a + b + c + 1 + 2 + 3;
+}
+
+[numthreads(32, 1, 1)]
+void computeMain()
+{
+ let stride = 16;
+ let mat1 = CoopMatType.Load<CoopMatMatrixLayout.RowMajor>(input1, 0, stride);
+ let mat2 = CoopMatType.Load<CoopMatMatrixLayout.RowMajor>(input2, 0, stride);
+ let mat3 = CoopMatType.Load<CoopMatMatrixLayout.RowMajor>(input3, 0, stride);
+
+ // Testing the capturing lambda
+ int c0 = 1;
+ int c1 = 2;
+ int c2 = 3;
+
+ CoopMatType result;
+
+#if TEST_MODE == 0
+ result = makeTuple(mat1, mat2, mat3).MapElement(MapOp);
+
+#elif TEST_MODE == 1
+ let f = ((uint32_t x, uint32_t y, int a, int b, int c) => a + b + c + 1 + 2 + 3);
+ result = makeTuple(mat1, mat2, mat3).MapElement(f);
+
+#elif TEST_MODE == 2
+ result = makeTuple(mat1, mat2, mat3).MapElement((uint32_t x, uint32_t y, int a, int b, int c) => a + b + c + 1 + 2 + 3);
+
+#elif TEST_MODE == 3
+ let f = ((uint32_t x, uint32_t y, int a, int b, int c) => a + b + c + c0 + c1 + c2);
+ result = makeTuple(mat1, mat2, mat3).MapElement(f);
+
+#elif TEST_MODE == 4
+ result = makeTuple(mat1, mat2, mat3).MapElement((uint32_t x, uint32_t y, int a, int b, int c) => a + b + c + c0 + c1 + c2);
+#endif
+
+ result.Store<CoopMatMatrixLayout.RowMajor>(outputBuffer, 0, stride);
+}
diff --git a/tests/language-feature/tuple/tuple-expand-multiple.slang b/tests/language-feature/tuple/tuple-expand-multiple.slang
new file mode 100644
index 000000000..9392e2d66
--- /dev/null
+++ b/tests/language-feature/tuple/tuple-expand-multiple.slang
@@ -0,0 +1,37 @@
+//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK): -output-using-type
+
+//TEST_INPUT: set outputBuffer = out ubuffer(data=[0 0 0 0 0 0], stride=4)
+RWStructuredBuffer<int> outputBuffer;
+
+extension<
+ T0 : __BuiltinArithmeticType,
+ each Ts0 : __BuiltinArithmeticType,
+ each Ts1 : __BuiltinArithmeticType
+> Tuple<T0, T0, expand each Ts0, expand each Ts1>
+{
+ static int getSize_Ts0() { return countof(Ts0); }
+ static int getSize_Ts1() { return countof(Ts1); }
+}
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ int i = 2;
+ float f0 = 3, f1 = 5;
+ uint ui0 = 4, ui1 = 6;
+
+ let s0 = makeTuple(i, i); // T, T
+ let s1 = makeTuple(i, i, f0, ui0); // T, T, Ts0, Ts1
+ let s2 = makeTuple(i, i, f0, ui0, f1, ui1); // T, T, Ts0, Ts0, Ts1, Ts1
+
+ outputBuffer[0] = s0.getSize_Ts0();
+ outputBuffer[1] = s0.getSize_Ts1();
+ outputBuffer[2] = s1.getSize_Ts0();
+ outputBuffer[3] = s1.getSize_Ts1();
+ outputBuffer[4] = s2.getSize_Ts0();
+ outputBuffer[5] = s2.getSize_Ts1();
+
+ // CHECK-COUNT-2:0
+ // CHECK-COUNT-2:1
+ // CHECK-COUNT-2:2
+}
diff --git a/tests/language-feature/tuple/tuple-expand.slang b/tests/language-feature/tuple/tuple-expand.slang
new file mode 100644
index 000000000..c9ea26161
--- /dev/null
+++ b/tests/language-feature/tuple/tuple-expand.slang
@@ -0,0 +1,25 @@
+//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK): -output-using-type
+
+//TEST_INPUT: set outputBuffer = out ubuffer(data=[0 0], stride=4)
+RWStructuredBuffer<int> outputBuffer;
+
+struct X<B, each T, each U>
+{
+ int getTSize() { return countof(T); }
+ int getUSize() { return countof(U); }
+}
+
+func foo<each T, each U>() -> X<bool, expand Ptr<each T>, int, expand Ptr<each U>, float> // unify
+{
+ return {};
+}
+
+[numthreads(1,1,1)]
+void computeMain()
+{
+ let x = foo<int, float>();
+
+ outputBuffer[0] = x.getTSize();
+ outputBuffer[1] = x.getUSize();
+ // CHECK-COUNT-2: 2
+}