Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
composable_kernel
Commits
648f1f13
Commit
648f1f13
authored
Sep 29, 2023
by
Adam Osewski
Browse files
Merge remote-tracking branch 'origin/develop' into aosewski/gemm_tile_loop
parents
4e5190f5
cb538740
Changes
344
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
955 additions
and
354 deletions
+955
-354
test/batchnorm/batchnorm_infer_rank_4.cpp
test/batchnorm/batchnorm_infer_rank_4.cpp
+17
-4
test/conv_tensor_rearrange/CMakeLists.txt
test/conv_tensor_rearrange/CMakeLists.txt
+4
-0
test/conv_tensor_rearrange/test_conv_tensor_rearrange.cpp
test/conv_tensor_rearrange/test_conv_tensor_rearrange.cpp
+153
-0
test/conv_tensor_rearrange/test_conv_tensor_rearrange_interface.cpp
...tensor_rearrange/test_conv_tensor_rearrange_interface.cpp
+260
-0
test/data_type/CMakeLists.txt
test/data_type/CMakeLists.txt
+10
-7
test/data_type/fp8.cpp
test/data_type/fp8.cpp
+0
-0
test/data_type/type_convert_const.cpp
test/data_type/type_convert_const.cpp
+93
-0
test/elementwise_normalization/CMakeLists.txt
test/elementwise_normalization/CMakeLists.txt
+3
-3
test/gemm/CMakeLists.txt
test/gemm/CMakeLists.txt
+14
-16
test/gemm_layernorm/CMakeLists.txt
test/gemm_layernorm/CMakeLists.txt
+5
-5
test/gemm_reduce/CMakeLists.txt
test/gemm_reduce/CMakeLists.txt
+3
-4
test/gemm_split_k/test_gemm_splitk_ut_cases.inc
test/gemm_split_k/test_gemm_splitk_ut_cases.inc
+4
-4
test/grouped_convnd_bwd_data/CMakeLists.txt
test/grouped_convnd_bwd_data/CMakeLists.txt
+19
-6
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data.cpp
.../grouped_convnd_bwd_data/test_grouped_convnd_bwd_data.cpp
+6
-2
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data_interface_wmma.cpp
..._bwd_data/test_grouped_convnd_bwd_data_interface_wmma.cpp
+178
-0
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data_interface_xdl.cpp
...d_bwd_data/test_grouped_convnd_bwd_data_interface_xdl.cpp
+0
-0
test/grouped_convnd_bwd_weight/test_grouped_convnd_bwd_weight.cpp
...uped_convnd_bwd_weight/test_grouped_convnd_bwd_weight.cpp
+52
-18
test/grouped_convnd_fwd/CMakeLists.txt
test/grouped_convnd_fwd/CMakeLists.txt
+1
-1
test/grouped_convnd_fwd/grouped_convnd_fwd.cpp
test/grouped_convnd_fwd/grouped_convnd_fwd.cpp
+0
-284
test/grouped_convnd_fwd/test_grouped_convnd_fwd.cpp
test/grouped_convnd_fwd/test_grouped_convnd_fwd.cpp
+133
-0
No files found.
test/batchnorm/batchnorm_infer_rank_4.cpp
View file @
648f1f13
...
...
@@ -67,10 +67,23 @@ class TestBatchNormInferRank4 : public ::testing::Test
}
};
using
KernelTypes
=
::
testing
::
Types
<
std
::
tuple
<
F16
,
F16
,
F32
,
F16
,
F16
,
F32
>
,
std
::
tuple
<
F32
,
F32
,
F32
,
F32
,
F32
,
F32
>
,
std
::
tuple
<
BF16
,
BF16
,
F32
,
BF16
,
BF16
,
F32
>
,
std
::
tuple
<
F64
,
F64
,
F64
,
F64
,
F64
,
F64
>>
;
using
KernelTypes
=
::
testing
::
Types
<
#ifdef CK_ENABLE_FP16
std
::
tuple
<
F16
,
F16
,
F32
,
F16
,
F16
,
F32
>
#endif
#ifdef CK_ENABLE_FP32
,
std
::
tuple
<
F32
,
F32
,
F32
,
F32
,
F32
,
F32
>
#endif
#ifdef CK_ENABLE_BF16
,
std
::
tuple
<
BF16
,
BF16
,
F32
,
BF16
,
BF16
,
F32
>
#endif
#ifdef CK_ENABLE_FP64
,
std
::
tuple
<
F64
,
F64
,
F64
,
F64
,
F64
,
F64
>
#endif
>
;
TYPED_TEST_SUITE
(
TestBatchNormInferRank4
,
KernelTypes
);
...
...
test/conv_tensor_rearrange/CMakeLists.txt
0 → 100644
View file @
648f1f13
add_gtest_executable
(
test_conv_tensor_rearrange test_conv_tensor_rearrange.cpp
)
target_link_libraries
(
test_conv_tensor_rearrange PRIVATE utility device_image_to_column_instance device_column_to_image_instance
)
add_gtest_executable
(
test_conv_tensor_rearrange_interface test_conv_tensor_rearrange_interface.cpp
)
target_link_libraries
(
test_conv_tensor_rearrange_interface PRIVATE utility
)
test/
image_to_column/test_image_to_column
.cpp
→
test/
conv_tensor_rearrange/test_conv_tensor_rearrange
.cpp
View file @
648f1f13
// SPDX-License-Identifier: MIT
// Copyright (c)
2018-
2023, Advanced Micro Devices, Inc. All rights reserved.
// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
#include <cstdlib>
#include <iostream>
...
...
@@ -9,29 +9,29 @@
#include <gtest/gtest.h>
#include "profiler/profile_
image_to_column
_impl.hpp"
#include "profiler/profile_
conv_tensor_rearrange
_impl.hpp"
template
<
typename
Tuple
>
class
Test
ImageToColumn
:
public
::
testing
::
Test
class
Test
ConvTensorRearrange
:
public
::
testing
::
Test
{
protected:
using
InDataType
=
std
::
tuple_element_t
<
0
,
Tuple
>
;
using
OutDataType
=
std
::
tuple_element_t
<
1
,
Tuple
>
;
using
InLayout
=
std
::
tuple_element_t
<
2
,
Tuple
>
;
using
ImLayout
=
std
::
tuple_element_t
<
0
,
Tuple
>
;
using
ConvTensorRearrangeOp
=
std
::
tuple_element_t
<
1
,
Tuple
>
;
std
::
vector
<
ck
::
utils
::
conv
::
ConvParam
>
conv_params
;
template
<
ck
::
index_t
NDimSpatial
>
template
<
ck
::
index_t
NDimSpatial
,
typename
InDataType
,
typename
OutDataType
>
void
Run
()
{
EXPECT_FALSE
(
conv_params
.
empty
());
bool
pass
=
true
;
for
(
auto
&
param
:
conv_params
)
{
pass
=
pass
&&
ck
::
profiler
::
profile_image_to_column_impl
<
NDimSpatial
,
InLayout
,
InDataType
,
OutDataType
>
(
pass
=
pass
&&
ck
::
profiler
::
profile_conv_tensor_rearrange_impl
<
NDimSpatial
,
ImLayout
,
InDataType
,
OutDataType
,
ConvTensorRearrangeOp
>
(
true
,
// do_verification
1
,
// init_method: integer value
false
,
// do_log
...
...
@@ -43,48 +43,43 @@ class TestImageToColumn : public ::testing::Test
};
using
namespace
ck
::
tensor_layout
::
convolution
;
using
namespace
ck
::
conv_tensor_rearrange_op
;
using
KernelTypes1d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
float
,
GNWC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
ck
::
bhalf_t
,
GNWC
>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
GNWC
>
,
std
::
tuple
<
int8_t
,
int8_t
,
GNWC
>>
;
using
KernelTypes1d
=
::
testing
::
Types
<
std
::
tuple
<
GNWC
,
ImageToColumn
>
,
std
::
tuple
<
GNWC
,
ColumnToImage
>>
;
using
KernelTypes2d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
float
,
GNHWC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
ck
::
bhalf_t
,
GNHWC
>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
GNHWC
>
,
std
::
tuple
<
int8_t
,
int8_t
,
GNHWC
>>
;
using
KernelTypes2d
=
::
testing
::
Types
<
std
::
tuple
<
GNHWC
,
ImageToColumn
>
,
std
::
tuple
<
GNHWC
,
ColumnToImage
>>
;
using
KernelTypes3d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
float
,
GNDHWC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
ck
::
bhalf_t
,
GNDHWC
>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
GNDHWC
>
,
std
::
tuple
<
int8_t
,
int8_t
,
GNDHWC
>>
;
using
KernelTypes3d
=
::
testing
::
Types
<
std
::
tuple
<
GNDHWC
,
ImageToColumn
>
,
std
::
tuple
<
GNDHWC
,
ColumnToImage
>>
;
template
<
typename
Tuple
>
class
Test
ImageToColumn1d
:
public
TestImageToColumn
<
Tuple
>
class
Test
ConvTensorRearrange1d
:
public
TestConvTensorRearrange
<
Tuple
>
{
};
template
<
typename
Tuple
>
class
Test
ImageToColumn2d
:
public
TestImageToColumn
<
Tuple
>
class
Test
ConvTensorRearrange2d
:
public
TestConvTensorRearrange
<
Tuple
>
{
};
template
<
typename
Tuple
>
class
Test
ImageToColumn3d
:
public
TestImageToColumn
<
Tuple
>
class
Test
ConvTensorRearrange3d
:
public
TestConvTensorRearrange
<
Tuple
>
{
};
TYPED_TEST_SUITE
(
Test
ImageToColumn
1d
,
KernelTypes1d
);
TYPED_TEST_SUITE
(
Test
ImageToColumn
2d
,
KernelTypes2d
);
TYPED_TEST_SUITE
(
Test
ImageToColumn
3d
,
KernelTypes3d
);
TYPED_TEST_SUITE
(
Test
ConvTensorRearrange
1d
,
KernelTypes1d
);
TYPED_TEST_SUITE
(
Test
ConvTensorRearrange
2d
,
KernelTypes2d
);
TYPED_TEST_SUITE
(
Test
ConvTensorRearrange
3d
,
KernelTypes3d
);
TYPED_TEST
(
Test
ImageToColumn
1d
,
Test1D
)
TYPED_TEST
(
Test
ConvTensorRearrange
1d
,
Test1D
)
{
this
->
conv_params
.
clear
();
this
->
conv_params
.
push_back
({
1
,
1
,
4
,
1
,
192
,
{
3
},
{
28
},
{
1
},
{
1
},
{
1
},
{
1
}});
this
->
conv_params
.
push_back
({
1
,
1
,
64
,
1
,
64
,
{
3
},
{
14
},
{
1
},
{
1
},
{
1
},
{
1
}});
this
->
conv_params
.
push_back
({
1
,
1
,
64
,
1
,
64
,
{
1
},
{
7
},
{
2
},
{
1
},
{
0
},
{
0
}});
this
->
conv_params
.
push_back
({
1
,
1
,
64
,
1
,
64
,
{
1
},
{
7
},
{
3
},
{
1
},
{
0
},
{
0
}});
this
->
conv_params
.
push_back
({
1
,
1
,
64
,
1
,
64
,
{
1
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}});
// ScalarPerVector should be 1
this
->
conv_params
.
push_back
({
1
,
1
,
4
,
1
,
1
,
{
3
},
{
28
},
{
1
},
{
1
},
{
1
},
{
1
}});
...
...
@@ -92,10 +87,21 @@ TYPED_TEST(TestImageToColumn1d, Test1D)
this
->
conv_params
.
push_back
({
1
,
1
,
1
,
1
,
4
,
{
3
},
{
28
},
{
2
},
{
1
},
{
1
},
{
1
}});
// dilation != 1
this
->
conv_params
.
push_back
({
1
,
1
,
1
,
1
,
4
,
{
3
},
{
28
},
{
1
},
{
2
},
{
1
},
{
1
}});
this
->
template
Run
<
1
>();
#ifdef CK_ENABLE_FP32
this
->
template
Run
<
1
,
float
,
float
>();
#endif
#ifdef CK_ENABLE_BF16
this
->
template
Run
<
1
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>();
#endif
#ifdef CK_ENABLE_FP16
this
->
template
Run
<
1
,
ck
::
half_t
,
ck
::
half_t
>();
#endif
#ifdef CK_ENABLE_INT8
this
->
template
Run
<
1
,
int8_t
,
int8_t
>();
#endif
}
TYPED_TEST
(
Test
ImageToColumn
2d
,
Test2D
)
TYPED_TEST
(
Test
ConvTensorRearrange
2d
,
Test2D
)
{
this
->
conv_params
.
clear
();
...
...
@@ -103,19 +109,45 @@ TYPED_TEST(TestImageToColumn2d, Test2D)
{
2
,
1
,
4
,
1
,
192
,
{
3
,
3
},
{
28
,
28
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
conv_params
.
push_back
(
{
2
,
1
,
64
,
1
,
64
,
{
3
,
3
},
{
14
,
14
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
conv_params
.
push_back
({
2
,
1
,
64
,
1
,
64
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
this
->
conv_params
.
push_back
({
2
,
1
,
64
,
1
,
64
,
{
1
,
1
},
{
7
,
7
},
{
3
,
3
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
this
->
conv_params
.
push_back
({
2
,
1
,
64
,
1
,
64
,
{
1
,
1
},
{
3
,
3
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
this
->
template
Run
<
2
>();
this
->
conv_params
.
push_back
(
{
2
,
1
,
64
,
1
,
64
,
{
3
,
3
},
{
28
,
28
},
{
2
,
2
},
{
2
,
2
},
{
1
,
1
},
{
1
,
1
}});
#ifdef CK_ENABLE_FP32
this
->
template
Run
<
2
,
float
,
float
>();
#endif
#ifdef CK_ENABLE_BF16
this
->
template
Run
<
2
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>();
#endif
#ifdef CK_ENABLE_FP16
this
->
template
Run
<
2
,
ck
::
half_t
,
ck
::
half_t
>();
#endif
#ifdef CK_ENABLE_INT8
this
->
template
Run
<
2
,
int8_t
,
int8_t
>();
#endif
}
TYPED_TEST
(
Test
ImageToColumn
3d
,
Test3D
)
TYPED_TEST
(
Test
ConvTensorRearrange
3d
,
Test3D
)
{
this
->
conv_params
.
clear
();
this
->
conv_params
.
push_back
(
{
3
,
1
,
16
,
1
,
64
,
{
1
,
1
,
1
},
{
7
,
7
,
7
},
{
2
,
2
,
2
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
{
3
,
1
,
16
,
1
,
64
,
{
1
,
1
,
1
},
{
7
,
7
,
7
},
{
2
,
2
,
2
},
{
3
,
3
,
3
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
2
,
1
,
64
,
{
3
,
3
,
3
},
{
14
,
14
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
32
,
1
,
64
,
{
1
,
1
,
1
},
{
3
,
3
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
this
->
template
Run
<
3
>();
this
->
conv_params
.
push_back
(
{
3
,
1
,
64
,
1
,
64
,
{
3
,
3
,
3
},
{
14
,
14
,
14
},
{
2
,
2
,
2
},
{
2
,
2
,
2
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
#ifdef CK_ENABLE_FP32
this
->
template
Run
<
3
,
float
,
float
>();
#endif
#ifdef CK_ENABLE_BF16
this
->
template
Run
<
3
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>();
#endif
#ifdef CK_ENABLE_FP16
this
->
template
Run
<
3
,
ck
::
half_t
,
ck
::
half_t
>();
#endif
#ifdef CK_ENABLE_INT8
this
->
template
Run
<
3
,
int8_t
,
int8_t
>();
#endif
}
test/
image_to_column/test_image_to_column
_interface.cpp
→
test/
conv_tensor_rearrange/test_conv_tensor_rearrange
_interface.cpp
View file @
648f1f13
// SPDX-License-Identifier: MIT
// Copyright (c)
2018-
2023, Advanced Micro Devices, Inc. All rights reserved.
// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
#include <cstdlib>
#include <iostream>
...
...
@@ -10,6 +10,8 @@
#include "ck/ck.hpp"
#include "ck/tensor_operation/gpu/device/tensor_layout.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_image_to_column_impl.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_column_to_image_impl.hpp"
#include "ck/tensor_operation/gpu/device/conv_tensor_rearrange_op.hpp"
#include "ck/library/utility/convolution_parameter.hpp"
#include "ck/library/utility/algorithm.hpp"
...
...
@@ -18,28 +20,37 @@
#include <gtest/gtest.h>
using
DataType
=
float
;
using
I
n
Layout
=
ck
::
tensor_layout
::
convolution
::
GNWC
;
using
I
m
Layout
=
ck
::
tensor_layout
::
convolution
::
GNWC
;
template
<
ck
::
index_t
...
Is
>
using
S
=
ck
::
Sequence
<
Is
...
>
;
using
namespace
ck
::
conv_tensor_rearrange_op
;
template
<
ck
::
index_t
ScalarPerVector
,
bool
IsCPacked
>
class
Test
ImageToColumn
Interface
:
public
::
testing
::
Test
class
Test
ConvTensorRearrange
Interface
:
public
::
testing
::
Test
{
protected:
static
constexpr
ck
::
index_t
NDimSpatial
=
1
;
// clang-format off
using
DeviceImgToColInstance
=
ck
::
tensor_operation
::
device
::
DeviceImageToColumnImpl
//#####################| Num| InLayout| InDataType| OutDataType| Block| MPer| KPer| Thread| Scalar|
//#####################| Dim| | | | Size| Block| Block| Cluster| Per|
//#####################| Spatial| | | | | | | Lengths| Vector|
//#####################| | | | | | | | | |
<
NDimSpatial
,
InLayout
,
DataType
,
DataType
,
256
,
128
,
128
,
S
<
16
,
16
>
,
ScalarPerVector
>
;
// Num| ImLayout| InDataType| OutDataType| Block| MPer| KPer| Thread| Scalar|
// Dim| | | | Size| Block| Block| Cluster| Per|
// Spatial| | | | | | | Lengths| Vector|
// | | | | | | | | |
<
NDimSpatial
,
ImLayout
,
DataType
,
DataType
,
256
,
128
,
128
,
S
<
16
,
16
>
,
ScalarPerVector
>
;
using
DeviceColToimgInstance
=
ck
::
tensor_operation
::
device
::
DeviceColumnToImageImpl
// Num| ImLayout| InDataType| OutDataType| Block| MPer| KPer| Thread| Scalar|
// Dim| | | | Size| Block| Block| Cluster| Per|
// Spatial| | | | | | | Lengths| Vector|
// | | | | | | | | |
<
NDimSpatial
,
ImLayout
,
DataType
,
DataType
,
256
,
128
,
128
,
S
<
16
,
16
>
,
ScalarPerVector
>
;
// clang-format on
ck
::
utils
::
conv
::
ConvParam
conv_param
;
template
<
typename
ConvTensorRearrangeOp
>
bool
Run
()
{
...
...
@@ -57,10 +68,10 @@ class TestImageToColumnInterface : public ::testing::Test
ck
::
accumulate_n
<
ck
::
index_t
>
(
conv_param
.
filter_spatial_lengths_
.
begin
(),
NDimSpatial
,
1
,
std
::
multiplies
<>
());
const
auto
i
n
_desc
=
ck
::
utils
::
conv
::
make_input_host_tensor_descriptor_g_n_c_wis_packed
<
I
n
Layout
>
(
const
auto
i
mage
_desc
=
ck
::
utils
::
conv
::
make_input_host_tensor_descriptor_g_n_c_wis_packed
<
I
m
Layout
>
(
conv_param
);
const
auto
out
_desc
=
HostTensorDescriptor
({
NDoHoWo
,
CZYX
});
const
auto
gemm
_desc
=
HostTensorDescriptor
({
NDoHoWo
,
CZYX
});
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
input_spatial_lengths
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
filter_spatial_lengths
{};
...
...
@@ -77,120 +88,173 @@ class TestImageToColumnInterface : public ::testing::Test
copy
(
conv_param
.
input_spatial_lengths_
,
input_spatial_lengths
);
copy
(
conv_param
.
filter_spatial_lengths_
,
filter_spatial_lengths
);
copy
(
conv_param
.
output_spatial_lengths_
,
output_spatial_lengths
);
copy
(
i
n
_desc
.
GetStrides
(),
input_g_n_c_wis_strides
);
copy
(
out
_desc
.
GetStrides
(),
output_m_k_strides
);
copy
(
i
mage
_desc
.
GetStrides
(),
input_g_n_c_wis_strides
);
copy
(
gemm
_desc
.
GetStrides
(),
output_m_k_strides
);
copy
(
conv_param
.
conv_filter_strides_
,
conv_filter_strides
);
copy
(
conv_param
.
conv_filter_dilations_
,
conv_filter_dilations
);
copy
(
conv_param
.
input_left_pads_
,
input_left_pads
);
copy
(
conv_param
.
input_right_pads_
,
input_right_pads
);
auto
img2col
=
DeviceImgToColInstance
{};
auto
argument
=
img2col
.
MakeArgument
(
nullptr
,
nullptr
,
N
,
IsCPacked
?
C
:
FakeC
,
input_spatial_lengths
,
filter_spatial_lengths
,
output_spatial_lengths
,
input_g_n_c_wis_strides
,
output_m_k_strides
,
conv_filter_strides
,
conv_filter_dilations
,
input_left_pads
,
input_right_pads
);
return
img2col
.
IsSupportedArgument
(
argument
);
if
constexpr
(
std
::
is_same_v
<
ConvTensorRearrangeOp
,
ImageToColumn
>
)
{
auto
img2col
=
DeviceImgToColInstance
{};
auto
argument
=
img2col
.
MakeArgument
(
nullptr
,
nullptr
,
N
,
IsCPacked
?
C
:
FakeC
,
input_spatial_lengths
,
filter_spatial_lengths
,
output_spatial_lengths
,
input_g_n_c_wis_strides
,
output_m_k_strides
,
conv_filter_strides
,
conv_filter_dilations
,
input_left_pads
,
input_right_pads
);
return
img2col
.
IsSupportedArgument
(
argument
);
}
else
if
constexpr
(
std
::
is_same_v
<
ConvTensorRearrangeOp
,
ColumnToImage
>
)
{
auto
col2img
=
DeviceColToimgInstance
{};
auto
argument
=
col2img
.
MakeArgument
(
nullptr
,
nullptr
,
N
,
IsCPacked
?
C
:
FakeC
,
input_spatial_lengths
,
filter_spatial_lengths
,
output_spatial_lengths
,
input_g_n_c_wis_strides
,
output_m_k_strides
,
conv_filter_strides
,
conv_filter_dilations
,
input_left_pads
,
input_right_pads
);
return
col2img
.
IsSupportedArgument
(
argument
);
}
}
};
class
TestImageToColumnInterface1ScalarPerVector
:
public
TestImageToColumnInterface
<
1
,
true
>
class
TestConvTensorRearrangeInterface1ScalarPerVector
:
public
TestConvTensorRearrangeInterface
<
1
,
true
>
{
};
class
TestImageToColumnInterface4ScalarPerVector
:
public
TestImageToColumnInterface
<
4
,
true
>
class
TestConvTensorRearrangeInterface4ScalarPerVector
:
public
TestConvTensorRearrangeInterface
<
4
,
true
>
{
};
class
TestImageToColumnInterface4ScalarPerVectorFakeC
:
public
TestImageToColumnInterface
<
4
,
false
>
class
TestConvTensorRearrangeInterface4ScalarPerVectorFakeC
:
public
TestConvTensorRearrangeInterface
<
4
,
false
>
{
};
TEST_F
(
Test
ImageToColumn
Interface1ScalarPerVector
,
X1ScalarPerVector
)
TEST_F
(
Test
ConvTensorRearrange
Interface1ScalarPerVector
,
X1ScalarPerVector
)
{
// vector load C * X % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
3
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}};
bool
is_supported
=
this
->
Run
();
bool
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// vector load C * left_pad_x % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
1
},
{
3
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// vector load C * right_pad_x % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
1
},
{
0
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// vector load C % ScalarPerVector, right_pad and stride
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
2
},
{
1
},
{
0
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// vector load C % ScalarPerVector, left_pad and stride
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
2
},
{
1
},
{
3
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// vector load C % ScalarPerVector, dilation
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
2
},
{
0
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
// C = 4
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
4
,
{
3
},
{
3
},
{
1
},
{
1
},
{
3
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
}
TEST_F
(
Test
ImageToColumn
Interface4ScalarPerVector
,
X4ScalarPerVector
)
TEST_F
(
Test
ConvTensorRearrange
Interface4ScalarPerVector
,
X4ScalarPerVector
)
{
// vector load C * X % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
3
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}};
bool
is_supported
=
this
->
Run
();
bool
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// vector load C * left_pad_x % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
1
},
{
3
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// vector load C * right_pad_x % ScalarPerVector
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
1
},
{
0
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// vector load C % ScalarPerVector, right_pad and stride
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
2
},
{
1
},
{
0
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// vector load C % ScalarPerVector, left_pad and stride
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
2
},
{
1
},
{
3
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// vector load C % ScalarPerVector, dilation
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
1
,
{
4
},
{
3
},
{
1
},
{
2
},
{
0
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// C = 4
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
4
,
{
3
},
{
3
},
{
1
},
{
1
},
{
3
},
{
3
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
}
TEST_F
(
Test
ImageToColumn
Interface4ScalarPerVectorFakeC
,
X4ScalarPerVectorFakeC
)
TEST_F
(
Test
ConvTensorRearrange
Interface4ScalarPerVectorFakeC
,
X4ScalarPerVectorFakeC
)
{
// C = 3
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
3
,
{
4
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}};
bool
is_supported
=
this
->
Run
();
bool
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_FALSE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_FALSE
(
is_supported
);
// C = 4
this
->
conv_param
=
{
1
,
1
,
1
,
1
,
8
,
{
4
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}};
is_supported
=
this
->
Run
();
is_supported
=
this
->
template
Run
<
ImageToColumn
>();
EXPECT_TRUE
(
is_supported
);
is_supported
=
this
->
template
Run
<
ColumnToImage
>();
EXPECT_TRUE
(
is_supported
);
}
test/data_type/CMakeLists.txt
View file @
648f1f13
if
(
USE_BITINT_EXTENSION_INT4
)
add_gtest_executable
(
test_int4 int4.cpp
)
target_link_libraries
(
test_int4 PRIVATE utility
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_int4 PRIVATE utility
)
endif
()
endif
()
if
(
DTYPES MATCHES
"fp8"
OR NOT DEFINED DTYPES
)
add_gtest_executable
(
test_f8 f8.cpp
)
target_link_libraries
(
test_f8 PRIVATE utility
)
add_gtest_executable
(
test_fp8 fp8.cpp
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_f
p
8 PRIVATE utility
)
endif
()
if
(
DTYPES MATCHES
"bf8"
OR NOT DEFINED DTYPES
)
add_gtest_executable
(
test_bf8 bf8.cpp
)
add_gtest_executable
(
test_bf8 bf8.cpp
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_bf8 PRIVATE utility
)
endif
()
add_gtest_executable
(
test_type_convert_const type_convert_const.cpp
)
test/data_type/f8.cpp
→
test/data_type/f
p
8.cpp
View file @
648f1f13
File moved
test/data_type/type_convert_const.cpp
0 → 100644
View file @
648f1f13
// SPDX-License-Identifier: MIT
// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
#include "gtest/gtest.h"
#include "ck/utility/data_type.hpp"
#include "ck/utility/type_convert.hpp"
using
ck
::
bhalf_t
;
using
ck
::
type_convert
;
TEST
(
TypeConvertConst
,
ConvertToConst
)
{
constexpr
float
bf16_epsilon
=
0.0078125
;
constexpr
float
rel_tol
=
2
*
bf16_epsilon
;
const
std
::
vector
<
float
>
cases
=
{
0.0
,
-
123.
f
,
3.981323
f
,
0.2429
f
};
for
(
float
x
:
cases
)
{
const
float
abs_tol
=
std
::
abs
(
rel_tol
*
x
);
{
bhalf_t
y
=
type_convert
<
bhalf_t
>
(
x
);
// Test non-const bhalf to const float.
const
float
y_float
=
type_convert
<
const
float
>
(
y
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
{
// Test non-const float to const bhalf.
const
bhalf_t
y
=
type_convert
<
const
bhalf_t
>
(
x
);
// Remove the constness manually to not rely on const casts anymore since the
// possible issue could hide after two casts.
bhalf_t
&
y_nonconst
=
const_cast
<
bhalf_t
&>
(
y
);
float
y_float
=
type_convert
<
float
>
(
y_nonconst
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
}
}
TEST
(
TypeConvertConst
,
ConvertFromConst
)
{
constexpr
float
bf16_epsilon
=
0.0078125
;
constexpr
float
rel_tol
=
2
*
bf16_epsilon
;
const
std
::
vector
<
float
>
cases
=
{
0.0
,
-
123.
f
,
3.981323
f
,
0.2429
f
};
for
(
const
float
x
:
cases
)
{
const
float
abs_tol
=
std
::
abs
(
rel_tol
*
x
);
{
// Test const float to const bhalf_t.
const
bhalf_t
y
=
type_convert
<
const
bhalf_t
>
(
x
);
// Remove the constness manually to not rely on const casts anymore since the
// possible issue could hide after two casts.
bhalf_t
&
y_nonconst
=
const_cast
<
bhalf_t
&>
(
y
);
float
y_float
=
type_convert
<
float
>
(
y_nonconst
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
{
// Test const float to non-const bhalf.
bhalf_t
y
=
type_convert
<
bhalf_t
>
(
x
);
float
y_float
=
type_convert
<
float
>
(
y
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
{
const
bhalf_t
y
=
type_convert
<
const
bhalf_t
>
(
x
);
// Test const bhalf to non-const float.
float
y_float
=
type_convert
<
float
>
(
y
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
// Tests with full type specializations for X.
{
// Test const float to const bhalf_t.
const
bhalf_t
y
=
type_convert
<
const
bhalf_t
,
const
float
>
(
x
);
// Remove the constness manually to not rely on const casts anymore since the
// possible issue could hide after two casts.
bhalf_t
&
y_nonconst
=
const_cast
<
bhalf_t
&>
(
y
);
float
y_float
=
type_convert
<
float
>
(
y_nonconst
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
{
// Test const float to non-const bhalf.
bhalf_t
y
=
type_convert
<
bhalf_t
,
const
float
>
(
x
);
float
y_float
=
type_convert
<
float
>
(
y
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
{
const
bhalf_t
y
=
type_convert
<
const
bhalf_t
,
const
float
>
(
x
);
// Test const bhalf to non-const float.
float
y_float
=
type_convert
<
float
,
const
bhalf_t
>
(
y
);
ASSERT_NEAR
(
y_float
,
x
,
abs_tol
);
}
}
}
test/elementwise_normalization/CMakeLists.txt
View file @
648f1f13
if
(
DTYPES MATCHES
"fp16"
OR NOT DEFINED DTYPES
)
add_
custom_target
(
test_elementwise_
normalization
)
add_gtest_executable
(
test_elementwise_layernorm_fp16 test_elementwise_layernorm_fp16.cpp
)
add_custom_target
(
test_elementwise_normalization
)
add_
gtest_executable
(
test_elementwise_
layernorm_fp16 test_elementwise_layernorm_fp16.cpp
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_elementwise_layernorm_fp16 PRIVATE utility device_elementwise_normalization_instance
)
add_dependencies
(
test_elementwise_normalization test_elementwise_layernorm_fp16
)
endif
()
\ No newline at end of file
test/gemm/CMakeLists.txt
View file @
648f1f13
if
(
DTYPES MATCHES
"fp32"
OR NOT DEFINED DTYPES
)
add_test_executable
(
test_gemm_fp32 gemm_fp32.cpp
)
target_link_libraries
(
test_gemm_fp32 PRIVATE utility
)
target_link_libraries
(
test_gemm_fp32 PRIVATE device_gemm_instance
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_fp32 PRIVATE
utility
device_gemm_instance
)
endif
()
if
(
DTYPES MATCHES
"fp16"
OR NOT DEFINED DTYPES
)
add_test_executable
(
test_gemm_fp16 gemm_fp16.cpp
)
target_link_libraries
(
test_gemm_fp16 PRIVATE utility
)
target_link_libraries
(
test_gemm_fp16 PRIVATE device_gemm_instance
)
add_library
(
gemm_standalone_xdl_fp16_instances STATIC
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_fp16 PRIVATE
utility
device_gemm_instance
)
add_library
(
gemm_standalone_xdl_fp16_instances STATIC
instance/gemm_f16_nn_instance.cpp
instance/gemm_f16_nt_instance.cpp
instance/gemm_f16_tn_instance.cpp
instance/gemm_wavelet_f16_tn_instance.cpp
instance/gemm_f16_tt_instance.cpp
)
)
endif
()
add_test_executable
(
test_gemm_standalone_xdl_fp16 gemm_standalone_xdl_fp16.cpp
)
target_link_libraries
(
test_gemm_standalone_xdl_fp16 PRIVATE gemm_standalone_xdl_fp16_instances utility
)
target_include_directories
(
test_gemm_standalone_xdl_fp16 PRIVATE instance/
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_standalone_xdl_fp16 PRIVATE gemm_standalone_xdl_fp16_instances utility
)
target_include_directories
(
test_gemm_standalone_xdl_fp16 PRIVATE instance/
)
endif
()
if
(
DTYPES MATCHES
"bf16"
OR NOT DEFINED DTYPES
)
add_test_executable
(
test_gemm_bf16 gemm_bf16.cpp
)
target_link_libraries
(
test_gemm_bf16 PRIVATE utility
)
target_link_libraries
(
test_gemm_bf16 PRIVATE device_gemm_instance
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_bf16 PRIVATE
utility
device_gemm_instance
)
endif
()
if
(
DTYPES MATCHES
"int8"
OR NOT DEFINED DTYPES
)
add_test_executable
(
test_gemm_int8 gemm_int8.cpp
)
target_link_libraries
(
test_gemm_int8 PRIVATE utility
)
target_link_libraries
(
test_gemm_int8 PRIVATE device_gemm_instance
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_int8 PRIVATE
utility
device_gemm_instance
)
endif
()
\ No newline at end of file
test/gemm_layernorm/CMakeLists.txt
View file @
648f1f13
...
...
@@ -2,12 +2,12 @@ list(APPEND gpu_list gfx908 gfx90a gfx940 gfx941 gfx942)
set
(
target 0
)
foreach
(
gpu IN LISTS GPU_TARGETS
)
if
(
gpu IN_LIST gpu_list AND target EQUAL 0
)
if
(
DTYPES MATCHES
"fp16"
OR NOT DEFINED DTYPES
)
add_custom_target
(
test_gemm_layernorm
)
add_gtest_executable
(
test_gemm_add_relu_add_layernorm_fp16 test_gemm_add_relu_add_layernorm_fp16.cpp
)
target_link_libraries
(
test_gemm_add_relu_add_layernorm_fp16 PRIVATE utility device_gemm_add_relu_add_layernorm_instance
)
add_dependencies
(
test_gemm_layernorm test_gemm_add_relu_add_layernorm_fp16
)
set
(
target 1
)
endif
()
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_add_relu_add_layernorm_fp16 PRIVATE utility device_gemm_add_relu_add_layernorm_instance
)
add_dependencies
(
test_gemm_layernorm test_gemm_add_relu_add_layernorm_fp16
)
set
(
target 1
)
endif
()
endif
()
endforeach
()
test/gemm_reduce/CMakeLists.txt
View file @
648f1f13
if
(
DTYPES MATCHES
"fp16"
OR NOT DEFINED DTYPES
)
add_test_executable
(
test_gemm_reduce_fp16 gemm_reduce_fp16.cpp
)
target_link_libraries
(
test_gemm_reduce_fp16 PRIVATE utility
)
target_link_libraries
(
test_gemm_reduce_fp16 PRIVATE device_gemm_reduce_instance
)
add_test_executable
(
test_gemm_reduce_fp16 gemm_reduce_fp16.cpp
)
if
(
result EQUAL 0
)
target_link_libraries
(
test_gemm_reduce_fp16 PRIVATE utility device_gemm_reduce_instance
)
endif
()
\ No newline at end of file
test/gemm_split_k/test_gemm_splitk_ut_cases.inc
View file @
648f1f13
...
...
@@ -2,7 +2,7 @@
TYPED_TEST
(
TestGemmSplitK_MK_KN
,
SmallM
)
{
std
::
vector
<
int
>
Ms
{
0
,
1
,
2
,
3
,
4
,
5
,
6
};
std
::
vector
<
int
>
Ms
{
1
,
2
,
3
,
4
,
5
,
6
};
constexpr
int
N
=
512
;
constexpr
int
K
=
320
;
...
...
@@ -16,7 +16,7 @@ TYPED_TEST(TestGemmSplitK_MK_KN, SmallM)
TYPED_TEST
(
TestGemmSplitK_MK_NK
,
SmallM
)
{
std
::
vector
<
int
>
Ms
{
0
,
1
,
2
,
3
,
4
,
5
,
6
};
std
::
vector
<
int
>
Ms
{
1
,
2
,
3
,
4
,
5
,
6
};
constexpr
int
N
=
512
;
constexpr
int
K
=
320
;
...
...
@@ -30,7 +30,7 @@ TYPED_TEST(TestGemmSplitK_MK_NK, SmallM)
TYPED_TEST
(
TestGemmSplitK_KM_KN
,
SmallM
)
{
std
::
vector
<
int
>
Ms
{
0
,
1
,
2
,
3
,
4
,
5
,
6
};
std
::
vector
<
int
>
Ms
{
1
,
2
,
3
,
4
,
5
,
6
};
constexpr
int
N
=
512
;
constexpr
int
K
=
320
;
...
...
@@ -43,7 +43,7 @@ TYPED_TEST(TestGemmSplitK_KM_KN, SmallM)
TYPED_TEST
(
TestGemmSplitK_KM_NK
,
SmallM
)
{
std
::
vector
<
int
>
Ms
{
0
,
1
,
2
,
3
,
4
,
5
,
6
};
std
::
vector
<
int
>
Ms
{
1
,
2
,
3
,
4
,
5
,
6
};
constexpr
int
N
=
512
;
constexpr
int
K
=
320
;
...
...
test/grouped_convnd_bwd_data/CMakeLists.txt
View file @
648f1f13
if
(
GPU_TARGETS MATCHES
"gfx908"
OR GPU_TARGETS MATCHES
"gfx90a"
OR GPU_TARGETS MATCHES
"gfx940"
)
add_gtest_executable
(
test_grouped_convnd_bwd_data test_grouped_convnd_bwd_data.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data PRIVATE utility device_grouped_conv2d_bwd_data_instance device_grouped_conv3d_bwd_data_instance
)
add_gtest_executable
(
test_grouped_convnd_bwd_data_interface test_grouped_convnd_bwd_data_interface.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data_interface PRIVATE utility device_grouped_conv2d_bwd_data_instance
)
endif
()
\ No newline at end of file
list
(
APPEND gpu_list_xdl gfx908 gfx90a gfx940
)
list
(
APPEND gpu_list_wmma gfx1100 gfx1101 gfx1102
)
set
(
target 0
)
foreach
(
gpu IN LISTS GPU_TARGETS
)
if
(
gpu IN_LIST gpu_list_xdl AND target EQUAL 0
)
add_gtest_executable
(
test_grouped_convnd_bwd_data test_grouped_convnd_bwd_data.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data PRIVATE utility device_grouped_conv2d_bwd_data_instance device_grouped_conv3d_bwd_data_instance
)
add_gtest_executable
(
test_grouped_convnd_bwd_data_interface test_grouped_convnd_bwd_data_interface_xdl.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data_interface PRIVATE utility device_grouped_conv2d_bwd_data_instance
)
set
(
target 1
)
endif
()
if
(
gpu IN_LIST gpu_list_wmma AND target EQUAL 0
)
add_gtest_executable
(
test_grouped_convnd_bwd_data test_grouped_convnd_bwd_data.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data PRIVATE utility device_grouped_conv2d_bwd_data_instance device_grouped_conv3d_bwd_data_instance
)
add_gtest_executable
(
test_grouped_convnd_bwd_data_interface test_grouped_convnd_bwd_data_interface_wmma.cpp
)
target_link_libraries
(
test_grouped_convnd_bwd_data_interface PRIVATE utility device_grouped_conv2d_bwd_data_instance
)
set
(
target 1
)
endif
()
endforeach
()
\ No newline at end of file
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data.cpp
View file @
648f1f13
...
...
@@ -51,16 +51,20 @@ using namespace ck::tensor_layout::convolution;
using
KernelTypes2d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
GNHWK
,
GKYXC
,
GNHWC
>
,
std
::
tuple
<
ck
::
half_t
,
GNHWK
,
GKYXC
,
GNHWC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
GNHWK
,
GKYXC
,
GNHWC
>
,
std
::
tuple
<
int8_t
,
GNHWK
,
GKYXC
,
GNHWC
>
,
std
::
tuple
<
float
,
NHWGK
,
GKYXC
,
NHWGC
>
,
std
::
tuple
<
ck
::
half_t
,
NHWGK
,
GKYXC
,
NHWGC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
NHWGK
,
GKYXC
,
NHWGC
>>
;
std
::
tuple
<
ck
::
bhalf_t
,
NHWGK
,
GKYXC
,
NHWGC
>
,
std
::
tuple
<
int8_t
,
NHWGK
,
GKYXC
,
NHWGC
>>
;
using
KernelTypes3d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
GNDHWK
,
GKZYXC
,
GNDHWC
>
,
std
::
tuple
<
ck
::
half_t
,
GNDHWK
,
GKZYXC
,
GNDHWC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
GNDHWK
,
GKZYXC
,
GNDHWC
>
,
std
::
tuple
<
int8_t
,
GNDHWK
,
GKZYXC
,
GNDHWC
>
,
std
::
tuple
<
float
,
NDHWGK
,
GKZYXC
,
NDHWGC
>
,
std
::
tuple
<
ck
::
half_t
,
NDHWGK
,
GKZYXC
,
NDHWGC
>
,
std
::
tuple
<
ck
::
bhalf_t
,
NDHWGK
,
GKZYXC
,
NDHWGC
>>
;
std
::
tuple
<
ck
::
bhalf_t
,
NDHWGK
,
GKZYXC
,
NDHWGC
>
,
std
::
tuple
<
int8_t
,
NDHWGK
,
GKZYXC
,
NDHWGC
>>
;
template
<
typename
Tuple
>
class
TestGroupedConvndBwdData2d
:
public
TestGroupedConvndBwdData
<
Tuple
>
...
...
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data_interface_wmma.cpp
0 → 100644
View file @
648f1f13
// SPDX-License-Identifier: MIT
// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
#include <cstdlib>
#include <iostream>
#include <initializer_list>
#include <tuple>
#include <vector>
#include "ck/ck.hpp"
#include "ck/tensor_operation/gpu/device/convolution_backward_data_specialization.hpp"
#include "ck/tensor_operation/gpu/device/tensor_layout.hpp"
#include "ck/tensor_operation/gpu/element/element_wise_operation.hpp"
#include "ck/tensor_operation/gpu/device/impl/device_grouped_conv_bwd_data_multiple_d_wmma_cshuffle.hpp"
#include "ck/library/utility/convolution_parameter.hpp"
#include "ck/library/utility/algorithm.hpp"
#include "ck/library/utility/convolution_host_tensor_descriptor_helper.hpp"
#include <gtest/gtest.h>
using
DataType
=
ck
::
half_t
;
using
AccDataType
=
float
;
using
Pass
=
ck
::
tensor_operation
::
element_wise
::
PassThrough
;
template
<
ck
::
index_t
...
Is
>
using
S
=
ck
::
Sequence
<
Is
...
>
;
using
ConvBackwardDataSpecialization
=
ck
::
tensor_operation
::
device
::
ConvolutionBackwardDataSpecialization
;
static
constexpr
auto
ConvBwdDataDefault
=
ConvBackwardDataSpecialization
::
Default
;
static
constexpr
auto
Filter1x1Stride1Pad0
=
ConvBackwardDataSpecialization
::
Filter1x1Stride1Pad0
;
template
<
typename
Tuple
,
ConvBackwardDataSpecialization
ConvSpec
>
class
TestGroupedConvndBwdData
:
public
::
testing
::
Test
{
protected:
static
constexpr
ck
::
index_t
NDimSpatial
=
2
;
using
OutLayout
=
std
::
tuple_element_t
<
0
,
Tuple
>
;
using
WeiLayout
=
std
::
tuple_element_t
<
1
,
Tuple
>
;
using
InLayout
=
std
::
tuple_element_t
<
2
,
Tuple
>
;
// clang-format off
using
GroupedConvBwdDataDeviceInstance
=
ck
::
tensor_operation
::
device
::
DeviceGroupedConvBwdDataMultipleD_Wmma_CShuffle
//| NumDim| A| B| Ds| E| AData| BData| AccData| CShuffle| DsData| EData| A| B| CDE| ConvForward| Block| MPer| NPer| K0Per| K1| MPer| NPer| MRepeat| NRepeat| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockLds| BBlockTransfer| BBlockTransfer| BBlockTransfer| BlockTransfer| BBlockTransfer| BBlockTransfer| BBlockLds| CShuffle| CShuffle| CBlockTransferClusterLengths| CBlockTransfer|
//| Spatial| Layout| Layout| Layout| Layout| Type| Type| Type| DataType| Type| Type| Elementwise| Elementwise| Elementwise| Specialization| Size| Block| Block| Block| | WMMA| WMMA| | | ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraM| ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraN| MXdlPerWave| NXdlPerWave| _MBlock_MWaveMPerXdl| ScalarPerVector|
//| | | | | | | | | | | | Operation| Operation| Operation| | | | | | | | | | | Lengths_K0_M_K1| ArrangeOrder| | | PerVector| PerVector_K1| | Lengths_K0_N_K1| ArrangeOrder| | | PerVector| PerVector_K1| | PerShuffle| PerShuffle| _NBlock_NWaveNPerXdl| _NWaveNPerXdl|
//| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
<
NDimSpatial
,
OutLayout
,
WeiLayout
,
ck
::
Tuple
<>
,
InLayout
,
DataType
,
DataType
,
AccDataType
,
DataType
,
ck
::
Tuple
<>
,
DataType
,
Pass
,
Pass
,
Pass
,
ConvSpec
,
64
,
32
,
64
,
8
,
8
,
16
,
16
,
1
,
4
,
S
<
4
,
16
,
1
>
,
S
<
1
,
0
,
2
>
,
S
<
1
,
0
,
2
>
,
2
,
8
,
8
,
1
,
S
<
8
,
8
,
1
>
,
S
<
0
,
2
,
1
>
,
S
<
0
,
2
,
1
>
,
1
,
8
,
8
,
1
,
1
,
1
,
S
<
1
,
32
,
1
,
2
>
,
8
>
;
// clang-format on
ck
::
utils
::
conv
::
ConvParam
conv_param
;
template
<
ck
::
index_t
NDimSpatial
>
bool
Run
()
{
const
auto
out_g_n_k_wos_desc
=
ck
::
utils
::
conv
::
make_output_host_tensor_descriptor_g_n_k_wos_packed
<
OutLayout
>
(
conv_param
);
const
auto
wei_g_k_c_xs_desc
=
ck
::
utils
::
conv
::
make_weight_host_tensor_descriptor_g_k_c_xs_packed
<
WeiLayout
>
(
conv_param
);
const
auto
in_g_n_c_wis_desc
=
ck
::
utils
::
conv
::
make_input_host_tensor_descriptor_g_n_c_wis_packed
<
InLayout
>
(
conv_param
);
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
out_lengths
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
out_strides
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
wei_lengths
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
wei_strides
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
in_lengths
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
+
3
>
in_strides
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
conv_filter_strides
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
conv_filter_dilations
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
input_left_pads
{};
std
::
array
<
ck
::
index_t
,
NDimSpatial
>
input_right_pads
{};
auto
copy
=
[](
const
auto
&
x
,
auto
&
y
)
{
ck
::
ranges
::
copy
(
x
,
y
.
begin
());
};
copy
(
out_g_n_k_wos_desc
.
GetLengths
(),
out_lengths
);
copy
(
out_g_n_k_wos_desc
.
GetStrides
(),
out_strides
);
copy
(
wei_g_k_c_xs_desc
.
GetLengths
(),
wei_lengths
);
copy
(
wei_g_k_c_xs_desc
.
GetStrides
(),
wei_strides
);
copy
(
in_g_n_c_wis_desc
.
GetLengths
(),
in_lengths
);
copy
(
in_g_n_c_wis_desc
.
GetStrides
(),
in_strides
);
copy
(
conv_param
.
conv_filter_strides_
,
conv_filter_strides
);
copy
(
conv_param
.
conv_filter_dilations_
,
conv_filter_dilations
);
copy
(
conv_param
.
input_left_pads_
,
input_left_pads
);
copy
(
conv_param
.
input_right_pads_
,
input_right_pads
);
auto
conv
=
GroupedConvBwdDataDeviceInstance
{};
auto
argument
=
conv
.
MakeArgument
(
nullptr
,
nullptr
,
std
::
array
<
const
void
*
,
0
>
{},
nullptr
,
out_lengths
,
out_strides
,
wei_lengths
,
wei_strides
,
{},
{},
in_lengths
,
in_strides
,
conv_filter_strides
,
conv_filter_dilations
,
input_left_pads
,
input_right_pads
,
Pass
{},
Pass
{},
Pass
{});
return
conv
.
IsSupportedArgument
(
argument
);
}
};
using
GNHWC
=
ck
::
tensor_layout
::
convolution
::
GNHWC
;
using
NHWGC
=
ck
::
tensor_layout
::
convolution
::
NHWGC
;
using
GKYXC
=
ck
::
tensor_layout
::
convolution
::
GKYXC
;
using
GNHWK
=
ck
::
tensor_layout
::
convolution
::
GNHWK
;
using
NHWGK
=
ck
::
tensor_layout
::
convolution
::
NHWGK
;
using
KernelTypes
=
::
testing
::
Types
<
std
::
tuple
<
GNHWK
,
GKYXC
,
GNHWC
>
,
std
::
tuple
<
NHWGK
,
GKYXC
,
NHWGC
>>
;
template
<
typename
Tuple
>
class
TestGroupedConvndBwdDataDefault
:
public
TestGroupedConvndBwdData
<
Tuple
,
ConvBwdDataDefault
>
{
};
template
<
typename
Tuple
>
class
TestGroupedConvndBwdDataFilter1x1
:
public
TestGroupedConvndBwdData
<
Tuple
,
Filter1x1Stride1Pad0
>
{
};
TYPED_TEST_SUITE
(
TestGroupedConvndBwdDataDefault
,
KernelTypes
);
TYPED_TEST_SUITE
(
TestGroupedConvndBwdDataFilter1x1
,
KernelTypes
);
TYPED_TEST
(
TestGroupedConvndBwdDataFilter1x1
,
SpecializationCheck
)
{
// Check filter 3,3 instead of 1,1
this
->
conv_param
=
{
2
,
2
,
4
,
192
,
192
,
{
3
,
3
},
{
28
,
28
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}};
bool
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_FALSE
(
is_supported
);
// Check strides 2,2 instead of 1,1
this
->
conv_param
=
{
2
,
2
,
4
,
192
,
192
,
{
1
,
1
},
{
28
,
28
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}};
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_FALSE
(
is_supported
);
// Check with pad
this
->
conv_param
=
{
2
,
2
,
4
,
192
,
192
,
{
1
,
1
},
{
28
,
28
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}};
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_FALSE
(
is_supported
);
// Supported version
this
->
conv_param
=
{
2
,
2
,
4
,
192
,
192
,
{
1
,
1
},
{
28
,
28
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}};
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_TRUE
(
is_supported
);
}
TYPED_TEST
(
TestGroupedConvndBwdDataDefault
,
VectorLoadCheck
)
{
// vector load for A
this
->
conv_param
=
{
2
,
2
,
128
,
129
,
256
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}};
bool
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_FALSE
(
is_supported
);
// vector load for B, E, Ds
this
->
conv_param
=
{
2
,
2
,
128
,
128
,
257
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}};
is_supported
=
this
->
template
Run
<
2
>();
EXPECT_FALSE
(
is_supported
);
}
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data_interface.cpp
→
test/grouped_convnd_bwd_data/test_grouped_convnd_bwd_data_interface
_xdl
.cpp
View file @
648f1f13
File moved
test/grouped_convnd_bwd_weight/test_grouped_convnd_bwd_weight.cpp
View file @
648f1f13
...
...
@@ -14,6 +14,8 @@
#include "profiler/profile_grouped_conv_bwd_weight_impl.hpp"
using
namespace
ck
::
tensor_layout
::
convolution
;
template
<
typename
Tuple
>
class
TestGroupedConvndBwdWeight
:
public
::
testing
::
Test
{
...
...
@@ -27,28 +29,59 @@ class TestGroupedConvndBwdWeight : public ::testing::Test
using
NDimSpatial
=
std
::
tuple_element_t
<
6
,
Tuple
>
;
std
::
vector
<
ck
::
utils
::
conv
::
ConvParam
>
conv_params
;
ck
::
index_t
split_k
{
2
};
std
::
vector
<
ck
::
index_t
>
split_ks
{
1
,
2
};
bool
skip_case
(
const
ck
::
utils
::
conv
::
ConvParam
&
params
,
const
ck
::
index_t
split_k
)
{
// Odd K or C values are supported only by DL kernel (only applies to fp16)
// DL kernel currently supports only `split_k=1`
if
constexpr
(
std
::
is_same_v
<
InDataType
,
ck
::
half_t
>
)
{
if
(
split_k
!=
1
&&
(
params
.
K_
%
2
!=
0
||
params
.
C_
%
2
!=
0
))
{
return
true
;
}
}
// 1d NWGC is only supported by DL kernel
// DL kernel is only supported for split_k=1
if
constexpr
(
std
::
is_same_v
<
InLayout
,
NWGC
>
&&
std
::
is_same_v
<
OutLayout
,
NWGK
>
)
{
if
(
split_k
!=
1
)
{
return
true
;
}
}
return
false
;
}
void
Run
()
{
EXPECT_FALSE
(
conv_params
.
empty
());
bool
pass
=
true
;
for
(
auto
&
param
:
conv_param
s
)
for
(
auto
split_k
:
split_k
s
)
{
pass
=
pass
&&
ck
::
profiler
::
profile_grouped_conv_bwd_weight_impl
<
NDimSpatial
{},
InLayout
,
WeiLayout
,
OutLayout
,
InDataType
,
WeiDataType
,
OutDataType
>
(
true
,
// do_verification
1
,
// init_method: integer value
false
,
// do_log
false
,
// time_kernel
param
,
split_k
);
for
(
auto
&
param
:
conv_params
)
{
if
(
!
skip_case
(
param
,
split_k
))
{
pass
=
pass
&&
ck
::
profiler
::
profile_grouped_conv_bwd_weight_impl
<
NDimSpatial
{},
InLayout
,
WeiLayout
,
OutLayout
,
InDataType
,
WeiDataType
,
OutDataType
>
(
true
,
// do_verification
1
,
// init_method: integer value
false
,
// do_log
false
,
// time_kernel
param
,
split_k
);
}
}
}
EXPECT_TRUE
(
pass
);
}
...
...
@@ -69,12 +102,13 @@ class TestGroupedConvndBwdWeight3d : public TestGroupedConvndBwdWeight<Tuple>
{
};
using
namespace
ck
::
tensor_layout
::
convolution
;
using
KernelTypes1d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
float
,
float
,
GNWC
,
GKXC
,
GNWK
,
ck
::
Number
<
1
>>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
,
GNWC
,
GKXC
,
GNWK
,
ck
::
Number
<
1
>>
,
std
::
tuple
<
ck
::
bhalf_t
,
float
,
ck
::
bhalf_t
,
GNWC
,
GKXC
,
GNWK
,
ck
::
Number
<
1
>>>
;
std
::
tuple
<
ck
::
bhalf_t
,
float
,
ck
::
bhalf_t
,
GNWC
,
GKXC
,
GNWK
,
ck
::
Number
<
1
>>
,
std
::
tuple
<
float
,
float
,
float
,
NWGC
,
GKXC
,
NWGK
,
ck
::
Number
<
1
>>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
,
NWGC
,
GKXC
,
NWGK
,
ck
::
Number
<
1
>>
,
std
::
tuple
<
ck
::
bhalf_t
,
float
,
ck
::
bhalf_t
,
NWGC
,
GKXC
,
NWGK
,
ck
::
Number
<
1
>>>
;
using
KernelTypes2d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
float
,
float
,
GNHWC
,
GKYXC
,
GNHWK
,
ck
::
Number
<
2
>>
,
std
::
tuple
<
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
,
GNHWC
,
GKYXC
,
GNHWK
,
ck
::
Number
<
2
>>
,
...
...
test/grouped_convnd_fwd/CMakeLists.txt
View file @
648f1f13
add_gtest_executable
(
test_grouped_convnd_fwd grouped_convnd_fwd.cpp
)
add_gtest_executable
(
test_grouped_convnd_fwd
test_
grouped_convnd_fwd.cpp
)
target_link_libraries
(
test_grouped_convnd_fwd PRIVATE utility device_grouped_conv1d_fwd_instance device_grouped_conv2d_fwd_instance device_grouped_conv3d_fwd_instance
)
test/grouped_convnd_fwd/grouped_convnd_fwd.cpp
deleted
100644 → 0
View file @
4e5190f5
// SPDX-License-Identifier: MIT
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
#include <cstdlib>
#include <iostream>
#include <initializer_list>
#include <vector>
#include <gtest/gtest.h>
#include "profiler/profile_grouped_conv_fwd_impl.hpp"
class
TestGroupedConvNdFwd
:
public
::
testing
::
Test
{
protected:
std
::
vector
<
ck
::
utils
::
conv
::
ConvParam
>
conv_params
;
};
// 1d GNWC/GKXC/GNWK
TEST_F
(
TestGroupedConvNdFwd
,
GroupedConv1dFwdGNWC
)
{
conv_params
.
clear
();
conv_params
.
push_back
({
1
,
2
,
128
,
128
,
256
,
{
1
},
{
14
},
{
2
},
{
1
},
{
0
},
{
0
}});
conv_params
.
push_back
({
1
,
2
,
128
,
128
,
256
,
{
3
},
{
28
},
{
1
},
{
1
},
{
1
},
{
1
}});
conv_params
.
push_back
({
1
,
2
,
128
,
128
,
256
,
{
1
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}});
conv_params
.
push_back
({
1
,
1
,
1
,
1
,
32
,
{
3
},
{
32
},
{
1
},
{
1
},
{
1
},
{
1
}});
conv_params
.
push_back
({
1
,
1
,
1
,
64
,
3
,
{
3
},
{
32
},
{
1
},
{
1
},
{
1
},
{
1
}});
for
(
auto
&
param
:
conv_params
)
{
bool
pass
;
// fp32
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
1
,
ck
::
tensor_layout
::
convolution
::
GNWC
,
ck
::
tensor_layout
::
convolution
::
GKXC
,
ck
::
tensor_layout
::
convolution
::
GNWK
,
float
,
float
,
float
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// fp16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
1
,
ck
::
tensor_layout
::
convolution
::
GNWC
,
ck
::
tensor_layout
::
convolution
::
GKXC
,
ck
::
tensor_layout
::
convolution
::
GNWK
,
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// bf16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
1
,
ck
::
tensor_layout
::
convolution
::
GNWC
,
ck
::
tensor_layout
::
convolution
::
GKXC
,
ck
::
tensor_layout
::
convolution
::
GNWK
,
ck
::
bhalf_t
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// int8
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
1
,
ck
::
tensor_layout
::
convolution
::
GNWC
,
ck
::
tensor_layout
::
convolution
::
GKXC
,
ck
::
tensor_layout
::
convolution
::
GNWK
,
int8_t
,
int8_t
,
int8_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
}
}
// 2d GNHWC/GKYXC/GNHWK
TEST_F
(
TestGroupedConvNdFwd
,
GroupedConv2dFwdGNHWC
)
{
conv_params
.
clear
();
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
3
,
3
},
{
14
,
14
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
1
,
1
},
{
3
,
3
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
32
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
1
,
1
,
64
,
3
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
1
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
for
(
auto
&
param
:
conv_params
)
{
bool
pass
;
// fp32
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
2
,
ck
::
tensor_layout
::
convolution
::
GNHWC
,
ck
::
tensor_layout
::
convolution
::
GKYXC
,
ck
::
tensor_layout
::
convolution
::
GNHWK
,
float
,
float
,
float
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// fp16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
2
,
ck
::
tensor_layout
::
convolution
::
GNHWC
,
ck
::
tensor_layout
::
convolution
::
GKYXC
,
ck
::
tensor_layout
::
convolution
::
GNHWK
,
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// bf16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
2
,
ck
::
tensor_layout
::
convolution
::
GNHWC
,
ck
::
tensor_layout
::
convolution
::
GKYXC
,
ck
::
tensor_layout
::
convolution
::
GNHWK
,
ck
::
bhalf_t
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// int8
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
2
,
ck
::
tensor_layout
::
convolution
::
GNHWC
,
ck
::
tensor_layout
::
convolution
::
GKYXC
,
ck
::
tensor_layout
::
convolution
::
GNHWK
,
int8_t
,
int8_t
,
int8_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
}
}
// 3d GNDHWC/GKZYXC/GNDHWK
TEST_F
(
TestGroupedConvNdFwd
,
GroupedConv3dFwdGNDHWC
)
{
conv_params
.
clear
();
conv_params
.
push_back
(
{
3
,
2
,
128
,
128
,
256
,
{
1
,
1
,
1
},
{
7
,
7
,
7
},
{
2
,
2
,
2
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
conv_params
.
push_back
(
{
3
,
2
,
128
,
128
,
256
,
{
3
,
3
,
3
},
{
14
,
14
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
conv_params
.
push_back
(
{
3
,
2
,
128
,
128
,
256
,
{
1
,
1
,
1
},
{
3
,
3
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
conv_params
.
push_back
(
{
3
,
1
,
1
,
1
,
32
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
1
,
64
,
3
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
conv_params
.
push_back
(
{
3
,
1
,
1
,
1
,
1
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
for
(
auto
&
param
:
conv_params
)
{
bool
pass
;
// fp32
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
3
,
ck
::
tensor_layout
::
convolution
::
GNDHWC
,
ck
::
tensor_layout
::
convolution
::
GKZYXC
,
ck
::
tensor_layout
::
convolution
::
GNDHWK
,
float
,
float
,
float
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// fp16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
3
,
ck
::
tensor_layout
::
convolution
::
GNDHWC
,
ck
::
tensor_layout
::
convolution
::
GKZYXC
,
ck
::
tensor_layout
::
convolution
::
GNDHWK
,
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// bf16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
3
,
ck
::
tensor_layout
::
convolution
::
GNDHWC
,
ck
::
tensor_layout
::
convolution
::
GKZYXC
,
ck
::
tensor_layout
::
convolution
::
GNDHWK
,
ck
::
bhalf_t
,
ck
::
bhalf_t
,
ck
::
bhalf_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
// int8
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
3
,
ck
::
tensor_layout
::
convolution
::
GNDHWC
,
ck
::
tensor_layout
::
convolution
::
GKZYXC
,
ck
::
tensor_layout
::
convolution
::
GNDHWK
,
int8_t
,
int8_t
,
int8_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
}
}
// 2d NHWGC/KYXGC/NHWGK
TEST_F
(
TestGroupedConvNdFwd
,
GroupedConv2dFwdNHWGC
)
{
conv_params
.
clear
();
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
3
,
3
},
{
14
,
14
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
2
,
128
,
128
,
256
,
{
1
,
1
},
{
3
,
3
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
32
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
1
,
1
,
64
,
3
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
1
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
for
(
auto
&
param
:
conv_params
)
{
bool
pass
;
// fp16
pass
=
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
2
,
ck
::
tensor_layout
::
convolution
::
NHWGC
,
ck
::
tensor_layout
::
convolution
::
GKYXC
,
ck
::
tensor_layout
::
convolution
::
NHWGK
,
ck
::
half_t
,
ck
::
half_t
,
ck
::
half_t
>
(
true
,
// do_verification
1
,
// init_method
false
,
// do_log
false
,
// time_kernel
param
);
EXPECT_TRUE
(
pass
);
}
}
test/grouped_convnd_fwd/test_grouped_convnd_fwd.cpp
0 → 100644
View file @
648f1f13
// SPDX-License-Identifier: MIT
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
#include <cstdlib>
#include <iostream>
#include <initializer_list>
#include <vector>
#include <gtest/gtest.h>
#include "profiler/profile_grouped_conv_fwd_impl.hpp"
template
<
typename
Tuple
>
class
TestGroupedConvndFwd
:
public
::
testing
::
Test
{
protected:
using
DataType
=
std
::
tuple_element_t
<
0
,
Tuple
>
;
using
InLayout
=
std
::
tuple_element_t
<
1
,
Tuple
>
;
using
WeiLayout
=
std
::
tuple_element_t
<
2
,
Tuple
>
;
using
OutLayout
=
std
::
tuple_element_t
<
3
,
Tuple
>
;
std
::
vector
<
ck
::
utils
::
conv
::
ConvParam
>
conv_params
;
template
<
ck
::
index_t
NDimSpatial
>
void
Run
()
{
EXPECT_FALSE
(
conv_params
.
empty
());
bool
pass
=
true
;
for
(
auto
&
param
:
conv_params
)
{
pass
=
pass
&&
ck
::
profiler
::
profile_grouped_conv_fwd_impl
<
NDimSpatial
,
InLayout
,
WeiLayout
,
OutLayout
,
DataType
,
DataType
,
DataType
>
(
true
,
// do_verification
1
,
// init_method: integer value
false
,
// do_log
false
,
// time_kernel
param
);
}
EXPECT_TRUE
(
pass
);
}
};
using
namespace
ck
::
tensor_layout
::
convolution
;
using
KernelTypes1d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
GNWC
,
GKXC
,
GNWK
>
,
std
::
tuple
<
ck
::
half_t
,
GNWC
,
GKXC
,
GNWK
>
,
std
::
tuple
<
ck
::
bhalf_t
,
GNWC
,
GKXC
,
GNWK
>
,
std
::
tuple
<
int8_t
,
GNWC
,
GKXC
,
GNWK
>>
;
using
KernelTypes2d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
GNHWC
,
GKYXC
,
GNHWK
>
,
std
::
tuple
<
ck
::
half_t
,
GNHWC
,
GKYXC
,
GNHWK
>
,
std
::
tuple
<
ck
::
bhalf_t
,
GNHWC
,
GKYXC
,
GNHWK
>
,
std
::
tuple
<
int8_t
,
GNHWC
,
GKYXC
,
GNHWK
>
,
std
::
tuple
<
float
,
NHWGC
,
GKYXC
,
NHWGK
>
,
std
::
tuple
<
ck
::
half_t
,
NHWGC
,
GKYXC
,
NHWGK
>
,
std
::
tuple
<
ck
::
bhalf_t
,
NHWGC
,
GKYXC
,
NHWGK
>
,
std
::
tuple
<
int8_t
,
NHWGC
,
GKYXC
,
NHWGK
>>
;
using
KernelTypes3d
=
::
testing
::
Types
<
std
::
tuple
<
float
,
GNDHWC
,
GKZYXC
,
GNDHWK
>
,
std
::
tuple
<
ck
::
half_t
,
GNDHWC
,
GKZYXC
,
GNDHWK
>
,
std
::
tuple
<
ck
::
bhalf_t
,
GNDHWC
,
GKZYXC
,
GNDHWK
>
,
std
::
tuple
<
int8_t
,
GNDHWC
,
GKZYXC
,
GNDHWK
>
,
std
::
tuple
<
float
,
NDHWGC
,
GKZYXC
,
NDHWGK
>
,
std
::
tuple
<
ck
::
half_t
,
NDHWGC
,
GKZYXC
,
NDHWGK
>
,
std
::
tuple
<
ck
::
bhalf_t
,
NDHWGC
,
GKZYXC
,
NDHWGK
>
,
std
::
tuple
<
int8_t
,
NDHWGC
,
GKZYXC
,
NDHWGK
>>
;
template
<
typename
Tuple
>
class
TestGroupedConvndFwd1d
:
public
TestGroupedConvndFwd
<
Tuple
>
{
};
template
<
typename
Tuple
>
class
TestGroupedConvndFwd2d
:
public
TestGroupedConvndFwd
<
Tuple
>
{
};
template
<
typename
Tuple
>
class
TestGroupedConvndFwd3d
:
public
TestGroupedConvndFwd
<
Tuple
>
{
};
TYPED_TEST_SUITE
(
TestGroupedConvndFwd1d
,
KernelTypes1d
);
TYPED_TEST_SUITE
(
TestGroupedConvndFwd2d
,
KernelTypes2d
);
TYPED_TEST_SUITE
(
TestGroupedConvndFwd3d
,
KernelTypes3d
);
TYPED_TEST
(
TestGroupedConvndFwd1d
,
Test1D
)
{
this
->
conv_params
.
clear
();
this
->
conv_params
.
push_back
({
1
,
2
,
32
,
128
,
256
,
{
1
},
{
14
},
{
2
},
{
1
},
{
0
},
{
0
}});
this
->
conv_params
.
push_back
({
1
,
2
,
32
,
128
,
256
,
{
3
},
{
28
},
{
1
},
{
1
},
{
1
},
{
1
}});
this
->
conv_params
.
push_back
({
1
,
2
,
32
,
128
,
256
,
{
1
},
{
3
},
{
1
},
{
1
},
{
0
},
{
0
}});
this
->
conv_params
.
push_back
({
1
,
1
,
1
,
1
,
32
,
{
3
},
{
32
},
{
1
},
{
1
},
{
1
},
{
1
}});
this
->
conv_params
.
push_back
({
1
,
1
,
1
,
64
,
3
,
{
3
},
{
32
},
{
1
},
{
1
},
{
1
},
{
1
}});
this
->
template
Run
<
1
>();
}
TYPED_TEST
(
TestGroupedConvndFwd2d
,
Test2D
)
{
this
->
conv_params
.
clear
();
this
->
conv_params
.
push_back
(
{
2
,
2
,
32
,
128
,
256
,
{
1
,
1
},
{
7
,
7
},
{
2
,
2
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
this
->
conv_params
.
push_back
(
{
2
,
2
,
32
,
128
,
256
,
{
3
,
3
},
{
14
,
14
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
conv_params
.
push_back
(
{
2
,
2
,
32
,
128
,
256
,
{
1
,
1
},
{
3
,
3
},
{
1
,
1
},
{
1
,
1
},
{
0
,
0
},
{
0
,
0
}});
this
->
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
32
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
conv_params
.
push_back
({
2
,
1
,
1
,
64
,
3
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
conv_params
.
push_back
({
2
,
1
,
1
,
1
,
1
,
{
3
,
3
},
{
32
,
32
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
},
{
1
,
1
}});
this
->
template
Run
<
2
>();
}
TYPED_TEST
(
TestGroupedConvndFwd3d
,
Test3D
)
{
this
->
conv_params
.
clear
();
this
->
conv_params
.
push_back
(
{
3
,
2
,
32
,
128
,
256
,
{
1
,
1
,
1
},
{
7
,
7
,
7
},
{
2
,
2
,
2
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
this
->
conv_params
.
push_back
(
{
3
,
2
,
32
,
128
,
256
,
{
3
,
3
,
3
},
{
14
,
14
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
conv_params
.
push_back
(
{
3
,
2
,
32
,
128
,
256
,
{
1
,
1
,
1
},
{
3
,
3
,
3
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
0
,
0
,
0
},
{
0
,
0
,
0
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
1
,
1
,
32
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
1
,
64
,
3
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
conv_params
.
push_back
(
{
3
,
1
,
1
,
1
,
1
,
{
3
,
3
,
3
},
{
32
,
32
,
32
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
},
{
1
,
1
,
1
}});
this
->
template
Run
<
3
>();
}
Prev
1
…
13
14
15
16
17
18
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment