You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.3 KiB
125 lines
3.3 KiB
5 years ago
|
# Copyright 2020 Huawei Technologies Co., Ltd
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
# ============================================================================
|
||
|
from __future__ import absolute_import
|
||
|
from te import tvm
|
||
|
from topi import generic
|
||
|
import te.lang.cce
|
||
|
from topi.cce import util
|
||
|
from te.platform.fusion_manager import fusion_manager
|
||
|
from mindspore.ops.op_info_register import op_info_register
|
||
|
|
||
|
# shape size limit for aicore is 2**31
|
||
|
SHAPE_SIZE_LIMIT = 200000000
|
||
|
|
||
|
@fusion_manager.register("square")
|
||
|
def square_compute(input_x, output_y, kernel_name="square"):
|
||
|
"""
|
||
|
algorithm: square
|
||
|
calculating data's square,y= x*x
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
input_x: TVM tensor
|
||
|
the placeholder of input data
|
||
|
output_y: dict
|
||
|
shape and dtype of output, should be same shape and type as input
|
||
|
kernel_name: str
|
||
|
cce kernel name, default value is square
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
res : tvm.tensor
|
||
|
the result of square
|
||
|
"""
|
||
|
res = te.lang.cce.vmul(input_x, input_x)
|
||
|
return res
|
||
|
|
||
|
@op_info_register("""{
|
||
|
"op_name": "CusSquare",
|
||
|
"imply_type": "TBE",
|
||
|
"fusion_type": "OPAQUE",
|
||
|
"async_flag": false,
|
||
|
"binfile_name": "square.so",
|
||
|
"compute_cost": 10,
|
||
|
"kernel_name": "CusSquare",
|
||
|
"partial_flag": true,
|
||
|
"attr": [
|
||
|
|
||
|
],
|
||
|
"inputs": [
|
||
|
{
|
||
|
"index": 0,
|
||
|
"dtype": [
|
||
|
"float32"
|
||
|
],
|
||
|
"format": [
|
||
|
"DefaultFormat"
|
||
|
],
|
||
|
"name": "x",
|
||
|
"need_compile": false,
|
||
|
"param_type": "required",
|
||
|
"shape": "all"
|
||
|
}
|
||
|
],
|
||
|
"outputs": [
|
||
|
{
|
||
|
"index": 0,
|
||
|
"dtype": [
|
||
|
"float32"
|
||
|
],
|
||
|
"format": [
|
||
|
"DefaultFormat"
|
||
|
],
|
||
|
"name": "y",
|
||
|
"need_compile": false,
|
||
|
"param_type": "required",
|
||
|
"shape": "all"
|
||
|
}
|
||
|
]
|
||
|
}""")
|
||
|
def CusSquare(input_x, output_y, kernel_name="square"):
|
||
|
"""
|
||
|
algorithm: square
|
||
|
calculating data's square,y= x*x
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
input_x : dict
|
||
|
shape and dtype of input, only support float32
|
||
|
output_y: dict
|
||
|
shape and dtype of output, should be same shape and type as input
|
||
|
kernel_name : str
|
||
|
kernel name, default value is "square"
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
None
|
||
|
"""
|
||
|
shape = input_x.get("shape")
|
||
|
dtype = input_x.get("dtype").lower()
|
||
|
|
||
|
shape = util.shape_refine(shape)
|
||
|
data = tvm.placeholder(shape, name="data", dtype=dtype.lower())
|
||
|
|
||
|
with tvm.target.cce():
|
||
|
res = square_compute(data, output_y, kernel_name)
|
||
|
sch = generic.auto_schedule(res)
|
||
|
|
||
|
config = {"print_ir": False,
|
||
|
"name": kernel_name,
|
||
|
"tensor_list": [data, res]}
|
||
|
|
||
|
te.lang.cce.cce_build_code(sch, config)
|