"vscode:/vscode.git/clone" did not exist on "abf75ac039420f7a4ab64a419416dd493b906742"
ConstantTensorDescriptor.hip.hpp 18.8 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
#pragma once
2
#include "common.hip.hpp"
Chao Liu's avatar
Chao Liu committed
3

4
5
template <class PreviousStrides, class RemainLengths>
__host__ __device__ constexpr auto calculate_default_strides_impl(PreviousStrides, RemainLengths)
Chao Liu's avatar
Chao Liu committed
6
{
7
8
9
    constexpr index_t previous_stride = PreviousStrides{}.Front();
    constexpr index_t current_length  = RemainLengths{}.Back();
    constexpr index_t current_stride  = current_length * previous_stride;
Chao Liu's avatar
Chao Liu committed
10

11
12
    return calculate_default_strides_impl(PreviousStrides{}.PushFront(Number<current_stride>{}),
                                          RemainLengths{}.PopBack());
Chao Liu's avatar
Chao Liu committed
13
14
}

15
16
template <class PreviousStrides, index_t L0, index_t L1>
__host__ __device__ constexpr auto calculate_default_strides_impl(PreviousStrides, Sequence<L0, L1>)
17
{
18
19
    constexpr index_t previous_stride = PreviousStrides{}.Front();
    constexpr index_t current_stride  = L1 * previous_stride;
20

21
    return PreviousStrides{}.PushFront(Number<current_stride>{});
22
23
}

24
25
template <class Lengths>
__host__ __device__ constexpr auto calculate_default_strides(Lengths)
26
{
27
    return calculate_default_strides_impl(Sequence<1>{}, Lengths{});
28
29
}

Chao Liu's avatar
Chao Liu committed
30
// this is ugly, only for 2d
Chao Liu's avatar
Chao Liu committed
31
template <index_t L0, index_t L1, index_t Align>
Chao Liu's avatar
Chao Liu committed
32
33
34
__host__ __device__ constexpr auto calculate_default_strides_aligned(Sequence<L0, L1>,
                                                                     Number<Align>)
{
Chao Liu's avatar
Chao Liu committed
35
    constexpr index_t L1_align = Align * ((L1 + Align - 1) / Align);
Chao Liu's avatar
Chao Liu committed
36
37
38
    return Sequence<L1_align, 1>{};
}

39
40
41
42
43
44
45
46
47
// this is ugly, only for 3d
template <index_t L0, index_t L1, index_t L2, index_t Align>
__host__ __device__ constexpr auto calculate_default_strides_aligned(Sequence<L0, L1, L2>,
                                                                     Number<Align>)
{
    constexpr index_t L2_align = Align * ((L2 + Align - 1) / Align);
    return Sequence<L1 * L2_align, L2_align, 1>{};
}

Chao Liu's avatar
Chao Liu committed
48
// this is ugly, only for 4d
Chao Liu's avatar
Chao Liu committed
49
template <index_t L0, index_t L1, index_t L2, index_t L3, index_t Align>
Chao Liu's avatar
Chao Liu committed
50
51
52
__host__ __device__ constexpr auto calculate_default_strides_aligned(Sequence<L0, L1, L2, L3>,
                                                                     Number<Align>)
{
Chao Liu's avatar
Chao Liu committed
53
    constexpr index_t L3_align = Align * ((L3 + Align - 1) / Align);
Chao Liu's avatar
Chao Liu committed
54
55
56
    return Sequence<L1 * L2 * L3_align, L2 * L3_align, L3_align, 1>{};
}

Chao Liu's avatar
Chao Liu committed
57
58
59
template <class Lengths, class Strides>
struct ConstantTensorDescriptor
{
Chao Liu's avatar
Chao Liu committed
60
    using Type                    = ConstantTensorDescriptor;
61
    static constexpr index_t nDim = Lengths::GetSize();
Chao Liu's avatar
Chao Liu committed
62
63
64

    __host__ __device__ constexpr ConstantTensorDescriptor()
    {
65
        static_assert(Lengths::GetSize() == Strides::GetSize(), "nDim not consistent");
Chao Liu's avatar
Chao Liu committed
66
67
    }

Chao Liu's avatar
Chao Liu committed
68
    __host__ __device__ static constexpr index_t GetNumOfDimension() { return nDim; }
Chao Liu's avatar
Chao Liu committed
69

70
    __host__ __device__ static constexpr Lengths GetLengths() { return Lengths{}; }
Chao Liu's avatar
Chao Liu committed
71

72
    __host__ __device__ static constexpr Strides GetStrides() { return Strides{}; }
Chao Liu's avatar
Chao Liu committed
73

Chao Liu's avatar
Chao Liu committed
74
    template <index_t I>
75
    __host__ __device__ static constexpr index_t GetLength(Number<I>)
Chao Liu's avatar
Chao Liu committed
76
    {
Chao Liu's avatar
Chao Liu committed
77
        return Lengths{}.Get(Number<I>{});
Chao Liu's avatar
Chao Liu committed
78
79
    }

Chao Liu's avatar
Chao Liu committed
80
    template <index_t I>
81
    __host__ __device__ static constexpr index_t GetStride(Number<I>)
Chao Liu's avatar
Chao Liu committed
82
    {
Chao Liu's avatar
Chao Liu committed
83
        return Strides{}.Get(Number<I>{});
Chao Liu's avatar
Chao Liu committed
84
85
    }

86
    __host__ __device__ static constexpr index_t GetElementSize()
Chao Liu's avatar
Chao Liu committed
87
    {
Chao Liu's avatar
Chao Liu committed
88
        return accumulate_on_sequence(Lengths{}, std::multiplies<index_t>{}, Number<1>{});
89
    }
90

Chao Liu's avatar
Chao Liu committed
91
    template <class Align = Number<1>>
92
    __host__ __device__ static constexpr index_t GetElementSpace(Align align = Align{})
Chao Liu's avatar
Chao Liu committed
93
    {
Chao Liu's avatar
Chao Liu committed
94
95
        constexpr index_t element_space_unaligned = accumulate_on_sequence(
            (GetLengths() - Number<1>{}) * GetStrides(), std::plus<index_t>{}, Number<1>{});
Chao Liu's avatar
Chao Liu committed
96
97

        return align.Get() * ((element_space_unaligned + align.Get() - 1) / align.Get());
Chao Liu's avatar
Chao Liu committed
98
    }
Chao Liu's avatar
Chao Liu committed
99

100
101
    template <index_t NSize>
    __host__ __device__ static index_t Get1dIndex(Array<index_t, NSize> multi_id)
Chao Liu's avatar
Chao Liu committed
102
    {
103
        static_assert(NSize == nDim, "wrong! Dimension not consistent");
Chao Liu's avatar
Chao Liu committed
104

Chao Liu's avatar
Chao Liu committed
105
        index_t id = 0;
Chao Liu's avatar
Chao Liu committed
106

107
        static_for<0, nDim, 1>{}([&](auto IDim) {
Chao Liu's avatar
Chao Liu committed
108
            constexpr index_t idim = IDim.Get();
109
110
            id += multi_id[idim] * GetStride(IDim);
        });
Chao Liu's avatar
Chao Liu committed
111

112
        return id;
113
114
    }

115
116
117
118
119
120
121
122
123
124
    template <class... Is>
    __host__ __device__ static index_t Get1dIndex(Is... is)
    {
        static_assert(sizeof...(Is) == nDim, "number of multi-index is wrong");

        const auto multi_id = Array<index_t, nDim>(is...);

        return Get1dIndex(multi_id);
    }

125
    template <index_t... Is>
Chao Liu's avatar
Chao Liu committed
126
    __host__ __device__ static constexpr index_t Get1dIndex(Sequence<Is...> /*multi_id*/)
127
128
129
    {
        static_assert(sizeof...(Is) == nDim, "wrong! Dimension not consistent");

Chao Liu's avatar
Chao Liu committed
130
131
        constexpr auto multi_id = Sequence<Is...>{};

Chao Liu's avatar
Chao Liu committed
132
        return accumulate_on_sequence(multi_id * GetStrides(), std::plus<index_t>{}, Number<0>{});
133
134
    }

135
    __host__ __device__ static Array<index_t, nDim> GetMultiIndex(index_t id)
Chao Liu's avatar
Chao Liu committed
136
    {
137
138
139
140
141
142
143
144
145
146
147
        Array<index_t, nDim> multi_id;

        static_for<0, nDim - 1, 1>{}([&](auto IDim) {
            constexpr index_t idim = IDim.Get();
            multi_id[idim]         = id / GetStride(IDim);
            id -= multi_id[idim] * GetStride(IDim);
        });

        multi_id[nDim - 1] = id / GetStride(Number<nDim - 1>{});

        return multi_id;
Chao Liu's avatar
Chao Liu committed
148
    }
149

Chao Liu's avatar
Chao Liu committed
150
    __host__ __device__ static constexpr auto Pack()
151
    {
152
153
        constexpr auto default_strides = calculate_default_strides(Lengths{});
        return ConstantTensorDescriptor<Lengths, decltype(default_strides)>{};
154
    }
Chao Liu's avatar
Chao Liu committed
155

Chao Liu's avatar
Chao Liu committed
156
    template <index_t... IDims>
Chao Liu's avatar
Chao Liu committed
157
    __host__ __device__ static constexpr auto Extract(Number<IDims>... extract_dims)
Chao Liu's avatar
Chao Liu committed
158
    {
Chao Liu's avatar
Chao Liu committed
159
160
        static_assert(sizeof...(IDims) <= GetNumOfDimension(),
                      "wrong! too many number of dimensions to be extracted");
Chao Liu's avatar
Chao Liu committed
161

Chao Liu's avatar
Chao Liu committed
162
163
        return make_ConstantTensorDescriptor(Lengths{}.Extract(extract_dims...),
                                             Strides{}.Extract(extract_dims...));
Chao Liu's avatar
Chao Liu committed
164
165
166
167
168
    }

    template <index_t IDim, index_t SliceLen>
    __host__ __device__ static constexpr auto Slice(Number<IDim>, Number<SliceLen>)
    {
Chao Liu's avatar
Chao Liu committed
169
170
        return make_ConstantTensorDescriptor(Lengths{}.Modify(Number<IDim>{}, Number<SliceLen>{}),
                                             Strides{});
Chao Liu's avatar
Chao Liu committed
171
172
    }

Chao Liu's avatar
Chao Liu committed
173
    template <index_t IDim, index_t... FoldIntervals>
Chao Liu's avatar
Chao Liu committed
174
    __host__ __device__ static constexpr auto Fold(Number<IDim>, Number<FoldIntervals>...)
Chao Liu's avatar
Chao Liu committed
175
    {
Chao Liu's avatar
Chao Liu committed
176
177
        constexpr auto fold_intervals = Sequence<FoldIntervals...>{};

Chao Liu's avatar
Chao Liu committed
178
        constexpr index_t fold_intervals_product =
Chao Liu's avatar
Chao Liu committed
179
180
181
182
183
184
185
            accumulate_on_sequence(fold_intervals, std::multiplies<index_t>{}, Number<1>{});

        constexpr auto unfold_length = GetLength(Number<IDim>{});
        constexpr auto unfold_stride = GetStride(Number<IDim>{});

        // length of the dimension to be folded needs to be dividable by fold_interval_product,
        // otherwise, folding is invalid
Chao Liu's avatar
Chao Liu committed
186
        static_assert(unfold_length % fold_intervals_product == 0,
Chao Liu's avatar
Chao Liu committed
187
188
189
190
                      "wrong! length on the dimension to be folded cannot be evenly divided!");

        // folded lengths
        constexpr auto fold_lengths =
Chao Liu's avatar
Chao Liu committed
191
            Sequence<unfold_length / fold_intervals_product>{}.Append(fold_intervals);
Chao Liu's avatar
Chao Liu committed
192
193

        // folded strides
Chao Liu's avatar
Chao Liu committed
194
195
        constexpr auto fold_strides =
            Number<unfold_stride>{} *
Chao Liu's avatar
Chao Liu committed
196
197
            reverse_scan_sequence(fold_intervals.PushBack(Number<1>{}), std::multiplies<index_t>{});

Chao Liu's avatar
Chao Liu committed
198
199
200
201
        // left and right
        constexpr auto left  = make_increasing_sequence(Number<0>{}, Number<IDim>{}, Number<1>{});
        constexpr auto right = make_increasing_sequence(
            Number<IDim + 1>{}, Number<GetNumOfDimension()>{}, Number<1>{});
Chao Liu's avatar
Chao Liu committed
202

Chao Liu's avatar
Chao Liu committed
203
        return make_ConstantTensorDescriptor(
Chao Liu's avatar
Chao Liu committed
204
205
            GetLengths().Extract(left).Append(fold_lengths).Append(GetLengths().Extract(right)),
            GetStrides().Extract(left).Append(fold_strides).Append(GetStrides().Extract(right)));
Chao Liu's avatar
Chao Liu committed
206
207
208
209
210
    }

    template <index_t FirstUnfoldDim, index_t LastUnfoldDim>
    __host__ __device__ static constexpr auto Unfold(Number<FirstUnfoldDim>, Number<LastUnfoldDim>)
    {
Chao Liu's avatar
Chao Liu committed
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
        static_assert(FirstUnfoldDim >= 0 && LastUnfoldDim < nDim &&
                          FirstUnfoldDim <= LastUnfoldDim,
                      "wrong! should have FirstUnfoldDim <= LastUnfoldDim!");

        // dimensions to be unfold need to be in descending order (w.r.t. strides), and need to be
        // packed in memory, otherwise, unfolding is invalid
        static_for<FirstUnfoldDim, LastUnfoldDim, 1>{}([&](auto IDim) {
            static_assert(
                GetStride(IDim) >= GetStride(Number<IDim.Get() + 1>{}),
                "wrong! dimensions to be unfolded need to be in descending order w.r.t strides");

            static_assert(GetStride(IDim + 1) * GetLength(IDim + 1) == GetStride(IDim),
                          "wrong! dimensions to be unfolded need to be packed");
        });

Chao Liu's avatar
Chao Liu committed
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
        // left and right
        constexpr auto left =
            make_increasing_sequence(Number<0>{}, Number<FirstUnfoldDim>{}, Number<1>{});
        constexpr auto middle = make_increasing_sequence(
            Number<FirstUnfoldDim>{}, Number<LastUnfoldDim + 1>{}, Number<1>{});
        constexpr auto right = make_increasing_sequence(
            Number<LastUnfoldDim + 1>{}, Number<GetNumOfDimension()>{}, Number<1>{});

        // length and stride
        constexpr index_t unfold_length = accumulate_on_sequence(
            GetLengths().Extract(middle), std::multiplies<index_t>{}, Number<1>{});

        constexpr index_t unfold_stride = GetStride(Number<LastUnfoldDim>{});

        return make_ConstantTensorDescriptor(GetLengths()
                                                 .Extract(left)
                                                 .PushBack(Number<unfold_length>{})
                                                 .Append(GetLengths().Extract(right)),
                                             GetStrides()
                                                 .Extract(left)
                                                 .PushBack(Number<unfold_stride>{})
                                                 .Append(GetStrides().Extract(right)));
Chao Liu's avatar
Chao Liu committed
248
249
250
251
252
    }

    template <index_t... IRs>
    __host__ __device__ static constexpr auto ReorderGivenNew2Old(Sequence<IRs...> /*new2old*/)
    {
Chao Liu's avatar
Chao Liu committed
253
        static_assert(sizeof...(IRs) == GetNumOfDimension(), "wrong! dimension is wrong");
Chao Liu's avatar
Chao Liu committed
254
255
256
257
        constexpr auto map_new2old = Sequence<IRs...>{};
        return make_ConstantTensorDescriptor(Lengths{}.ReorderGivenNew2Old(map_new2old),
                                             Strides{}.ReorderGivenNew2Old(map_new2old));
    }
Chao Liu's avatar
Chao Liu committed
258
};
Chao Liu's avatar
Chao Liu committed
259
260
261
262
263
264
265
266
267
268
269
270
271
272

template <class Lengths>
__host__ __device__ constexpr auto make_ConstantTensorDescriptor(Lengths)
{
    using Strides = decltype(calculate_default_strides(Lengths{}));
    return ConstantTensorDescriptor<Lengths, Strides>{};
}

template <class Lengths, class Strides>
__host__ __device__ constexpr auto make_ConstantTensorDescriptor(Lengths, Strides)
{
    return ConstantTensorDescriptor<Lengths, Strides>{};
}

Chao Liu's avatar
Chao Liu committed
273
template <class Lengths, index_t Align>
Chao Liu's avatar
Chao Liu committed
274
275
276
277
278
279
__host__ __device__ constexpr auto make_ConstantTensorDescriptor_aligned(Lengths, Number<Align>)
{
    using Strides = decltype(calculate_default_strides_aligned(Lengths{}, Number<Align>{}));
    return ConstantTensorDescriptor<Lengths, Strides>{};
}

Chao Liu's avatar
Chao Liu committed
280
template <class TDesc>
Chao Liu's avatar
Chao Liu committed
281
__host__ __device__ void print_ConstantTensorDescriptor(TDesc, const char* s)
Chao Liu's avatar
Chao Liu committed
282
{
Chao Liu's avatar
Chao Liu committed
283
    constexpr auto desc    = TDesc{};
Chao Liu's avatar
Chao Liu committed
284
    constexpr index_t ndim = desc.GetNumOfDimension();
Chao Liu's avatar
Chao Liu committed
285

Chao Liu's avatar
Chao Liu committed
286
    static_assert(ndim >= 2 && ndim <= 10, "wrong!");
Chao Liu's avatar
Chao Liu committed
287
288
289
290
291
292
293
294

    if(ndim == 2)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};

        printf("%s dim %u, lengths {%u %u}, strides {%u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
295
               desc.GetNumOfDimension(),
Chao Liu's avatar
Chao Liu committed
296
297
298
299
300
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetStride(I0),
               desc.GetStride(I1));
    }
301
302
303
304
305
306
307
308
    else if(ndim == 3)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};

        printf("%s dim %u, lengths {%u %u %u}, strides {%u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
309
               desc.GetNumOfDimension(),
310
311
312
313
314
315
316
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2));
    }
Chao Liu's avatar
Chao Liu committed
317
318
319
320
321
322
323
324
325
    else if(ndim == 4)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};

        printf("%s dim %u, lengths {%u %u %u %u}, strides {%u %u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
326
               desc.GetNumOfDimension(),
Chao Liu's avatar
Chao Liu committed
327
328
329
330
331
332
333
334
335
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3));
    }
336
337
338
339
340
341
342
343
344
345
    else if(ndim == 5)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};

        printf("%s dim %u, lengths {%u %u %u %u %u}, strides {%u %u %u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
346
               desc.GetNumOfDimension(),
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4));
    }
    else if(ndim == 6)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};
        constexpr auto I5 = Number<5>{};

        printf("%s dim %u, lengths {%u %u %u %u %u %u}, strides {%u %u %u %u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
369
               desc.GetNumOfDimension(),
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetLength(I5),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4),
               desc.GetStride(I5));
    }
    else if(ndim == 7)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};
        constexpr auto I5 = Number<5>{};
        constexpr auto I6 = Number<6>{};

        printf("%s dim %u, lengths {%u %u %u %u %u %u %u}, strides {%u %u %u %u %u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
395
               desc.GetNumOfDimension(),
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetLength(I5),
               desc.GetLength(I6),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4),
               desc.GetStride(I5),
               desc.GetStride(I6));
    }
    else if(ndim == 8)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};
        constexpr auto I5 = Number<5>{};
        constexpr auto I6 = Number<6>{};
        constexpr auto I7 = Number<7>{};

        printf("%s dim %u, lengths {%u %u %u %u %u %u %u %u}, strides {%u %u %u %u %u %u %u %u}\n",
               s,
Chao Liu's avatar
Chao Liu committed
424
               desc.GetNumOfDimension(),
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetLength(I5),
               desc.GetLength(I6),
               desc.GetLength(I7),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4),
               desc.GetStride(I5),
               desc.GetStride(I6),
               desc.GetStride(I7));
    }
Chao Liu's avatar
Chao Liu committed
442
443
444
445
446
447
448
449
450
451
452
453
    else if(ndim == 9)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};
        constexpr auto I5 = Number<5>{};
        constexpr auto I6 = Number<6>{};
        constexpr auto I7 = Number<7>{};
        constexpr auto I8 = Number<8>{};

Chao Liu's avatar
tidy yp  
Chao Liu committed
454
455
        printf("%s dim %u, lengths {%u %u %u %u %u %u %u %u %u}, strides {%u %u %u %u %u %u %u %u "
               "%u}\n",
Chao Liu's avatar
Chao Liu committed
456
               s,
Chao Liu's avatar
Chao Liu committed
457
               desc.GetNumOfDimension(),
Chao Liu's avatar
Chao Liu committed
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetLength(I5),
               desc.GetLength(I6),
               desc.GetLength(I7),
               desc.GetLength(I8),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4),
               desc.GetStride(I5),
               desc.GetStride(I6),
               desc.GetStride(I7),
               desc.GetStride(I8));
    }
    else if(ndim == 10)
    {
        constexpr auto I0 = Number<0>{};
        constexpr auto I1 = Number<1>{};
        constexpr auto I2 = Number<2>{};
        constexpr auto I3 = Number<3>{};
        constexpr auto I4 = Number<4>{};
        constexpr auto I5 = Number<5>{};
        constexpr auto I6 = Number<6>{};
        constexpr auto I7 = Number<7>{};
        constexpr auto I8 = Number<8>{};
        constexpr auto I9 = Number<9>{};

Chao Liu's avatar
tidy yp  
Chao Liu committed
490
491
        printf("%s dim %u, lengths {%u %u %u %u %u %u %u %u %u %u}, strides {%u %u %u %u %u %u %u "
               "%u %u %u}\n",
Chao Liu's avatar
Chao Liu committed
492
               s,
Chao Liu's avatar
Chao Liu committed
493
               desc.GetNumOfDimension(),
Chao Liu's avatar
Chao Liu committed
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
               desc.GetLength(I0),
               desc.GetLength(I1),
               desc.GetLength(I2),
               desc.GetLength(I3),
               desc.GetLength(I4),
               desc.GetLength(I5),
               desc.GetLength(I6),
               desc.GetLength(I7),
               desc.GetLength(I8),
               desc.GetLength(I9),
               desc.GetStride(I0),
               desc.GetStride(I1),
               desc.GetStride(I2),
               desc.GetStride(I3),
               desc.GetStride(I4),
               desc.GetStride(I5),
               desc.GetStride(I6),
               desc.GetStride(I7),
               desc.GetStride(I8),
               desc.GetStride(I9));
    }
Chao Liu's avatar
Chao Liu committed
515
}