test_tir_pass_lift_attr_scope.py 2.31 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
17
import tvm
18
from tvm import te
19 20

def test_coproc_lift():
21 22 23
    ib = tvm.tir.ir_builder.create()
    n = te.var("n")
    cp = te.thread_axis((0, 1), "cop")
24
    value = tvm.tir.StringImm("xxx")
25 26 27 28 29 30

    A = ib.allocate("float32", n, name="A", scope="global")
    with ib.for_range(0, n, name="i") as i:
        with ib.for_range(0, 10, name="j") as j:
            ib.scope_attr(cp, "coproc_uop_scope", value)
            A[i] = A[i] + 1
31 32 33 34
        with ib.if_scope(i.equal(0)):
            with ib.for_range(0, 10, name="j") as j:
                ib.scope_attr(cp, "coproc_uop_scope", value)
                A[j] = A[j] + 2
35 36
                A[j] = A[j] + 3
                A[j] = A[j] + 3
37
    body = ib.get()
38
    body = tvm.tir.ir_pass.LiftAttrScope(body, "coproc_uop_scope")
39 40
    assert body.body.body.node == cp

41
    # only able to lift to the common pattern of the last two fors.
42
    ib = tvm.tir.ir_builder.create()
43 44 45 46 47 48 49 50 51 52 53 54
    A = ib.allocate("float32", n, name="A", scope="global")
    with ib.for_range(0, n, name="i") as i:
        with ib.for_range(0, 10, name="j") as j:
            A[j] = A[j] + 1
        with ib.for_range(0, 10, name="j") as j:
            ib.scope_attr(cp, "coproc_uop_scope", value)
            A[i] = A[i] + 1
        with ib.for_range(0, 10, name="j") as j:
            ib.scope_attr(cp, "coproc_uop_scope", value)
            A[i] = A[i] + 2

    body = ib.get()
55
    body = tvm.tir.ir_pass.LiftAttrScope(body, "coproc_uop_scope")
56 57
    assert body.body.body.body[1].node == cp
    assert len(body.body.body.body) == 2
58 59 60

if __name__ == "__main__":
    test_coproc_lift()