已合并
add ut opapi #4426
liuyun_nj创建于 4月29日
add ut opapi #4426
已合并
liuyun_nj创建于 4月29日
16 个文件变更+1194-59
@@ -288,7 +288,7 @@ static bool CheckInputOutputShape(const gert::TilingContext* context)
288 } else if (norm_key == PRE_RMS_NORM || norm_key == POST_RMS_NORM) {288 } else if (norm_key == PRE_RMS_NORM || norm_key == POST_RMS_NORM) {
289 OP_CHECK_IF(289 OP_CHECK_IF(
290 (gamma_shape->GetStorageShape().GetDim(0) != 1 ||290 (gamma_shape->GetStorageShape().GetDim(0) != 1 ||
291- gamma_shape->GetStorageShape().GetDim(-1) != x1_shape->GetStorageShape().GetDim(-1)),291+ gamma_shape->GetStorageShape().GetDim(gammaDimNum - 1) != x1_shape->GetStorageShape().GetDim(x1DimNum - 1)),
292 OP_LOGE_FOR_INVALID_SHAPES_WITH_REASON(292 OP_LOGE_FOR_INVALID_SHAPES_WITH_REASON(
293 context->GetNodeName(), "gamma and x1",293 context->GetNodeName(), "gamma and x1",
294 (Ops::Base::ToString(gamma_shape->GetStorageShape()) + " and " +294 (Ops::Base::ToString(gamma_shape->GetStorageShape()) + " and " +
@@ -549,4 +549,4 @@ IMPL_OP_OPTILING(InplaceAddRmsNorm)
549 .Tiling(Tiling4AddRmsNorm)549 .Tiling(Tiling4AddRmsNorm)
550 .TilingParse<AddRmsNormCompileInfo>(TilingPrepare4AddRmsNorm);550 .TilingParse<AddRmsNormCompileInfo>(TilingPrepare4AddRmsNorm);
551 551 
552-} // namespace optiling552+} // namespace optiling
@@ -1,18 +1,19 @@
1-# This program is free software, you can redistribute it and/or modify.
2# Copyright (c) 2025 Huawei Technologies Co., Ltd.1# Copyright (c) 2025 Huawei Technologies Co., Ltd.
3-# This file is a part of the CANN Open Software.2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4-# Licensed under CANN Open Software License Agreement Version 2.0 (the "License").3+# CANN Open Software License Agreement Version 2.0 (the "License").
5# Please refer to the License for details. You may not use this file except in compliance with the License.4# Please refer to the License for details. You may not use this file except in compliance with the License.
6-# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7# See LICENSE in the root of the software repository for the full text of the License.7# See LICENSE in the root of the software repository for the full text of the License.
8#/8#/
9 9 
10-file(GLOB CURRENT_DIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)10+file(GLOB CURRENT_SOURCE_DIRS LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/*)
11+foreach(SUB_DIR ${CURRENT_SOURCE_DIRS})
12+ if(EXISTS "${SUB_DIR}/CMakeLists.txt")
13+ add_subdirectory(${SUB_DIR})
14+ endif()
15+endforeach()
11if(UT_TEST_ALL OR OP_HOST_UT)16if(UT_TEST_ALL OR OP_HOST_UT)
12 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})17 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
13- add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})18+ #add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
14endif()19endif()
15-if(UT_TEST_ALL OR OP_API_UT)
16- add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
17-endif()
18- 
@@ -0,0 +1,12 @@
1+# Copyright (c) 2025 Huawei Technologies Co., Ltd.
2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
3+# CANN Open Software License Agreement Version 2.0 (the "License").
4+# Please refer to the License for details. You may not use this file except in compliance with the License.
5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7+# See LICENSE in the root of the software repository for the full text of the License.
8+#/
9+ 
10+if(UT_TEST_ALL OR OP_API_UT)
11+ add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
12+endif()
@@ -0,0 +1,62 @@
1+/**
2+ * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+ * CANN Open Software License Agreement Version 2.0 (the "License").
5+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+#include <vector>
11+#include <array>
12+#include "gtest/gtest.h"
13+#include "../../../../op_host/op_api/aclnn_add_rms_norm.h"
14+#include "op_api_ut_common/tensor_desc.h"
15+#include "op_api_ut_common/scalar_desc.h"
16+#include "op_api_ut_common/op_api_ut.h"
17+ 
18+using namespace std;
19+ 
20+class l2_add_rms_norm_test : public testing::Test
21+{
22+protected:
23+ static void SetUpTestCase()
24+ {
25+ cout << "l2_add_rms_norm_test SetUp" << endl;
26+ }
27+ static void TearDownTestCase()
28+ {
29+ cout << "l2_add_rms_norm_test TearDown" << endl;
30+ }
31+ 
32+public:
33+ void CommonTest(
34+ const vector<int64_t>& xShape, const vector<int64_t>& weightShape, const vector<int64_t>& rstdShape, aclDataType dtype, aclnnStatus expectRet)
35+ {
36+ auto x1 = TensorDesc(xShape, dtype, ACL_FORMAT_ND);
37+ auto x2 = TensorDesc(xShape, dtype, ACL_FORMAT_ND);
38+ auto weight = TensorDesc(weightShape, dtype, ACL_FORMAT_ND);
39+ auto yOut = TensorDesc(xShape, dtype, ACL_FORMAT_ND);
40+ auto rstdOut = TensorDesc(rstdShape, ACL_FLOAT, ACL_FORMAT_ND);
41+ auto xOut = TensorDesc(xShape, dtype, ACL_FORMAT_ND);
42+ uint64_t workspace_size = 0;
43+ auto ut = OP_API_UT(aclnnAddRmsNorm, INPUT(x1, x2, weight, 0.00001), OUTPUT(yOut, rstdOut, xOut));
44+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
45+ EXPECT_EQ(aclRet, expectRet);
46+ }
47+};
48+ 
49+TEST_F(l2_add_rms_norm_test, ascend910B2_success)
50+{
51+ // data type cases
52+ CommonTest({4, 16, 128}, {128}, {4, 16, 1}, ACL_FLOAT, ACLNN_SUCCESS);
53+ CommonTest({4, 4, 128}, {128}, {4, 4, 1}, ACL_FLOAT16, ACLNN_SUCCESS);
54+ CommonTest({4, 16, 12288}, {12288}, {4, 16, 1}, ACL_FLOAT16, ACLNN_SUCCESS);
55+ CommonTest({4, 0, 128}, {128}, {4, 0, 1}, ACL_FLOAT, ACLNN_SUCCESS);
56+}
57+ 
58+TEST_F(l2_add_rms_norm_test, ascend910B2_param_invalid)
59+{
60+ // invalid dtype
61+ CommonTest({4, 4, 128}, {128}, {4, 4, 1}, ACL_DOUBLE, ACLNN_ERR_PARAM_INVALID);
62+}
@@ -1,17 +1,19 @@
1-# This program is free software, you can redistribute it and/or modify.
2# Copyright (c) 2025 Huawei Technologies Co., Ltd.1# Copyright (c) 2025 Huawei Technologies Co., Ltd.
3-# This file is a part of the CANN Open Software.2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4-# Licensed under CANN Open Software License Agreement Version 2.0 (the "License").3+# CANN Open Software License Agreement Version 2.0 (the "License").
5# Please refer to the License for details. You may not use this file except in compliance with the License.4# Please refer to the License for details. You may not use this file except in compliance with the License.
6-# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7# See LICENSE in the root of the software repository for the full text of the License.7# See LICENSE in the root of the software repository for the full text of the License.
8#/8#/
9 9 
10-file(GLOB CURRENT_DIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)10+file(GLOB CURRENT_SOURCE_DIRS LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/*)
11+foreach(SUB_DIR ${CURRENT_SOURCE_DIRS})
12+ if(EXISTS "${SUB_DIR}/CMakeLists.txt")
13+ add_subdirectory(${SUB_DIR})
14+ endif()
15+endforeach()
11if(UT_TEST_ALL OR OP_HOST_UT)16if(UT_TEST_ALL OR OP_HOST_UT)
12 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})17 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
13- add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})18+ #add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
14-endif()
15-if(UT_TEST_ALL OR OP_API_UT)
16- add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
17endif()19endif()
@@ -0,0 +1,12 @@
1+# Copyright (c) 2025 Huawei Technologies Co., Ltd.
2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
3+# CANN Open Software License Agreement Version 2.0 (the "License").
4+# Please refer to the License for details. You may not use this file except in compliance with the License.
5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7+# See LICENSE in the root of the software repository for the full text of the License.
8+#/
9+ 
10+if(UT_TEST_ALL OR OP_API_UT)
11+ add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
12+endif()
@@ -0,0 +1,188 @@
1+/**
2+ * This program is free software, you can redistribute it and/or modify.
3+ * Copyright (c) 2025 Huawei Technologies Co., Ltd.
4+ * This file is a part of the CANN Open Software.
5+ * Licensed under CANN Open Software License Agreement Version 2.0 (the "License").
6+ * Please refer to the License for details. You may not use this file except in compliance with the License.
7+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+#include <array>
11+#include <vector>
12+ 
13+#include "gtest/gtest.h"
14+ 
15+#include "../../../../op_host/op_api/aclnn_add_rms_norm_dynamic_quant.h"
16+ 
17+#include "op_api_ut_common/op_api_ut.h"
18+#include "op_api_ut_common/scalar_desc.h"
19+#include "op_api_ut_common/tensor_desc.h"
20+ 
21+using namespace std;
22+ 
23+class l2_add_rms_norm_dynamic_quant_test : public testing::Test
24+{
25+protected:
26+ static void SetUpTestCase()
27+ {
28+ cout << "add_rms_norm_dynamic_quant_test SetUp" << endl;
29+ }
30+ 
31+ static void TearDownTestCase()
32+ {
33+ cout << "add_rms_norm_dynamic_quant_test TearDown" << endl;
34+ }
35+};
36+ 
37+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend910B_case_001)
38+{
39+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
40+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
41+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_FLOAT16, ACL_FORMAT_ND);
42+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_FLOAT16, ACL_FORMAT_ND);
43+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_FLOAT16, ACL_FORMAT_ND);
44+ 
45+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
46+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
47+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
48+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
49+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
50+ 
51+ double eps = 1e-5;
52+ 
53+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
54+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma,
55+ tensor_desc_s1, tensor_desc_s2, eps),
56+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
57+ );
58+ 
59+ uint64_t workspace_size = 0;
60+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
61+ EXPECT_EQ(aclRet, ACL_SUCCESS);
62+}
63+ 
64+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend910B_case_002)
65+{
66+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
67+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
68+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
69+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
70+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
71+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
72+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
73+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
74+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
75+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
76+ 
77+ double eps = 1e-5;
78+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
79+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1,
80+ tensor_desc_s2, eps),
81+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
82+ );
83+ 
84+ uint64_t workspace_size = 0;
85+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
86+ EXPECT_EQ(aclRet, ACL_SUCCESS);
87+}
88+ 
89+//***************************************************************************************************************
90+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend950_case_001)
91+{
92+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
93+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
94+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
95+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
96+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
97+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
98+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
99+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
100+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
101+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
102+ 
103+ double eps = 1e-5;
104+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
105+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1,
106+ tensor_desc_s2, eps),
107+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
108+ );
109+ 
110+ uint64_t workspace_size = 0;
111+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
112+ EXPECT_EQ(aclRet, ACL_SUCCESS);
113+}
114+ 
115+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend950_case_002)
116+{
117+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
118+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
119+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
120+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
121+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
122+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
123+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
124+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
125+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
126+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
127+ 
128+ double eps = 1e-5;
129+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
130+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1,
131+ tensor_desc_s2, eps),
132+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
133+ );
134+ 
135+ uint64_t workspace_size = 0;
136+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
137+ EXPECT_EQ(aclRet, ACL_SUCCESS);
138+}
139+ 
140+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend950_case_003)
141+{
142+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
143+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
144+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
145+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
146+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
147+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
148+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
149+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
150+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
151+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
152+ 
153+ double eps = 1e-5;
154+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
155+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1,
156+ tensor_desc_s2, eps),
157+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
158+ );
159+ 
160+ uint64_t workspace_size = 0;
161+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
162+ EXPECT_EQ(aclRet, ACL_SUCCESS);
163+}
164+ 
165+TEST_F(l2_add_rms_norm_dynamic_quant_test, ascend950_case_004)
166+{
167+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
168+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
169+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
170+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
171+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
172+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
173+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
174+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
175+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
176+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
177+ 
178+ double eps = 1e-5;
179+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuant,
180+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1,
181+ tensor_desc_s2, eps),
182+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
183+ );
184+ 
185+ uint64_t workspace_size = 0;
186+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
187+ EXPECT_EQ(aclRet, ACL_SUCCESS);
188+}
@@ -0,0 +1,264 @@
1+/**
2+ * This program is free software, you can redistribute it and/or modify.
3+ * Copyright (c) 2025 Huawei Technologies Co., Ltd.
4+ * This file is a part of the CANN Open Software.
5+ * Licensed under CANN Open Software License Agreement Version 2.0 (the "License").
6+ * Please refer to the License for details. You may not use this file except in compliance with the License.
7+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+#include <array>
11+#include <vector>
12+ 
13+#include "gtest/gtest.h"
14+ 
15+#include "../../../../op_host/op_api/aclnn_add_rms_norm_dynamic_quant_v2.h"
16+ 
17+#include "op_api_ut_common/op_api_ut.h"
18+#include "op_api_ut_common/scalar_desc.h"
19+#include "op_api_ut_common/tensor_desc.h"
20+ 
21+#include "opdev/platform.h"
22+ 
23+using namespace std;
24+ 
25+class l2_add_rms_norm_dynamic_quant_v2_test : public testing::Test {
26+protected:
27+ static void SetUpTestCase()
28+ {
29+ cout << "add_rms_norm_dynamic_quant_v2_test SetUp" << endl;
30+ }
31+ 
32+ static void TearDownTestCase()
33+ {
34+ cout << "add_rms_norm_dynamic_quant_v2_test TearDown" << endl;
35+ }
36+};
37+ 
38+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend910B_case_001)
39+{
40+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
41+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
42+ auto tensor_desc_gamma = TensorDesc(
43+ {
44+ 64,
45+ },
46+ ACL_FLOAT16, ACL_FORMAT_ND);
47+ auto tensor_desc_s1 = TensorDesc(
48+ {
49+ 64,
50+ },
51+ ACL_FLOAT16, ACL_FORMAT_ND);
52+ auto tensor_desc_s2 = TensorDesc(
53+ {
54+ 64,
55+ },
56+ ACL_FLOAT16, ACL_FORMAT_ND);
57+ auto tensor_desc_beta = TensorDesc(
58+ {
59+ 64,
60+ },
61+ ACL_FLOAT16, ACL_FORMAT_ND);
62+ 
63+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
64+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
65+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
66+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
67+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
68+ 
69+ double eps = 1e-5;
70+ 
71+ auto ut = OP_API_UT(
72+ aclnnAddRmsNormDynamicQuantV2,
73+ INPUT(
74+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
75+ nullptr),
76+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2));
77+ 
78+ uint64_t workspace_size = 0;
79+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
80+ EXPECT_EQ(aclRet, ACL_SUCCESS);
81+}
82+ 
83+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend910B_case_002)
84+{
85+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
86+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
87+ auto tensor_desc_gamma = TensorDesc(
88+ {
89+ 64,
90+ },
91+ ACL_FLOAT16, ACL_FORMAT_ND);
92+ auto tensor_desc_s1 = TensorDesc(
93+ {
94+ 64,
95+ },
96+ ACL_FLOAT16, ACL_FORMAT_ND);
97+ auto tensor_desc_s2 = TensorDesc(
98+ {
99+ 64,
100+ },
101+ ACL_FLOAT16, ACL_FORMAT_ND);
102+ auto tensor_desc_beta = TensorDesc(
103+ {
104+ 64,
105+ },
106+ ACL_FLOAT16, ACL_FORMAT_ND);
107+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
108+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
109+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
110+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
111+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
112+ double eps = 1e-5;
113+ 
114+ auto ut = OP_API_UT(
115+ aclnnAddRmsNormDynamicQuantV2,
116+ INPUT(
117+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
118+ nullptr),
119+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2));
120+ 
121+ uint64_t workspace_size = 0;
122+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
123+ EXPECT_EQ(aclRet, ACL_SUCCESS);
124+}
125+ 
126+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend910B_case_003)
127+{
128+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
129+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
130+ auto tensor_desc_gamma = TensorDesc(
131+ {
132+ 64,
133+ },
134+ ACL_BF16, ACL_FORMAT_ND);
135+ auto tensor_desc_s1 = TensorDesc(
136+ {
137+ 64,
138+ },
139+ ACL_BF16, ACL_FORMAT_ND);
140+ auto tensor_desc_s2 = TensorDesc(
141+ {
142+ 64,
143+ },
144+ ACL_BF16, ACL_FORMAT_ND);
145+ auto tensor_desc_beta = TensorDesc(
146+ {
147+ 64,
148+ },
149+ ACL_BF16, ACL_FORMAT_ND);
150+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
151+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
152+ auto tensor_desc_y1 = TensorDesc({8, 8}, ACL_INT32, ACL_FORMAT_ND);
153+ auto tensor_desc_y2 = TensorDesc({8, 8}, ACL_INT32, ACL_FORMAT_ND);
154+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
155+ double eps = 1e-5;
156+ 
157+ auto ut = OP_API_UT(
158+ aclnnAddRmsNormDynamicQuantV2,
159+ INPUT(
160+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
161+ nullptr),
162+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2));
163+ 
164+ uint64_t workspace_size = 0;
165+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
166+ EXPECT_EQ(aclRet, ACL_SUCCESS);
167+}
168+ 
169+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend910B_case_004)
170+{
171+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
172+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
173+ auto tensor_desc_gamma = TensorDesc(
174+ {
175+ 64,
176+ },
177+ ACL_BF16, ACL_FORMAT_ND);
178+ auto tensor_desc_s1 = TensorDesc(
179+ {
180+ 64,
181+ },
182+ ACL_BF16, ACL_FORMAT_ND);
183+ auto tensor_desc_s2 = TensorDesc(
184+ {
185+ 64,
186+ },
187+ ACL_BF16, ACL_FORMAT_ND);
188+ auto tensor_desc_beta = TensorDesc(
189+ {
190+ 64,
191+ },
192+ ACL_BF16, ACL_FORMAT_ND);
193+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
194+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
195+ auto tensor_desc_y1 = TensorDesc({8, 8}, ACL_INT32, ACL_FORMAT_ND);
196+ auto tensor_desc_y2 = TensorDesc({8, 8}, ACL_INT32, ACL_FORMAT_ND);
197+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
198+ double eps = 1e-5;
199+ 
200+ auto ut = OP_API_UT(
201+ aclnnAddRmsNormDynamicQuantV2,
202+ INPUT(
203+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
204+ nullptr),
205+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2));
206+ 
207+ uint64_t workspace_size = 0;
208+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
209+ EXPECT_EQ(aclRet, ACL_SUCCESS);
210+}
211+ 
212+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend950_case_001)
213+{
214+ op::SocVersionManager versionManager(op::SocVersion::ASCEND950);
215+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
216+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
217+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
218+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
219+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
220+ auto tensor_desc_beta = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
221+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
222+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
223+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
224+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
225+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
226+ 
227+ double eps = 1e-5;
228+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuantV2,
229+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
230+ nullptr),
231+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
232+ );
233+ 
234+ uint64_t workspace_size = 0;
235+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
236+ EXPECT_EQ(aclRet, ACL_SUCCESS);
237+}
238+ 
239+TEST_F(l2_add_rms_norm_dynamic_quant_v2_test, ascend950_case_002)
240+{
241+ op::SocVersionManager versionManager(op::SocVersion::ASCEND950);
242+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
243+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
244+ auto tensor_desc_gamma = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
245+ auto tensor_desc_s1 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
246+ auto tensor_desc_s2 = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
247+ auto tensor_desc_beta = TensorDesc({64,}, ACL_BF16, ACL_FORMAT_ND);
248+ auto tensor_desc_scale1 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
249+ auto tensor_desc_scale2 = TensorDesc({8}, ACL_FLOAT, ACL_FORMAT_ND);
250+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
251+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
252+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_BF16, ACL_FORMAT_ND);
253+ 
254+ double eps = 1e-5;
255+ auto ut = OP_API_UT(aclnnAddRmsNormDynamicQuantV2,
256+ INPUT(tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_beta, eps,
257+ nullptr),
258+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, tensor_desc_scale1, tensor_desc_scale2)
259+ );
260+ 
261+ uint64_t workspace_size = 0;
262+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
263+ EXPECT_EQ(aclRet, ACL_SUCCESS);
264+}
@@ -1,18 +1,19 @@
1-# This program is free software, you can redistribute it and/or modify.
2# Copyright (c) 2025 Huawei Technologies Co., Ltd.1# Copyright (c) 2025 Huawei Technologies Co., Ltd.
3-# This file is a part of the CANN Open Software.2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4-# Licensed under CANN Open Software License Agreement Version 2.0 (the "License").3+# CANN Open Software License Agreement Version 2.0 (the "License").
5# Please refer to the License for details. You may not use this file except in compliance with the License.4# Please refer to the License for details. You may not use this file except in compliance with the License.
6-# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7# See LICENSE in the root of the software repository for the full text of the License.7# See LICENSE in the root of the software repository for the full text of the License.
8#/8#/
9 9 
10-file(GLOB CURRENT_DIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)10+file(GLOB CURRENT_SOURCE_DIRS LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/*)
11+foreach(SUB_DIR ${CURRENT_SOURCE_DIRS})
12+ if(EXISTS "${SUB_DIR}/CMakeLists.txt")
13+ add_subdirectory(${SUB_DIR})
14+ endif()
15+endforeach()
11if(UT_TEST_ALL OR OP_HOST_UT)16if(UT_TEST_ALL OR OP_HOST_UT)
12 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})17 add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
13- add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})18+ #add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
14endif()19endif()
15-if(UT_TEST_ALL OR OP_API_UT)
16- add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
17-endif()
18- 
@@ -0,0 +1,12 @@
1+# Copyright (c) 2025 Huawei Technologies Co., Ltd.
2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
3+# CANN Open Software License Agreement Version 2.0 (the "License").
4+# Please refer to the License for details. You may not use this file except in compliance with the License.
5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7+# See LICENSE in the root of the software repository for the full text of the License.
8+#/
9+ 
10+if(UT_TEST_ALL OR OP_API_UT)
11+ add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
12+endif()
@@ -0,0 +1,434 @@
1+/**
2+ * This program is free software, you can redistribute it and/or modify.
3+ * Copyright (c) 2025 Huawei Technologies Co., Ltd.
4+ * This file is a part of the CANN Open Software.
5+ * Licensed under CANN Open Software License Agreement Version 2.0 (the "License").
6+ * Please refer to the License for details. You may not use this file except in compliance with the License.
7+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+#include <array>
11+#include <vector>
12+ 
13+#include "gtest/gtest.h"
14+ 
15+#include "../../../../op_host/op_api/aclnn_add_rms_norm_quant.h"
16+ 
17+#include "op_api_ut_common/op_api_ut.h"
18+#include "op_api_ut_common/scalar_desc.h"
19+#include "op_api_ut_common/tensor_desc.h"
20+ 
21+using namespace std;
22+ 
23+class l2_add_rms_norm_quant_test : public testing::Test
24+{
25+protected:
26+ static void SetUpTestCase()
27+ {
28+ cout << "add_rms_norm_quant_test SetUp" << endl;
29+ }
30+ 
31+ static void TearDownTestCase()
32+ {
33+ cout << "add_rms_norm_quant_test TearDown" << endl;
34+ }
35+};
36+ 
37+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_dyn_001)
38+{
39+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
40+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
41+ auto tensor_desc_gamma = TensorDesc(
42+ {
43+ 64,
44+ },
45+ ACL_FLOAT16, ACL_FORMAT_ND);
46+ auto tensor_desc_s1 = TensorDesc(
47+ {
48+ 64,
49+ },
50+ ACL_FLOAT16, ACL_FORMAT_ND);
51+ auto tensor_desc_s2 = TensorDesc(
52+ {
53+ 64,
54+ },
55+ ACL_FLOAT16, ACL_FORMAT_ND);
56+ 
57+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
58+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
59+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
60+ 
61+ int64_t axis = -1L;
62+ double eps = 1e-5;
63+ bool divMode = true;
64+ 
65+ auto ut = OP_API_UT(
66+ aclnnAddRmsNormQuant,
67+ INPUT(
68+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, (aclTensor*)nullptr,
69+ (aclTensor*)nullptr, axis, eps, divMode),
70+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
71+ 
72+ // SAMPLE: only test GetWorkspaceSize
73+ uint64_t workspace_size = 0;
74+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
75+ EXPECT_EQ(aclRet, ACL_SUCCESS);
76+}
77+ 
78+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_stc_001)
79+{
80+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
81+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
82+ auto tensor_desc_gamma = TensorDesc(
83+ {
84+ 64,
85+ },
86+ ACL_FLOAT16, ACL_FORMAT_ND);
87+ auto tensor_desc_s1 = TensorDesc(
88+ {
89+ 64,
90+ },
91+ ACL_FLOAT16, ACL_FORMAT_ND);
92+ auto tensor_desc_s2 = TensorDesc(
93+ {
94+ 64,
95+ },
96+ ACL_FLOAT16, ACL_FORMAT_ND);
97+ auto tensor_desc_z1 = TensorDesc(
98+ {
99+ 64,
100+ },
101+ ACL_FLOAT16, ACL_FORMAT_ND);
102+ auto tensor_desc_z2 = TensorDesc(
103+ {
104+ 64,
105+ },
106+ ACL_FLOAT16, ACL_FORMAT_ND);
107+ 
108+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
109+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
110+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
111+ 
112+ int64_t axis = -1;
113+ double eps = 1e-5;
114+ bool divMode = true;
115+ 
116+ auto ut = OP_API_UT(
117+ aclnnAddRmsNormQuant,
118+ INPUT(
119+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
120+ tensor_desc_z2, axis, eps, divMode),
121+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
122+ 
123+ // SAMPLE: only test GetWorkspaceSize
124+ uint64_t workspace_size = 0;
125+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
126+ EXPECT_EQ(aclRet, ACL_SUCCESS);
127+}
128+ 
129+//**********************************************************************************************************************
130+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_dyn_002)
131+{
132+ auto tensor_desc_x1 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
133+ auto tensor_desc_x2 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
134+ auto tensor_desc_gamma = TensorDesc(
135+ {
136+ 16,
137+ },
138+ ACL_FLOAT16, ACL_FORMAT_ND);
139+ auto tensor_desc_s1 = TensorDesc(
140+ {
141+ 16,
142+ },
143+ ACL_FLOAT16, ACL_FORMAT_ND);
144+ auto tensor_desc_s2 = TensorDesc(
145+ {
146+ 16,
147+ },
148+ ACL_FLOAT16, ACL_FORMAT_ND);
149+ auto tensor_desc_z1 = TensorDesc(
150+ {
151+ 16,
152+ },
153+ ACL_FLOAT16, ACL_FORMAT_ND);
154+ auto tensor_desc_z2 = TensorDesc(
155+ {
156+ 16,
157+ },
158+ ACL_FLOAT16, ACL_FORMAT_ND);
159+ 
160+ auto tensor_desc_y1 = TensorDesc({8, 16}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
161+ auto tensor_desc_y2 = TensorDesc({8, 16}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
162+ auto tensor_desc_x = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
163+ 
164+ int64_t axis = -1;
165+ double eps = 1e-5;
166+ bool divMode = true;
167+ 
168+ auto ut = OP_API_UT(
169+ aclnnAddRmsNormQuant,
170+ INPUT(
171+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
172+ tensor_desc_z2, axis, eps, divMode),
173+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
174+ 
175+ // SAMPLE: only test GetWorkspaceSize
176+ uint64_t workspace_size = 0;
177+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
178+ EXPECT_EQ(aclRet, ACL_SUCCESS);
179+}
180+ 
181+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_stc_002)
182+{
183+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
184+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
185+ auto tensor_desc_gamma = TensorDesc(
186+ {
187+ 64,
188+ },
189+ ACL_FLOAT16, ACL_FORMAT_ND);
190+ auto tensor_desc_s1 = TensorDesc(
191+ {
192+ 64,
193+ },
194+ ACL_FLOAT16, ACL_FORMAT_ND);
195+ auto tensor_desc_s2 = TensorDesc(
196+ {
197+ 64,
198+ },
199+ ACL_FLOAT16, ACL_FORMAT_ND);
200+ auto tensor_desc_z1 = TensorDesc(
201+ {
202+ 64,
203+ },
204+ ACL_FLOAT16, ACL_FORMAT_ND);
205+ auto tensor_desc_z2 = TensorDesc(
206+ {
207+ 64,
208+ },
209+ ACL_FLOAT16, ACL_FORMAT_ND);
210+ 
211+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
212+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_FLOAT8_E5M2, ACL_FORMAT_ND);
213+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
214+ 
215+ int64_t axis = -1;
216+ double eps = 1e-5;
217+ bool divMode = true;
218+ 
219+ auto ut = OP_API_UT(
220+ aclnnAddRmsNormQuant,
221+ INPUT(
222+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
223+ tensor_desc_z2, axis, eps, divMode),
224+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
225+ 
226+ // SAMPLE: only test GetWorkspaceSize
227+ uint64_t workspace_size = 0;
228+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
229+ EXPECT_EQ(aclRet, ACL_SUCCESS);
230+}
231+ 
232+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_dyn_003)
233+{
234+ auto tensor_desc_x1 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
235+ auto tensor_desc_x2 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
236+ auto tensor_desc_gamma = TensorDesc(
237+ {
238+ 16,
239+ },
240+ ACL_FLOAT16, ACL_FORMAT_ND);
241+ auto tensor_desc_s1 = TensorDesc(
242+ {
243+ 16,
244+ },
245+ ACL_FLOAT16, ACL_FORMAT_ND);
246+ auto tensor_desc_s2 = TensorDesc(
247+ {
248+ 16,
249+ },
250+ ACL_FLOAT16, ACL_FORMAT_ND);
251+ auto tensor_desc_z1 = TensorDesc(
252+ {
253+ 16,
254+ },
255+ ACL_FLOAT16, ACL_FORMAT_ND);
256+ auto tensor_desc_z2 = TensorDesc(
257+ {
258+ 16,
259+ },
260+ ACL_FLOAT16, ACL_FORMAT_ND);
261+ 
262+ auto tensor_desc_y1 = TensorDesc({8, 16}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
263+ auto tensor_desc_y2 = TensorDesc({8, 16}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
264+ auto tensor_desc_x = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
265+ 
266+ int64_t axis = -1;
267+ double eps = 1e-5;
268+ bool divMode = true;
269+ 
270+ auto ut = OP_API_UT(
271+ aclnnAddRmsNormQuant,
272+ INPUT(
273+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
274+ tensor_desc_z2, axis, eps, divMode),
275+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
276+ 
277+ // SAMPLE: only test GetWorkspaceSize
278+ uint64_t workspace_size = 0;
279+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
280+ EXPECT_EQ(aclRet, ACL_SUCCESS);
281+}
282+ 
283+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_stc_003)
284+{
285+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
286+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
287+ auto tensor_desc_gamma = TensorDesc(
288+ {
289+ 64,
290+ },
291+ ACL_FLOAT16, ACL_FORMAT_ND);
292+ auto tensor_desc_s1 = TensorDesc(
293+ {
294+ 64,
295+ },
296+ ACL_FLOAT16, ACL_FORMAT_ND);
297+ auto tensor_desc_s2 = TensorDesc(
298+ {
299+ 64,
300+ },
301+ ACL_FLOAT16, ACL_FORMAT_ND);
302+ auto tensor_desc_z1 = TensorDesc(
303+ {
304+ 64,
305+ },
306+ ACL_FLOAT16, ACL_FORMAT_ND);
307+ auto tensor_desc_z2 = TensorDesc(
308+ {
309+ 64,
310+ },
311+ ACL_FLOAT16, ACL_FORMAT_ND);
312+ 
313+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
314+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_FLOAT8_E4M3FN, ACL_FORMAT_ND);
315+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
316+ 
317+ int64_t axis = -1;
318+ double eps = 1e-5;
319+ bool divMode = true;
320+ 
321+ auto ut = OP_API_UT(
322+ aclnnAddRmsNormQuant,
323+ INPUT(
324+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
325+ tensor_desc_z2, axis, eps, divMode),
326+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
327+ 
328+ // SAMPLE: only test GetWorkspaceSize
329+ uint64_t workspace_size = 0;
330+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
331+ EXPECT_EQ(aclRet, ACL_SUCCESS);
332+}
333+ 
334+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_dyn_004)
335+{
336+ auto tensor_desc_x1 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
337+ auto tensor_desc_x2 = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
338+ auto tensor_desc_gamma = TensorDesc(
339+ {
340+ 16,
341+ },
342+ ACL_FLOAT16, ACL_FORMAT_ND);
343+ auto tensor_desc_s1 = TensorDesc(
344+ {
345+ 16,
346+ },
347+ ACL_FLOAT16, ACL_FORMAT_ND);
348+ auto tensor_desc_s2 = TensorDesc(
349+ {
350+ 16,
351+ },
352+ ACL_FLOAT16, ACL_FORMAT_ND);
353+ auto tensor_desc_z1 = TensorDesc(
354+ {
355+ 16,
356+ },
357+ ACL_FLOAT16, ACL_FORMAT_ND);
358+ auto tensor_desc_z2 = TensorDesc(
359+ {
360+ 16,
361+ },
362+ ACL_FLOAT16, ACL_FORMAT_ND);
363+ 
364+ auto tensor_desc_y1 = TensorDesc({8, 16}, ACL_HIFLOAT8, ACL_FORMAT_ND);
365+ auto tensor_desc_y2 = TensorDesc({8, 16}, ACL_HIFLOAT8, ACL_FORMAT_ND);
366+ auto tensor_desc_x = TensorDesc({8, 16}, ACL_FLOAT16, ACL_FORMAT_ND);
367+ 
368+ int64_t axis = -1;
369+ double eps = 1e-5;
370+ bool divMode = true;
371+ 
372+ auto ut = OP_API_UT(
373+ aclnnAddRmsNormQuant,
374+ INPUT(
375+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
376+ tensor_desc_z2, axis, eps, divMode),
377+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
378+ 
379+ // SAMPLE: only test GetWorkspaceSize
380+ uint64_t workspace_size = 0;
381+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
382+ EXPECT_EQ(aclRet, ACL_SUCCESS);
383+}
384+ 
385+TEST_F(l2_add_rms_norm_quant_test, ascend950PR_9589_case_stc_004)
386+{
387+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
388+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
389+ auto tensor_desc_gamma = TensorDesc(
390+ {
391+ 64,
392+ },
393+ ACL_FLOAT16, ACL_FORMAT_ND);
394+ auto tensor_desc_s1 = TensorDesc(
395+ {
396+ 64,
397+ },
398+ ACL_FLOAT16, ACL_FORMAT_ND);
399+ auto tensor_desc_s2 = TensorDesc(
400+ {
401+ 64,
402+ },
403+ ACL_FLOAT16, ACL_FORMAT_ND);
404+ auto tensor_desc_z1 = TensorDesc(
405+ {
406+ 64,
407+ },
408+ ACL_FLOAT16, ACL_FORMAT_ND);
409+ auto tensor_desc_z2 = TensorDesc(
410+ {
411+ 64,
412+ },
413+ ACL_FLOAT16, ACL_FORMAT_ND);
414+ 
415+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
416+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_HIFLOAT8, ACL_FORMAT_ND);
417+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
418+ 
419+ int64_t axis = -1;
420+ double eps = 1e-5;
421+ bool divMode = true;
422+ 
423+ auto ut = OP_API_UT(
424+ aclnnAddRmsNormQuant,
425+ INPUT(
426+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
427+ tensor_desc_z2, axis, eps, divMode),
428+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x));
429+ 
430+ // SAMPLE: only test GetWorkspaceSize
431+ uint64_t workspace_size = 0;
432+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
433+ EXPECT_EQ(aclRet, ACL_SUCCESS);
434+}
@@ -7,12 +7,13 @@
7# See LICENSE in the root of the software repository for the full text of the License.7# See LICENSE in the root of the software repository for the full text of the License.
8#/8#/
9 9 
10-file(GLOB CURRENT_DIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)10+file(GLOB CURRENT_SOURCE_DIRS LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/*)
11+foreach(SUB_DIR ${CURRENT_SOURCE_DIRS})
12+ if(EXISTS "${SUB_DIR}/CMakeLists.txt")
13+ add_subdirectory(${SUB_DIR})
14+ endif()
15+endforeach()
11if(UT_TEST_ALL OR OP_HOST_UT)16if(UT_TEST_ALL OR OP_HOST_UT)
12- #add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})17+ add_modules_ut_sources(HOSTNAME ${OP_TILING_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
13 #add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})18 #add_modules_ut_sources(HOSTNAME ${OP_INFERSHAPE_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
14endif()19endif()
15-if(UT_TEST_ALL OR OP_API_UT)
16- add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
17-endif()
18- 
@@ -0,0 +1,12 @@
1+# Copyright (c) 2025 Huawei Technologies Co., Ltd.
2+# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
3+# CANN Open Software License Agreement Version 2.0 (the "License").
4+# Please refer to the License for details. You may not use this file except in compliance with the License.
5+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
6+# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
7+# See LICENSE in the root of the software repository for the full text of the License.
8+#/
9+ 
10+if(UT_TEST_ALL OR OP_API_UT)
11+ add_modules_ut_sources(HOSTNAME ${OP_API_MODULE_NAME} MODE PRIVATE DIR ${CMAKE_CURRENT_SOURCE_DIR})
12+endif()
@@ -0,0 +1,138 @@
1+/**
2+ * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+ * CANN Open Software License Agreement Version 2.0 (the "License").
5+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+#include <array>
11+#include <vector>
12+ 
13+#include "gtest/gtest.h"
14+ 
15+#include "../../../../op_host/op_api/aclnn_add_rms_norm_quant_v2.h"
16+ 
17+#include "op_api_ut_common/op_api_ut.h"
18+#include "op_api_ut_common/scalar_desc.h"
19+#include "op_api_ut_common/tensor_desc.h"
20+ 
21+using namespace std;
22+ 
23+class l2_add_rms_norm_quant_v2_test : public testing::Test
24+{
25+protected:
26+ static void SetUpTestCase()
27+ {
28+ cout << "add_rms_norm_quant_v2_test SetUp" << endl;
29+ }
30+ 
31+ static void TearDownTestCase()
32+ {
33+ cout << "add_rms_norm_quant_v2_test TearDown" << endl;
34+ }
35+};
36+ 
37+TEST_F(l2_add_rms_norm_quant_v2_test, ascend950PR_9589_case_dyn_001)
38+{
39+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
40+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
41+ auto tensor_desc_gamma = TensorDesc(
42+ {
43+ 64,
44+ },
45+ ACL_FLOAT16, ACL_FORMAT_ND);
46+ auto tensor_desc_beta = TensorDesc(
47+ {
48+ 64,
49+ },
50+ ACL_FLOAT16, ACL_FORMAT_ND);
51+ auto tensor_desc_s1 = TensorDesc(
52+ {
53+ 64,
54+ },
55+ ACL_FLOAT16, ACL_FORMAT_ND);
56+ auto tensor_desc_s2 = TensorDesc(
57+ {
58+ 64,
59+ },
60+ ACL_FLOAT16, ACL_FORMAT_ND);
61+ 
62+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
63+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
64+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
65+ 
66+ int64_t axis = -1L;
67+ double eps = 1e-5;
68+ bool divMode = true;
69+ 
70+ auto ut = OP_API_UT(
71+ aclnnAddRmsNormQuantV2,
72+ INPUT(
73+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, (aclTensor*)nullptr,
74+ (aclTensor*)nullptr, tensor_desc_beta, axis, eps, divMode),
75+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, (aclTensor*)nullptr));
76+ 
77+ // SAMPLE: only test GetWorkspaceSize
78+ uint64_t workspace_size = 0;
79+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
80+ // EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);
81+}
82+ 
83+TEST_F(l2_add_rms_norm_quant_v2_test, ascend950PR_9589_case_stc_001)
84+{
85+ auto tensor_desc_x1 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
86+ auto tensor_desc_x2 = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
87+ auto tensor_desc_gamma = TensorDesc(
88+ {
89+ 64,
90+ },
91+ ACL_FLOAT16, ACL_FORMAT_ND);
92+ auto tensor_desc_beta = TensorDesc(
93+ {
94+ 64,
95+ },
96+ ACL_FLOAT16, ACL_FORMAT_ND);
97+ 
98+ auto tensor_desc_y1 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
99+ auto tensor_desc_x = TensorDesc({8, 64}, ACL_FLOAT16, ACL_FORMAT_ND);
100+ auto tensor_desc_y2 = TensorDesc({8, 64}, ACL_INT8, ACL_FORMAT_ND);
101+ 
102+ auto tensor_desc_z2 = TensorDesc(
103+ {
104+ 64,
105+ },
106+ ACL_FLOAT16, ACL_FORMAT_ND);
107+ auto tensor_desc_s1 = TensorDesc(
108+ {
109+ 64,
110+ },
111+ ACL_FLOAT16, ACL_FORMAT_ND);
112+ auto tensor_desc_s2 = TensorDesc(
113+ {
114+ 64,
115+ },
116+ ACL_FLOAT16, ACL_FORMAT_ND);
117+ auto tensor_desc_z1 = TensorDesc(
118+ {
119+ 64,
120+ },
121+ ACL_FLOAT16, ACL_FORMAT_ND);
122+ 
123+ bool divMode = true;
124+ double eps = 1e-5;
125+ int64_t axis = -1L;
126+ 
127+ auto ut = OP_API_UT(
128+ aclnnAddRmsNormQuantV2,
129+ INPUT(
130+ tensor_desc_x1, tensor_desc_x2, tensor_desc_gamma, tensor_desc_s1, tensor_desc_s2, tensor_desc_z1,
131+ tensor_desc_z2, tensor_desc_beta, axis, eps, divMode),
132+ OUTPUT(tensor_desc_y1, tensor_desc_y2, tensor_desc_x, (aclTensor*)nullptr));
133+ 
134+ // SAMPLE: only test GetWorkspaceSize
135+ uint64_t workspace_size = 0;
136+ aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
137+ // EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);
138+}
@@ -219,29 +219,28 @@ __aicore__ inline void dCopyIn(int64_t colIndex, int64_t colSize, int64_t rowSiz
219 rightPad = FLOAT_ALIGN - colSizeMod;219 rightPad = FLOAT_ALIGN - colSizeMod;
220 isPad = true;220 isPad = true;
221 } 221 }
222-#if __CCE_AICORE__ == 220
223- if ASCEND_IS_AIV {
224-#endif
225 TEventID eventID = GetTPipePtr()->AllocEventID<HardEvent::V_MTE2>();222 TEventID eventID = GetTPipePtr()->AllocEventID<HardEvent::V_MTE2>();
226 SetFlag<HardEvent::V_MTE2>(eventID);223 SetFlag<HardEvent::V_MTE2>(eventID);
227 WaitFlag<HardEvent::V_MTE2>(eventID);224 WaitFlag<HardEvent::V_MTE2>(eventID);
228 GetTPipePtr()->ReleaseEventID<HardEvent::V_MTE2>(eventID);225 GetTPipePtr()->ReleaseEventID<HardEvent::V_MTE2>(eventID);
229 int64_t offset = colIndex * COL_TEMPLATE;226 int64_t offset = colIndex * COL_TEMPLATE;
230-#if __CCE_AICORE__ == 220 227+#if __CCE_AICORE__ == 220
231- DataCopyExtParams copyInParams{228+ if ASCEND_IS_AIV {
232- static_cast<uint16_t>(rowSize),229+ DataCopyExtParams copyInParams{
233- (uint32_t)(colSize * sizeof(float)),230+ static_cast<uint16_t>(rowSize),
234- (uint32_t)((chunkSize - colSize) * sizeof(float)),231+ (uint32_t)(colSize * sizeof(float)),
235- static_cast<uint32_t>((COL_TEMPLATE - colSize) / FLOAT_ALIGN),232+ (uint32_t)((chunkSize - colSize) * sizeof(float)),
236- 0233+ static_cast<uint32_t>((COL_TEMPLATE - colSize) / FLOAT_ALIGN),
237- };234+ 0
238- DataCopyPadExtParams<float> padParams{235+ };
239- false,236+ DataCopyPadExtParams<float> padParams{
240- 0,237+ false,
241- static_cast<uint8_t>(rightPad),238+ 0,
242- 0239+ static_cast<uint8_t>(rightPad),
243- };240+ 0
244- DataCopyPad(deterministicStruct.buffer1_, deterministicStruct.workspaceGmOri_[offset], copyInParams, padParams);241+ };
242+ DataCopyPad(deterministicStruct.buffer1_, deterministicStruct.workspaceGmOri_[offset], copyInParams, padParams);
243+ }
245#else244#else
246 DataCopyParams intriParams; 245 DataCopyParams intriParams;
247 intriParams.blockCount = rowSize; 246 intriParams.blockCount = rowSize;
@@ -250,9 +249,6 @@ __aicore__ inline void dCopyIn(int64_t colIndex, int64_t colSize, int64_t rowSiz
250 intriParams.dstStride = (COL_TEMPLATE - (colSize + rightPad)) / FLOAT_ALIGN; 249 intriParams.dstStride = (COL_TEMPLATE - (colSize + rightPad)) / FLOAT_ALIGN;
251 DataCopy(deterministicStruct.buffer1_, deterministicStruct.workspaceGmOri_[offset], intriParams);250 DataCopy(deterministicStruct.buffer1_, deterministicStruct.workspaceGmOri_[offset], intriParams);
252#endif251#endif
253-#if __CCE_AICORE__ == 220
254- }
255-#endif
256}252}
257 253 
258__aicore__ inline void dCompute(int64_t colIndex, int64_t rowIndex, int64_t colSize, int64_t rowSize, deterministic_struct& deterministicStruct) {254__aicore__ inline void dCompute(int64_t colIndex, int64_t rowIndex, int64_t colSize, int64_t rowSize, deterministic_struct& deterministicStruct) {
@@ -124,7 +124,7 @@ public:
124 124 
125 __aicore__ inline void InitInputQue()125 __aicore__ inline void InitInputQue()
126 {126 {
127- ubFactorAlign_ = (ubFactor_ * colValAlign_) > (blockDim_ * 64) ? (ubFactor_ * colValAlign_) : (blockDim_ * 64);127+ ubFactorAlign_ = (ubFactor_ * colValAlign_) > (blockDim_ * COL_TEMPLATE) ? (ubFactor_ * colValAlign_) : (blockDim_ * COL_TEMPLATE);
128 rstdLen_ = (ubFactor_ + alignLen_ - 1) / alignLen_ * alignLen_;128 rstdLen_ = (ubFactor_ + alignLen_ - 1) / alignLen_ * alignLen_;
129 bufferLenSize_ = ubFactorAlign_ * sizeof(float);129 bufferLenSize_ = ubFactorAlign_ * sizeof(float);
130 bufferNum_ = BUFFER_NUM_DB;130 bufferNum_ = BUFFER_NUM_DB;