Skip to content

Commit c4d95f7

Browse files
committed
Add unit tests for make_naive_tensor_descriptor helpers
1 parent 9942fd6 commit c4d95f7

2 files changed

Lines changed: 237 additions & 0 deletions

File tree

test/util/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ add_gtest_executable(unit_sequence unit_sequence.cpp)
55
if(result EQUAL 0)
66
target_link_libraries(unit_sequence PRIVATE utility)
77
endif()
8+
9+
add_gtest_executable(unit_tensor_descriptor_helper unit_tensor_descriptor_helper.cpp)
10+
if(result EQUAL 0)
11+
target_link_libraries(unit_tensor_descriptor_helper PRIVATE utility)
12+
endif()
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
// Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
2+
// SPDX-License-Identifier: MIT
3+
4+
#include <gtest/gtest.h>
5+
#include "ck/utility/common_header.hpp"
6+
#include "ck/tensor_description/tensor_descriptor_helper.hpp"
7+
8+
using namespace ck;
9+
10+
// Test make_naive_tensor_descriptor (public API)
11+
// Formula for element_space_size: 1 + sum((length[i] - 1) * stride[i])
12+
13+
TEST(MakeNaiveTensorDescriptor, ElementSpaceSize2D)
14+
{
15+
// 5x4 tensor with row-major strides [4, 1]
16+
// element_space_size = 1 + (5-1)*4 + (4-1)*1 = 1 + 16 + 3 = 20
17+
constexpr auto lengths = make_tuple(Number<5>{}, Number<4>{});
18+
constexpr auto strides = make_tuple(Number<4>{}, Number<1>{});
19+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
20+
EXPECT_EQ(desc.GetElementSpaceSize(), 20);
21+
}
22+
23+
TEST(MakeNaiveTensorDescriptor, ElementSpaceSize3D)
24+
{
25+
// 3x8x11 tensor with strides [88, 11, 1]
26+
// element_space_size = 1 + (3-1)*88 + (8-1)*11 + (11-1)*1 = 1 + 176 + 77 + 10 = 264
27+
constexpr auto lengths = make_tuple(Number<3>{}, Number<8>{}, Number<11>{});
28+
constexpr auto strides = make_tuple(Number<88>{}, Number<11>{}, Number<1>{});
29+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
30+
EXPECT_EQ(desc.GetElementSpaceSize(), 264);
31+
}
32+
33+
TEST(MakeNaiveTensorDescriptor, BroadcastDimension)
34+
{
35+
// 8x5 tensor with broadcast on first dimension (stride 0)
36+
// element_space_size = 1 + (8-1)*0 + (5-1)*1 = 1 + 0 + 4 = 5
37+
constexpr auto lengths = make_tuple(Number<8>{}, Number<5>{});
38+
constexpr auto strides = make_tuple(Number<0>{}, Number<1>{});
39+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
40+
EXPECT_EQ(desc.GetElementSpaceSize(), 5);
41+
}
42+
43+
TEST(MakeNaiveTensorDescriptor, BroadcastNonAdjacentDims7D)
44+
{
45+
// 7D tensor: 2x3x5x7x11x13x17 with broadcast on dims 2 and 4 (non-adjacent)
46+
// Underlying data is 2x3x7x13x17 = 9282 elements, broadcast over dims 2 and 4
47+
// strides: [4641, 1547, 0, 221, 0, 17, 1]
48+
// element_space_size = 1 + (2-1)*4641 + (3-1)*1547 + (5-1)*0 + (7-1)*221
49+
// + (11-1)*0 + (13-1)*17 + (17-1)*1
50+
// = 1 + 4641 + 3094 + 0 + 1326 + 0 + 204 + 16 = 9282
51+
constexpr auto lengths = make_tuple(Number<2>{},
52+
Number<3>{},
53+
Number<5>{},
54+
Number<7>{},
55+
Number<11>{},
56+
Number<13>{},
57+
Number<17>{});
58+
constexpr auto strides = make_tuple(Number<4641>{},
59+
Number<1547>{},
60+
Number<0>{},
61+
Number<221>{},
62+
Number<0>{},
63+
Number<17>{},
64+
Number<1>{});
65+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
66+
EXPECT_EQ(desc.GetElementSpaceSize(), 9282);
67+
}
68+
69+
TEST(MakeNaiveTensorDescriptor, WithPaddingArbitrary)
70+
{
71+
// 11x7x3 tensor with arbitrary strides [2, 97, 23] (prime numbers, no common factors)
72+
// This tests padding where offsets don't correspond to any packed array
73+
// element_space_size = 1 + (11-1)*2 + (7-1)*97 + (3-1)*23 = 1 + 20 + 582 + 46 = 649
74+
constexpr auto lengths = make_tuple(Number<11>{}, Number<7>{}, Number<3>{});
75+
constexpr auto strides = make_tuple(Number<2>{}, Number<97>{}, Number<23>{});
76+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
77+
EXPECT_EQ(desc.GetElementSpaceSize(), 649);
78+
}
79+
80+
TEST(MakeNaiveTensorDescriptor, WithPaddingStrideSlice)
81+
{
82+
// 2x3x5 tensor with strides [1, 7, 35] - like a slice from a 7x7xN column-major tensor
83+
// This tests padding where there's space for extra elements
84+
// element_space_size = 1 + (2-1)*1 + (3-1)*7 + (5-1)*35 = 1 + 1 + 14 + 140 = 156
85+
constexpr auto lengths = make_tuple(Number<2>{}, Number<3>{}, Number<5>{});
86+
constexpr auto strides = make_tuple(Number<1>{}, Number<7>{}, Number<35>{});
87+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
88+
EXPECT_EQ(desc.GetElementSpaceSize(), 156);
89+
}
90+
91+
TEST(MakeNaiveTensorDescriptor, ColumnMajor)
92+
{
93+
// 7x3 tensor with column-major strides [1, 7]
94+
// element_space_size = 1 + (7-1)*1 + (3-1)*7 = 1 + 6 + 14 = 21
95+
constexpr auto lengths = make_tuple(Number<7>{}, Number<3>{});
96+
constexpr auto strides = make_tuple(Number<1>{}, Number<7>{});
97+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
98+
EXPECT_EQ(desc.GetElementSpaceSize(), 21);
99+
}
100+
101+
// Test with runtime values (index_t instead of Number<>)
102+
TEST(MakeNaiveTensorDescriptorRuntime, Simple2D)
103+
{
104+
// 9x4 tensor with row-major strides
105+
// element_space_size = 1 + (9-1)*4 + (4-1)*1 = 1 + 32 + 3 = 36
106+
const auto lengths = make_tuple(index_t{9}, index_t{4});
107+
const auto strides = make_tuple(index_t{4}, index_t{1});
108+
const auto desc = make_naive_tensor_descriptor(lengths, strides);
109+
EXPECT_EQ(desc.GetElementSpaceSize(), 36);
110+
}
111+
112+
TEST(MakeNaiveTensorDescriptorRuntime, WithPadding)
113+
{
114+
// 13x5x2 tensor with arbitrary strides (using prime numbers)
115+
// element_space_size = 1 + (13-1)*2 + (5-1)*97 + (2-1)*23 = 1 + 24 + 388 + 23 = 436
116+
const auto lengths = make_tuple(index_t{13}, index_t{5}, index_t{2});
117+
const auto strides = make_tuple(index_t{2}, index_t{97}, index_t{23});
118+
const auto desc = make_naive_tensor_descriptor(lengths, strides);
119+
EXPECT_EQ(desc.GetElementSpaceSize(), 436);
120+
}
121+
122+
// Test 1D tensors with explicit strides
123+
TEST(MakeNaiveTensorDescriptor, ElementSpaceSize1D)
124+
{
125+
// 13-element 1D tensor with stride 1
126+
constexpr auto lengths = make_tuple(Number<13>{});
127+
constexpr auto strides = make_tuple(Number<1>{});
128+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
129+
EXPECT_EQ(desc.GetElementSpaceSize(), 13);
130+
}
131+
132+
TEST(MakeNaiveTensorDescriptor, ElementSpaceSize1DStrided)
133+
{
134+
// 7-element 1D tensor with stride 3 (every 3rd element)
135+
// element_space_size = 1 + (7-1)*3 = 19
136+
constexpr auto lengths = make_tuple(Number<7>{});
137+
constexpr auto strides = make_tuple(Number<3>{});
138+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
139+
EXPECT_EQ(desc.GetElementSpaceSize(), 19);
140+
}
141+
142+
// Test make_naive_tensor_descriptor_packed (contiguous layout)
143+
// element_space_size = product of all lengths
144+
TEST(MakeNaiveTensorDescriptorPacked, Simple1D)
145+
{
146+
// 17-element packed tensor - element_space_size = 17
147+
constexpr auto lengths = make_tuple(Number<17>{});
148+
constexpr auto desc = make_naive_tensor_descriptor_packed(lengths);
149+
EXPECT_EQ(desc.GetElementSpaceSize(), 17);
150+
}
151+
152+
TEST(MakeNaiveTensorDescriptorPacked, Simple2D)
153+
{
154+
// 6x5 packed tensor - element_space_size = 6*5 = 30
155+
constexpr auto lengths = make_tuple(Number<6>{}, Number<5>{});
156+
constexpr auto desc = make_naive_tensor_descriptor_packed(lengths);
157+
EXPECT_EQ(desc.GetElementSpaceSize(), 30);
158+
}
159+
160+
TEST(MakeNaiveTensorDescriptorPacked, Simple3D)
161+
{
162+
// 4x5x9 packed tensor - element_space_size = 4*5*9 = 180
163+
constexpr auto lengths = make_tuple(Number<4>{}, Number<5>{}, Number<9>{});
164+
constexpr auto desc = make_naive_tensor_descriptor_packed(lengths);
165+
EXPECT_EQ(desc.GetElementSpaceSize(), 180);
166+
}
167+
168+
// Test make_naive_tensor_descriptor_aligned (stride alignment for memory access)
169+
// Aligns the second-to-last stride to be a multiple of 'align'
170+
TEST(MakeNaiveTensorDescriptorAligned, Align4)
171+
{
172+
// 5x3 tensor aligned to 4 elements
173+
// strides[1] = 1, strides[0] = integer_least_multiple(3, 4) = 4
174+
// element_space_size = 1 + (5-1)*4 + (3-1)*1 = 1 + 16 + 2 = 19
175+
constexpr auto lengths = make_tuple(Number<5>{}, Number<3>{});
176+
constexpr auto desc = make_naive_tensor_descriptor_aligned(lengths, Number<4>{});
177+
EXPECT_EQ(desc.GetElementSpaceSize(), 19);
178+
}
179+
180+
TEST(MakeNaiveTensorDescriptorAligned, Align8)
181+
{
182+
// 3x5x7 tensor aligned to 8 elements
183+
// strides[2] = 1, strides[1] = integer_least_multiple(7, 8) = 8, strides[0] = 5*8 = 40
184+
// element_space_size = 1 + (3-1)*40 + (5-1)*8 + (7-1)*1 = 1 + 80 + 32 + 6 = 119
185+
constexpr auto lengths = make_tuple(Number<3>{}, Number<5>{}, Number<7>{});
186+
constexpr auto desc = make_naive_tensor_descriptor_aligned(lengths, Number<8>{});
187+
EXPECT_EQ(desc.GetElementSpaceSize(), 119);
188+
}
189+
190+
// Test high-dimensional tensors (8D) to verify no integer overflow
191+
TEST(MakeNaiveTensorDescriptorPacked, Simple8D)
192+
{
193+
// 8D packed tensor with small prime dimensions: 2x3x5x7x11x13x2x3
194+
// element_space_size = 2*3*5*7*11*13*2*3 = 180180
195+
constexpr auto lengths = make_tuple(Number<2>{},
196+
Number<3>{},
197+
Number<5>{},
198+
Number<7>{},
199+
Number<11>{},
200+
Number<13>{},
201+
Number<2>{},
202+
Number<3>{});
203+
constexpr auto desc = make_naive_tensor_descriptor_packed(lengths);
204+
EXPECT_EQ(desc.GetElementSpaceSize(), 180180);
205+
}
206+
207+
TEST(MakeNaiveTensorDescriptor, ElementSpaceSize8D)
208+
{
209+
// 8D tensor with permuted layout (non-monotonous strides): 2x3x5x7x11x13x17x19
210+
// Memory order: [dim7, dim3, dim1, dim5, dim2, dim0, dim6, dim4]
211+
// This gives strides: [25935, 133, 5187, 19, 881790, 399, 51870, 1]
212+
// Note: strides go up/down/up/down - not monotonously increasing or decreasing
213+
// element_space_size = 2*3*5*7*11*13*17*19 = 9699690
214+
constexpr auto lengths = make_tuple(Number<2>{},
215+
Number<3>{},
216+
Number<5>{},
217+
Number<7>{},
218+
Number<11>{},
219+
Number<13>{},
220+
Number<17>{},
221+
Number<19>{});
222+
constexpr auto strides = make_tuple(Number<25935>{},
223+
Number<133>{},
224+
Number<5187>{},
225+
Number<19>{},
226+
Number<881790>{},
227+
Number<399>{},
228+
Number<51870>{},
229+
Number<1>{});
230+
constexpr auto desc = make_naive_tensor_descriptor(lengths, strides);
231+
EXPECT_EQ(desc.GetElementSpaceSize(), 9699690);
232+
}

0 commit comments

Comments
 (0)