18
csrc/scripts/opgen/template/add/op_host/CMakeLists.txt
Normal file
18
csrc/scripts/opgen/template/add/op_host/CMakeLists.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
# 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.
|
||||
# See LICENSE in the root of the software repository for the full text of the License.
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
add_op_to_compiled_list()
|
||||
|
||||
if (BUILD_OPEN_PROJECT)
|
||||
target_sources(op_host_aclnn PRIVATE
|
||||
add_example_def.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
add_modules_sources(OPTYPE add_example ACLNNTYPE aclnn)
|
||||
55
csrc/scripts/opgen/template/add/op_host/add_example_def.cpp
Normal file
55
csrc/scripts/opgen/template/add/op_host/add_example_def.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
* CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
* Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
* See LICENSE in the root of the software repository for the full text of the License.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \file add_example_def.cpp
|
||||
* \brief
|
||||
*/
|
||||
#include "register/op_def_registry.h"
|
||||
|
||||
namespace ops {
|
||||
class AddExample : public OpDef {
|
||||
public:
|
||||
explicit AddExample(const char* name) : OpDef(name)
|
||||
{
|
||||
// 输入参数说明
|
||||
this->Input("x1") // 输入x1定义
|
||||
.ParamType(REQUIRED) // 必选输入
|
||||
.DataType({ge::DT_FLOAT, ge::DT_INT32}) // 支持数据类型
|
||||
.Format({ge::FORMAT_ND, ge::FORMAT_ND}) // 支持format格式
|
||||
.UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND}) // 未确定大小shape对应format格式
|
||||
.AutoContiguous(); // 内存自动连续化
|
||||
this->Input("x2") // 输入x2定义
|
||||
.ParamType(REQUIRED)
|
||||
.DataType({ge::DT_FLOAT, ge::DT_INT32})
|
||||
.Format({ge::FORMAT_ND, ge::FORMAT_ND})
|
||||
.UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND})
|
||||
.AutoContiguous();
|
||||
this->Output("y") // 输出y定义
|
||||
.ParamType(REQUIRED)
|
||||
.DataType({ge::DT_FLOAT, ge::DT_INT32})
|
||||
.Format({ge::FORMAT_ND, ge::FORMAT_ND})
|
||||
.UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND})
|
||||
.AutoContiguous();
|
||||
|
||||
OpAICoreConfig aicoreConfig;
|
||||
aicoreConfig.DynamicCompileStaticFlag(true)
|
||||
.DynamicFormatFlag(false)
|
||||
.DynamicRankSupportFlag(true)
|
||||
.DynamicShapeSupportFlag(true)
|
||||
.NeedCheckSupportFlag(false)
|
||||
.PrecisionReduceFlag(true)
|
||||
.ExtendCfgInfo("opFile.value", "add_example"); // 这里制定的值会对应到kernel入口文件名.cpp
|
||||
this->AICore().AddConfig("ascend910b", aicoreConfig); // 其他的soc版本补充部分配置项
|
||||
this->AICore().AddConfig("ascend910_93", aicoreConfig);
|
||||
}
|
||||
};
|
||||
OP_ADD(AddExample); // 添加算子信息库
|
||||
} // namespace ops
|
||||
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
* CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
* Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
* See LICENSE in the root of the software repository for the full text of the License.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \file add_example_infer.cpp
|
||||
* \brief
|
||||
*/
|
||||
#include "register/op_impl_registry.h"
|
||||
#include "log/log.h"
|
||||
|
||||
using namespace ge;
|
||||
|
||||
namespace ops {
|
||||
static constexpr int64_t IDX_0 = 0;
|
||||
|
||||
static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context)
|
||||
{
|
||||
OP_LOGD(context->GetNodeName(), "Begin to do InferShapeAddExample");
|
||||
|
||||
// get input shapes
|
||||
const gert::Shape* xShape = context->GetInputShape(IDX_0);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, xShape);
|
||||
|
||||
// get output shapes
|
||||
gert::Shape* yShape = context->GetOutputShape(IDX_0);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, yShape);
|
||||
|
||||
// 填充输出shape大小
|
||||
auto xShapeSize = xShape->GetDimNum();
|
||||
yShape->SetDimNum(xShapeSize);
|
||||
for (size_t i = 0; i < xShapeSize; i++) {
|
||||
int64_t dim = xShape->GetDim(i);
|
||||
yShape->SetDim(i, dim);
|
||||
}
|
||||
|
||||
OP_LOGD(context->GetNodeName(), "End to do InferShapeAddExample");
|
||||
return GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
IMPL_OP_INFERSHAPE(AddExample).InferShape(InferShapeAddExample);
|
||||
} // namespace ops
|
||||
156
csrc/scripts/opgen/template/add/op_host/add_example_tiling.cpp
Normal file
156
csrc/scripts/opgen/template/add/op_host/add_example_tiling.cpp
Normal file
@@ -0,0 +1,156 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||||
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||||
* CANN Open Software License Agreement Version 2.0 (the "License").
|
||||
* Please refer to the License for details. You may not use this file except in compliance with the License.
|
||||
* 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.
|
||||
* See LICENSE in the root of the software repository for the full text of the License.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \file add_example_tiling.cpp
|
||||
* \brief
|
||||
*/
|
||||
|
||||
#include "log/log.h"
|
||||
#include "util/math_util.h"
|
||||
#include "tiling_base/tiling_util.h"
|
||||
#include "tiling_base/tiling_templates_registry.h"
|
||||
#include "../op_kernel/add_example_tiling_data.h"
|
||||
#include "../op_kernel/add_example_tiling_key.h"
|
||||
|
||||
namespace optiling {
|
||||
|
||||
using namespace Ops::Transformer::OpTiling;
|
||||
|
||||
const uint32_t BLOCK_DIM = 8;
|
||||
const int64_t TILE_NUM = 8;
|
||||
const uint32_t WS_SYS_SIZE = 16U * 1024U * 1024U;
|
||||
const int32_t DIMS_LIMIT = 4;
|
||||
constexpr int32_t ATTRPOS0 = 0;
|
||||
constexpr uint32_t INDEXZERO = 0;
|
||||
constexpr uint32_t INDEXONE = 1;
|
||||
constexpr uint32_t INDEXTWO = 2;
|
||||
constexpr uint32_t INDEXTHREE = 3;
|
||||
|
||||
struct AddExampleCompileInfo {};
|
||||
|
||||
// 获取平台信息如ubSize, coreNum
|
||||
static ge::graphStatus GetPlatformInfo(gert::TilingContext* context, uint64_t& ubSize, int64_t& coreNum)
|
||||
{
|
||||
// 获取ubsize coreNum
|
||||
fe::PlatFormInfos* platformInfoPtr = context->GetPlatformInfo();
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, platformInfoPtr);
|
||||
auto ascendcPlatform = platform_ascendc::PlatformAscendC(platformInfoPtr);
|
||||
coreNum = ascendcPlatform.GetCoreNumAiv();
|
||||
OP_CHECK_IF(coreNum == 0, OP_LOGE(context, "coreNum is 0"), return ge::GRAPH_FAILED);
|
||||
ascendcPlatform.GetCoreMemSize(platform_ascendc::CoreMemType::UB, ubSize);
|
||||
OP_CHECK_IF(ubSize == 0, OP_LOGE(context, "ubSize is 0"), return ge::GRAPH_FAILED);
|
||||
return ge::GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
// 获取属性,shape信息
|
||||
ge::graphStatus GetShapeAttrsInfo(gert::TilingContext* context, int64_t& totalIdx, ge::DataType& dataType)
|
||||
{
|
||||
// 获取输入shape信息
|
||||
auto inputX = context->GetInputShape(0);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, inputX);
|
||||
// 如果输入shape 是标量 转换为{1},否则保持原 shape 不变
|
||||
auto inputShapeX = EnsureNotScalar(inputX->GetStorageShape());
|
||||
auto inputY = context->GetInputShape(1);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, inputY);
|
||||
auto inputShapeY = EnsureNotScalar(inputY->GetStorageShape());
|
||||
auto outZ = context->GetOutputShape(0);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, outZ);
|
||||
auto outShapeZ = EnsureNotScalar(outZ->GetStorageShape());
|
||||
|
||||
// shape校验
|
||||
OP_CHECK_IF(
|
||||
inputShapeX.GetDimNum() != DIMS_LIMIT || inputShapeY.GetDimNum() != DIMS_LIMIT ||
|
||||
outShapeZ.GetDimNum() != DIMS_LIMIT,
|
||||
OP_LOGE(
|
||||
context, "AddExample: inputx,inputy,outputz shape dim = %zu, %zu, %zu, should be equal 4",
|
||||
inputShapeX.GetDimNum(), inputShapeY.GetDimNum(), outShapeZ.GetDimNum()),
|
||||
return ge::GRAPH_FAILED);
|
||||
|
||||
// 获取shape dim值
|
||||
auto nDim = inputShapeX.GetDim(INDEXZERO);
|
||||
auto cDim = inputShapeX.GetDim(INDEXONE);
|
||||
auto hDim = inputShapeX.GetDim(INDEXTWO);
|
||||
auto wDim = inputShapeX.GetDim(INDEXTHREE);
|
||||
totalIdx = nDim * cDim * hDim * wDim;
|
||||
// dtype校验
|
||||
const std::set<ge::DataType> supportedDtype = {ge::DT_FLOAT, ge::DT_INT32};
|
||||
auto inputDesc = context->GetInputDesc(0);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, inputDesc);
|
||||
dataType = inputDesc->GetDataType();
|
||||
if (supportedDtype.count(dataType) == 0) {
|
||||
OP_LOGE(context, "invalid dtype");
|
||||
return ge::GRAPH_FAILED;
|
||||
}
|
||||
return ge::GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
ge::graphStatus GetWorkspaceSize(gert::TilingContext* context)
|
||||
{
|
||||
size_t* currentWorkspace = context->GetWorkspaceSizes(1);
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, currentWorkspace);
|
||||
currentWorkspace[0] = WS_SYS_SIZE;
|
||||
return ge::GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
// tiling 分发入口
|
||||
static ge::graphStatus AddExampleTilingFunc(gert::TilingContext* context)
|
||||
{
|
||||
// 1、获取平台运行信息
|
||||
uint64_t ubSize;
|
||||
int64_t coreNum;
|
||||
OP_CHECK_IF(
|
||||
GetPlatformInfo(context, ubSize, coreNum) != ge::GRAPH_SUCCESS, OP_LOGE(context, "GetPlatformInfo error"),
|
||||
return ge::GRAPH_FAILED);
|
||||
// 2、获取shape、属性信息
|
||||
int64_t totalIdx;
|
||||
ge::DataType dataType;
|
||||
|
||||
OP_CHECK_IF(
|
||||
GetShapeAttrsInfo(context, totalIdx, dataType) != ge::GRAPH_SUCCESS,
|
||||
OP_LOGE(context, "GetShapeAttrsInfo error"), return ge::GRAPH_FAILED);
|
||||
// 3、获取WorkspaceSize信息
|
||||
OP_CHECK_IF(
|
||||
GetWorkspaceSize(context) != ge::GRAPH_SUCCESS, OP_LOGE(context, "GetWorkspaceSize error"),
|
||||
return ge::GRAPH_FAILED);
|
||||
|
||||
// 4、设置tiling信息
|
||||
AddExampleTilingData* tiling = context->GetTilingData<AddExampleTilingData>();
|
||||
OP_CHECK_NULL_WITH_CONTEXT(context, tiling);
|
||||
OP_CHECK_IF(
|
||||
memset_s(tiling, sizeof(AddExampleTilingData), 0, sizeof(AddExampleTilingData)) != EOK,
|
||||
OP_LOGE(context, "set tiling data error"), return ge::GRAPH_FAILED);
|
||||
tiling->totalLength = totalIdx;
|
||||
tiling->tileNum = TILE_NUM;
|
||||
|
||||
context->SetBlockDim(BLOCK_DIM);
|
||||
uint64_t tilingKey = 0;
|
||||
// 区分dtype走不同得tiling key分支.
|
||||
if (dataType == ge::DT_FLOAT) {
|
||||
tilingKey = GET_TPL_TILING_KEY(ELEMENTWISE_TPL_SCH_MODE_0);
|
||||
context->SetTilingKey(tilingKey);
|
||||
} else if (dataType == ge::DT_INT32) {
|
||||
tilingKey = GET_TPL_TILING_KEY(ELEMENTWISE_TPL_SCH_MODE_1);
|
||||
context->SetTilingKey(tilingKey);
|
||||
} else {
|
||||
OP_LOGE(context, "get dtype error");
|
||||
return ge::GRAPH_FAILED;
|
||||
}
|
||||
return ge::GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
static ge::graphStatus TilingParseForAddExample([[maybe_unused]] gert::TilingParseContext* context)
|
||||
{
|
||||
return ge::GRAPH_SUCCESS;
|
||||
}
|
||||
|
||||
// tiling注册入口.
|
||||
IMPL_OP_OPTILING(AddExample).Tiling(AddExampleTilingFunc).TilingParse<AddExampleCompileInfo>(TilingParseForAddExample);
|
||||
} // namespace optiling
|
||||
Reference in New Issue
Block a user