!3869 remove redundant compilation of libtvm.so and mindspore/_akg directory
Merge pull request !3869 from looop5/remove_redundant_code_in_gpupull/3869/MERGE
commit
2b6ac46a03
@ -1 +1 @@
|
||||
Subproject commit 949a45538ccb7ae94ad73386b5e3e77005112eea
|
||||
Subproject commit 5fe7e5c8377dccfd35c9f661e10ed3dc136208c5
|
@ -1,7 +0,0 @@
|
||||
mindspore_add_pkg(dlpack
|
||||
VER 0.2
|
||||
HEAD_ONLY ./
|
||||
URL https://github.com/dmlc/dlpack/archive/0acb731e0e43d15deee27b66f10e4c5b4e667913.zip
|
||||
MD5 6b8093f17ad4e830d3c63eb3171c4b45)
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
mindspore_add_pkg(dmlc-core
|
||||
VER 0.3
|
||||
HEAD_ONLY ./
|
||||
URL https://github.com/dmlc/dmlc-core/archive/808f485387f9a03f78fa9f1159f387d0d91b7a28.zip
|
||||
MD5 ea36f94c57752bf40fb02dfc362f1ed9)
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
mindspore_add_pkg(rang
|
||||
VER 3.1.0
|
||||
HEAD_ONLY ./
|
||||
URL https://github.com/agauniyal/rang/archive/cabe04d6d6b05356fa8f9741704924788f0dd762.zip
|
||||
MD5 0c5c9b251fea9ee7ce32f188655be0ea)
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
set(incubator_tvm_gpu_CXXFLAGS "-D_FORTIFY_SOURCE=2 -O2")
|
||||
set(incubator_tvm_gpu_CFLAGS "-D_FORTIFY_SOURCE=2 -O2")
|
||||
mindspore_add_pkg(incubator_tvm_gpu
|
||||
VER 0.6.0
|
||||
LIBS tvm
|
||||
URL https://github.com/apache/incubator-tvm/archive/v0.6.0.tar.gz
|
||||
MD5 9cbbd32545a776023acabbba270449fe
|
||||
CUSTOM_CMAKE ${CMAKE_SOURCE_DIR}/third_party/patch/incubator-tvm/
|
||||
SUBMODULES ${dlpack_DIRPATH} ${dmlc-core_DIRPATH} ${rang_DIRPATH}
|
||||
SOURCEMODULES topi/python/topi python/tvm
|
||||
PATCHES ${CMAKE_SOURCE_DIR}/third_party/patch/incubator-tvm/find_library.patch
|
||||
${CMAKE_SOURCE_DIR}/third_party/patch/incubator-tvm/include.patch
|
||||
${CMAKE_SOURCE_DIR}/third_party/patch/incubator-tvm/src_pass.patch
|
||||
CMAKE_OPTION " ")
|
||||
add_library(mindspore::tvm ALIAS incubator_tvm_gpu::tvm)
|
@ -1,18 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""__init__"""
|
||||
from . import add_path
|
||||
from .op_build import op_build
|
||||
from .message import compilewithjson
|
@ -1,62 +0,0 @@
|
||||
# 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.
|
||||
|
||||
"""add tvm path"""
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
def AKGAddPath():
|
||||
"""_akg add path."""
|
||||
pwd = os.path.dirname(os.path.realpath(__file__))
|
||||
tvm_path = os.path.realpath(pwd)
|
||||
if tvm_path not in sys.path:
|
||||
sys.path.insert(0, tvm_path)
|
||||
else:
|
||||
sys.path.remove(tvm_path)
|
||||
sys.path.insert(0, tvm_path)
|
||||
|
||||
|
||||
class AKGMetaPathFinder:
|
||||
"""class AKGMetaPath finder."""
|
||||
|
||||
def find_module(self, fullname, path=None):
|
||||
"""method _akg find module."""
|
||||
_ = path
|
||||
if fullname.startswith("_akg.tvm"):
|
||||
rname = fullname[5:]
|
||||
return AKGMetaPathLoader(rname)
|
||||
if fullname.startswith("_akg.topi"):
|
||||
rname = fullname[5:]
|
||||
return AKGMetaPathLoader(rname)
|
||||
return None
|
||||
|
||||
|
||||
class AKGMetaPathLoader:
|
||||
"""class AKGMetaPathLoader loader."""
|
||||
|
||||
def __init__(self, rname):
|
||||
self.__rname = rname
|
||||
|
||||
def load_module(self, fullname):
|
||||
if self.__rname in sys.modules:
|
||||
sys.modules.pop(self.__rname)
|
||||
AKGAddPath()
|
||||
__import__(self.__rname, globals(), locals())
|
||||
self.__target_module = sys.modules[self.__rname]
|
||||
sys.modules[fullname] = self.__target_module
|
||||
return self.__target_module
|
||||
|
||||
|
||||
sys.meta_path.insert(0, AKGMetaPathFinder())
|
@ -1,39 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""__init__"""
|
||||
from .equal import Equal
|
||||
from .equal import gpu_schedule_Equal
|
||||
from .tile import Tile
|
||||
from .tile import gpu_schedule_Tile
|
||||
from .cast import Cast
|
||||
from .cast import gpu_schedule_Cast
|
||||
from .relu6 import ReLU6, gpu_schedule_ReLU6
|
||||
from .relu6_grad import ReLU6Grad, gpu_schedule_ReLU6Grad
|
||||
from .squeeze import Squeeze, gpu_schedule_Squeeze
|
||||
from .squeeze_grad import SqueezeGrad, gpu_schedule_SqueezeGrad
|
||||
from .mean import SimpleMean, gpu_schedule_SimpleMean
|
||||
from .mean_grad import SimpleMeanGrad, gpu_schedule_SimpleMeanGrad
|
||||
from .mul import Mul, gpu_schedule_Mul
|
||||
from .hsigmoid import HSigmoid, gpu_schedule_HSigmoid
|
||||
from .hsigmoid_grad import HSigmoidGrad, gpu_schedule_HSigmoidGrad
|
||||
from .hswish import HSwish, gpu_schedule_HSwish
|
||||
from .hswish_grad import HSwishGrad, gpu_schedule_HSwishGrad
|
||||
from .logical_or import LogicalOr, gpu_schedule_LogicalOr
|
||||
from .logical_not import LogicalNot, gpu_schedule_LogicalNot
|
||||
from .logical_and import LogicalAnd, gpu_schedule_LogicalAnd
|
||||
from .sub import Sub, gpu_schedule_Sub
|
||||
from .less_equal import LessEqual, gpu_schedule_LessEqual
|
||||
from .notequal import NotEqual, gpu_schedule_NotEqual
|
||||
from .greater_equal import GreaterEqual, gpu_schedule_GreaterEqual
|
@ -1,45 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""cast"""
|
||||
import logging
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import cast
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def Cast(x, dst_type):
|
||||
"""cast."""
|
||||
if x.dtype == "int64" and dst_type == "float16":
|
||||
x = cast.cast(x, "float32")
|
||||
return cast.cast(x, dst_type)
|
||||
|
||||
|
||||
def gpu_schedule_Cast(outs):
|
||||
"""
|
||||
gpu schedule for cast.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
logging.info("Skip because %s is not enabled", device)
|
||||
return None
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,56 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""default schedule function for GPU"""
|
||||
from queue import Queue
|
||||
|
||||
import _akg.tvm as tvm
|
||||
|
||||
DEFAULT_GPU_THREAD = 1024
|
||||
|
||||
|
||||
def default_schedule(outs):
|
||||
"""
|
||||
default schedule function.
|
||||
|
||||
Args:
|
||||
outs (Union[tvm.tensor.Tensor, list[tvm.tensor.Tensor]]): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
if not isinstance(outs, tvm.tensor.Tensor) and not isinstance(outs, list):
|
||||
raise ValueError("outs should be list of _akg.tvm.tensor.Tensor or _akg.tvm.tensor.Tensor")
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
outs_list = [outs] if isinstance(outs, tvm.tensor.Tensor) else outs
|
||||
with tvm.target.create(device):
|
||||
sch = tvm.create_schedule(outs_list[0].op)
|
||||
outputs_tensor = Queue()
|
||||
outputs_tensor.put(outs_list[0])
|
||||
op_list = []
|
||||
while not outputs_tensor.empty():
|
||||
out = outputs_tensor.get()
|
||||
if out.op not in op_list and isinstance(out.op, tvm.tensor.ComputeOp):
|
||||
op_list.append(out.op)
|
||||
for input_tensor in out.op.input_tensors:
|
||||
outputs_tensor.put(input_tensor)
|
||||
for op in op_list:
|
||||
stage = sch[op.output(0)]
|
||||
bx, tx = stage.split(op.axis[0], factor=DEFAULT_GPU_THREAD)
|
||||
stage.bind(bx, tvm.thread_axis("blockIdx.x"))
|
||||
stage.bind(tx, tvm.thread_axis("threadIdx.x"))
|
||||
return sch
|
@ -1,40 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
"""equal"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import equal
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def Equal(x, y):
|
||||
"""equal."""
|
||||
return equal.equal(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_Equal(outs):
|
||||
"""
|
||||
gpu schedule for Equal.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,41 +0,0 @@
|
||||
# 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.
|
||||
|
||||
"""greater_equal"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import greater_equal
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def GreaterEqual(x, y):
|
||||
"""GreaterEqual."""
|
||||
return greater_equal.greater_equal(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_GreaterEqual(outs):
|
||||
"""
|
||||
GPU schedule for GreaterEqual.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): Outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,63 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""hsigmoid"""
|
||||
import _akg.topi as topi
|
||||
import _akg.tvm as tvm
|
||||
from _akg.topi import tag
|
||||
|
||||
|
||||
@tvm.tag_scope(tag=tag.ELEMWISE)
|
||||
def topi_nn_hsigmoid(x):
|
||||
"""
|
||||
topi hsigmoid
|
||||
Args:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return tvm.compute(x.shape, lambda *i: tvm.if_then_else(x(*i) <= -3, 0,
|
||||
tvm.if_then_else(x(*i) >= 3, 1,
|
||||
(x(*i) + 3) / 6)))
|
||||
|
||||
|
||||
def HSigmoid(x):
|
||||
"""
|
||||
HSigmoid
|
||||
Args:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return topi_nn_hsigmoid(x)
|
||||
|
||||
|
||||
def gpu_schedule_HSigmoid(outs):
|
||||
"""
|
||||
gpu schedule HSigmoid
|
||||
Args:
|
||||
outs:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with tvm.target.create(device):
|
||||
sch = topi.cuda.schedule_elemwise(outs)
|
||||
return sch
|
@ -1,51 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""HSigmoid grad"""
|
||||
import _akg.topi as topi
|
||||
import _akg.tvm as tvm
|
||||
|
||||
|
||||
def HSigmoidGrad(y_grad, x):
|
||||
"""
|
||||
HSigmoidGrad
|
||||
Args:
|
||||
y_grad:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return tvm.compute(x.shape, lambda *i: tvm.if_then_else(x(*i) <= -3, 0,
|
||||
tvm.if_then_else(x(*i) >= 3, 0,
|
||||
y_grad(*i) / 6)))
|
||||
|
||||
|
||||
def gpu_schedule_HSigmoidGrad(outs):
|
||||
"""
|
||||
gpu schedule ReLU6Grad
|
||||
Args:
|
||||
outs:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
|
||||
with tvm.target.create(device):
|
||||
sch = topi.cuda.schedule_elemwise(outs)
|
||||
return sch
|
@ -1,63 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""HSwish"""
|
||||
import _akg.topi as topi
|
||||
import _akg.tvm as tvm
|
||||
from _akg.topi import tag
|
||||
|
||||
|
||||
@tvm.tag_scope(tag=tag.ELEMWISE)
|
||||
def topi_nn_HSwish(x):
|
||||
"""
|
||||
topi HSwish
|
||||
Args:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return tvm.compute(x.shape, lambda *i: tvm.if_then_else(x(*i) <= -3, 0,
|
||||
tvm.if_then_else(x(*i) >= 3, x(*i),
|
||||
x(*i) * (x(*i) + 3) / 6)))
|
||||
|
||||
|
||||
def HSwish(x):
|
||||
"""
|
||||
HSwish
|
||||
Args:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return topi_nn_HSwish(x)
|
||||
|
||||
|
||||
def gpu_schedule_HSwish(outs):
|
||||
"""
|
||||
gpu schedule HSwish
|
||||
Args:
|
||||
outs:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with tvm.target.create(device):
|
||||
sch = topi.cuda.schedule_elemwise(outs)
|
||||
return sch
|
@ -1,53 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""HSwishGrad"""
|
||||
import _akg.topi as topi
|
||||
import _akg.tvm as tvm
|
||||
|
||||
|
||||
def HSwishGrad(y_grad, x):
|
||||
"""
|
||||
HSwishGrad
|
||||
Args:
|
||||
y_grad:
|
||||
x:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
shape = x.shape
|
||||
|
||||
res0 = tvm.compute(shape, lambda *i: tvm.if_then_else(x(*i) <= -3, 0, y_grad(*i) * (2 * x(*i) + 3) / 6))
|
||||
res6 = tvm.compute(shape, lambda *i: tvm.if_then_else(x(*i) >= 3, y_grad(*i), res0(*i)))
|
||||
return res6
|
||||
|
||||
|
||||
def gpu_schedule_HSwishGrad(outs):
|
||||
"""
|
||||
gpu schedule HSwishGrad
|
||||
Args:
|
||||
outs:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
|
||||
with tvm.target.create(device):
|
||||
sch = topi.cuda.schedule_elemwise(outs)
|
||||
return sch
|
@ -1,40 +0,0 @@
|
||||
# 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.
|
||||
"""less_equal"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import less_equal
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def LessEqual(x, y):
|
||||
"""LessEqual."""
|
||||
return less_equal.less_equal(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_LessEqual(outs):
|
||||
"""
|
||||
GPU schedule for LessEqual.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): Outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,40 +0,0 @@
|
||||
# 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.
|
||||
"""logical_and"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import logical_and
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def LogicalAnd(x, y):
|
||||
"""LogicalAnd."""
|
||||
return logical_and.logical_and(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_LogicalAnd(outs):
|
||||
"""
|
||||
GPU schedule for LogicalAnd.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,40 +0,0 @@
|
||||
# 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.
|
||||
"""logical_not"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import logical_not
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def LogicalNot(x):
|
||||
"""LogicalNot."""
|
||||
return logical_not.logical_not(x)
|
||||
|
||||
|
||||
def gpu_schedule_LogicalNot(outs):
|
||||
"""
|
||||
GPU schedule for LogicalNot.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,40 +0,0 @@
|
||||
# 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.
|
||||
"""logical_or"""
|
||||
import _akg.tvm
|
||||
from _akg.ops.math import logical_or
|
||||
from _akg.topi.generic import schedule_elemwise
|
||||
|
||||
def LogicalOr(x, y):
|
||||
"""LogicalOr."""
|
||||
return logical_or.logical_or(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_LogicalOr(outs):
|
||||
"""
|
||||
GPU schedule for LogicalOr.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = _akg.tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with _akg.tvm.target.create(device):
|
||||
sch = schedule_elemwise(outs)
|
||||
return sch
|
@ -1,80 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""mean op compute and schedule"""
|
||||
import _akg.tvm as tvm
|
||||
from _akg.ops.math.mean import mean
|
||||
from .default_schedule import DEFAULT_GPU_THREAD
|
||||
|
||||
def Mean(x, axis=None, keepdims=True):
|
||||
"""mean."""
|
||||
outs = mean(x, axis, keepdims)
|
||||
|
||||
# remove useless mean_output
|
||||
if isinstance(outs, tuple):
|
||||
outs = outs[0]
|
||||
if outs.op.name == "mean_output":
|
||||
outs = outs.op.input_tensors[0]
|
||||
return outs
|
||||
|
||||
|
||||
def gpu_schedule_Mean(outs):
|
||||
"""
|
||||
gpu schedule function for mean.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
out = outs[0] if isinstance(outs, list) else outs
|
||||
|
||||
device = "cuda"
|
||||
with tvm.target.create(device):
|
||||
sch = tvm.create_schedule(out.op)
|
||||
if out.op.name == "T_divide":
|
||||
tensor_c = out
|
||||
else: # squeeze
|
||||
tensor_c = out.op.input_tensors[0]
|
||||
|
||||
tensor_b = tensor_c.op.input_tensors[0]
|
||||
if len(tensor_c.op.axis) >= 2:
|
||||
sch[tensor_b].compute_at(sch[tensor_c], tensor_c.op.axis[1])
|
||||
else:
|
||||
sch[tensor_b].compute_at(sch[tensor_c], tensor_c.op.axis[0])
|
||||
|
||||
bx, tx = sch[tensor_c].split(tensor_c.op.axis[0], factor=DEFAULT_GPU_THREAD)
|
||||
sch[tensor_c].bind(bx, tvm.thread_axis("blockIdx.x"))
|
||||
sch[tensor_c].bind(tx, tvm.thread_axis("threadIdx.x"))
|
||||
return sch
|
||||
|
||||
def SimpleMean(x):
|
||||
"""
|
||||
SimpleMean compute the mean of the input 4D Tensor over last two axises and keep reduced dimensions.
|
||||
|
||||
Args:
|
||||
x (tvm.tensor.Tensor): Tensor of type float16, float32.
|
||||
|
||||
Returns:
|
||||
tvm.tensor.Tensor, has the same type as x, output shape will be (a, b, 1, 1) if input Tensor x is (a, b, c, d).
|
||||
"""
|
||||
axis = (2, 3)
|
||||
keepdims = True
|
||||
return Mean(x, axis, keepdims)
|
||||
|
||||
|
||||
def gpu_schedule_SimpleMean(outs):
|
||||
"""gpu schedule function for SimpleMean."""
|
||||
return gpu_schedule_Mean(outs)
|
@ -1,90 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""mean_grad"""
|
||||
import _akg.tvm as tvm
|
||||
import _akg
|
||||
from _akg.ops.math import mean
|
||||
from .default_schedule import DEFAULT_GPU_THREAD
|
||||
|
||||
|
||||
def mean_ad(head, input_shape, axis, keepdims):
|
||||
"""mean autodiff."""
|
||||
tensor_a = tvm.placeholder(input_shape, head.dtype, "A")
|
||||
tensor_b = mean.mean(tensor_a, axis, keepdims)
|
||||
|
||||
# remove useless mean_output
|
||||
if isinstance(tensor_b, tuple):
|
||||
tensor_b = tensor_b[0]
|
||||
if tensor_b.op.name == "mean_output":
|
||||
tensor_b = tensor_b.op.input_tensors[0]
|
||||
|
||||
jacs = list(_akg.differentiate(tensor_b, [tensor_a], head))
|
||||
return jacs[0]
|
||||
|
||||
|
||||
def MeanGrad(y_grad, input_shape, axis=None, keepdims=True):
|
||||
"""Mean Grad."""
|
||||
if axis is None and not keepdims:
|
||||
raise ValueError("Mean not support (axis=None && keepdims=False) now")
|
||||
return mean_ad(y_grad, input_shape, axis, keepdims)
|
||||
|
||||
|
||||
def gpu_schedule_MeanGrad(outs):
|
||||
"""gpu schedule MeanGrad."""
|
||||
out = outs[0] if isinstance(outs, list) else outs
|
||||
|
||||
device = "cuda"
|
||||
with tvm.target.create(device):
|
||||
sch = tvm.create_schedule(out.op)
|
||||
tensor_c = out
|
||||
tensor_b = tensor_c.op.input_tensors[0]
|
||||
if len(tensor_c.op.axis) >= 2:
|
||||
sch[tensor_b].compute_at(sch[tensor_c], tensor_c.op.axis[1])
|
||||
else:
|
||||
sch[tensor_b].compute_at(sch[tensor_c], tensor_c.op.axis[0])
|
||||
|
||||
bx, tx = sch[tensor_c].split(tensor_c.op.axis[0], factor=DEFAULT_GPU_THREAD)
|
||||
sch[tensor_c].bind(bx, tvm.thread_axis("blockIdx.x"))
|
||||
sch[tensor_c].bind(tx, tvm.thread_axis("threadIdx.x"))
|
||||
|
||||
return sch
|
||||
|
||||
def SimpleMeanGrad(HEAD, input_shape):
|
||||
"""
|
||||
Compute Simple Mean Grad.
|
||||
|
||||
Args:
|
||||
HEAD (tvm.tensor.Tensor): output gradient, dy, defined in Primitive.
|
||||
input_shape (Union[list[int], tuple[int]]): shape of mean input, x.shape.
|
||||
|
||||
Returns:
|
||||
tvm.tensor.Tensor, gradient of mean input.
|
||||
"""
|
||||
axis = (2, 3)
|
||||
keepdims = True
|
||||
return MeanGrad(HEAD, input_shape, axis, keepdims)
|
||||
|
||||
|
||||
def gpu_schedule_SimpleMeanGrad(outs):
|
||||
"""
|
||||
gpu schedule SimpleMeanGrad.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
return gpu_schedule_MeanGrad(outs)
|
@ -1,41 +0,0 @@
|
||||
# Copyright 2019 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.
|
||||
|
||||
"""mul"""
|
||||
import _akg.topi as topi
|
||||
import _akg.tvm as tvm
|
||||
from _akg.ops.math import mul
|
||||
|
||||
def Mul(x, y):
|
||||
"""mul."""
|
||||
return mul.mul(x, y)
|
||||
|
||||
|
||||
def gpu_schedule_Mul(outs):
|
||||
"""
|
||||
gpu schedule for mul.
|
||||
|
||||
Args:
|
||||
outs (tvm.tensor.Tensor): outputs of compute.
|
||||
|
||||
Returns:
|
||||
sch (schedule.Schedule): The created schedule.
|
||||
"""
|
||||
device = 'cuda'
|
||||
ctx = tvm.context(device, 0)
|
||||
if not ctx.exist:
|
||||
raise SystemError("Skip because %s is not enabled" % device)
|
||||
with tvm.target.create(device):
|
||||
sch = topi.cuda.schedule_broadcast(outs)
|
||||
return sch
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue