Line data Source code
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 :
11 : /*!
12 : * \file kernel_vec_binary_scalar_check.cpp
13 : * \brief
14 : */
15 :
16 : #include "kernel_check_params.h"
17 : #include "kernel_vec_binary_scalar_check.h"
18 :
19 : namespace AscendC {
20 : namespace check {
21 :
22 32 : bool TikcppVecBinaryScalarCheck::CommonCheck()
23 : {
24 32 : const std::string supportPos = "VECIN/VECOUT/VECCALC";
25 96 : ASCENDC_CHECK(CheckTensorScope(param_.dstLogicPos, static_cast<uint8_t>(HardWareIndex::UB), "dst", supportPos));
26 72 : ASCENDC_CHECK(CheckTensorScope(param_.src0LogicPos, static_cast<uint8_t>(HardWareIndex::UB), "src", supportPos));
27 72 : ASCENDC_CHECK(CheckTensorAddrAlign(param_.dstAddr, param_.dstPos, ONE_BLK_SIZE, "dst"));
28 72 : ASCENDC_CHECK(CheckTensorAddrAlign(param_.src0Addr, param_.src0Pos, ONE_BLK_SIZE, "src"));
29 72 : ASCENDC_CHECK(CheckBufferSizeOverFlow(
30 : param_.dstSize, GlobalParams::Instance().bufferSizeMap.at(param_.dstPos),
31 : "check dst tensor buffersize failed"));
32 72 : ASCENDC_CHECK(CheckBufferSizeOverFlow(
33 : param_.src0Size, GlobalParams::Instance().bufferSizeMap.at(param_.src0Pos),
34 : "check src tensor buffersize failed"));
35 24 : return true;
36 32 : }
37 :
38 16 : bool TikcppVecBinaryScalarCheck::CheckAllLowLevel(std::vector<uint64_t> maskArray)
39 : {
40 16 : uint32_t maxByteLen = std::max(param_.dstDtypeBytes, param_.src0DtypeBytes);
41 16 : ASCENDC_CHECK(UpdateMaskArrayAndCheck(maskArray, maxByteLen));
42 16 : ASCENDC_CHECK(CommonCheck());
43 :
44 : // check tensor overflow
45 : TensorOverflowParams params = {
46 12 : param_.dstSize,
47 12 : param_.dstDtypeBytes,
48 12 : static_cast<uint64_t>(param_.repeatTimes),
49 12 : static_cast<uint64_t>(param_.dstBlockStride),
50 12 : static_cast<uint64_t>(param_.dstRepeatStride),
51 12 : false};
52 : // check dst src0 tensor overflow
53 12 : if (Int4Setter::Instance().GetDstInt4()) {
54 0 : Int4Setter::Instance().SetInt4();
55 : }
56 36 : ASCENDC_CHECK(CheckTensorOverflowLow(maskArray, params, "dstLocal"));
57 8 : params = {
58 8 : param_.src0Size,
59 8 : param_.src0DtypeBytes,
60 8 : static_cast<uint64_t>(param_.repeatTimes),
61 8 : static_cast<uint64_t>(param_.src0BlockStride),
62 8 : static_cast<uint64_t>(param_.src0RepeatStride),
63 8 : false};
64 8 : if (Int4Setter::Instance().GetSrcInt4()) {
65 0 : Int4Setter::Instance().SetInt4();
66 : }
67 : #if defined(__NPU_ARCH__) && ((__NPU_ARCH__ == 3510) || (__NPU_ARCH__ == 5102))
68 : if (param_.enableFlexibleScalar != 0) {
69 : if (param_.scalarPos == 1) {
70 : ASCENDC_CHECK(CheckTensorOverflowLow(maskArray, params, "src0"));
71 : } else {
72 : ASCENDC_CHECK(CheckTensorOverflowLow(maskArray, params, "src1"));
73 : }
74 : } else {
75 : ASCENDC_CHECK(CheckTensorOverflowLow(maskArray, params, "srcLocal"));
76 : }
77 : #else
78 24 : ASCENDC_CHECK(CheckTensorOverflowLow(maskArray, params, "srcLocal"));
79 : #endif
80 8 : return true;
81 : }
82 :
83 16 : bool TikcppVecBinaryScalarCheck::CheckAllHighLevel()
84 : {
85 16 : ASCENDC_CHECK(CommonCheck());
86 12 : if (Int4Setter::Instance().GetDstInt4()) {
87 0 : Int4Setter::Instance().SetInt4();
88 : }
89 36 : ASCENDC_CHECK(CheckTensorOverflowHigh(param_.dstDtypeBytes, param_.dstSize, param_.calCount, "dstLocal"));
90 8 : if (Int4Setter::Instance().GetSrcInt4()) {
91 0 : Int4Setter::Instance().SetInt4();
92 : }
93 :
94 : #if defined(__NPU_ARCH__) && ((__NPU_ARCH__ == 3510) || (__NPU_ARCH__ == 5102))
95 : if (param_.enableFlexibleScalar != 0) {
96 : if (param_.scalarPos == 1) {
97 : ASCENDC_CHECK(CheckTensorOverflowHigh(param_.src0DtypeBytes, param_.src0Size, param_.calCount, "src0"));
98 : } else {
99 : ASCENDC_CHECK(CheckTensorOverflowHigh(param_.src0DtypeBytes, param_.src0Size, param_.calCount, "src1"));
100 : }
101 : } else {
102 : ASCENDC_CHECK(CheckTensorOverflowHigh(param_.src0DtypeBytes, param_.src0Size, param_.calCount, "srcLocal"));
103 : }
104 : #else
105 24 : ASCENDC_CHECK(CheckTensorOverflowHigh(param_.src0DtypeBytes, param_.src0Size, param_.calCount, "srcLocal"));
106 : #endif
107 8 : return true;
108 : }
109 :
110 : } // namespace check
111 : } // namespace AscendC
|