FFI 容器#
import tvm.ffi as tvm_ffi
数组#
a = tvm_ffi.convert([1, 2, 3])
assert isinstance(a, tvm_ffi.Array)
assert len(a) == 3
assert a[-1] == 3
a_slice = a[-3:-1]
assert (a_slice[0], a_slice[1]) == (1, 2)
map#
from tvm import te
a = te.var("a")
b = te.var("b")
amap = tvm_ffi.convert({a: 2, b: 3})
assert a in amap
assert len(amap) == 2
dd = dict(amap.items())
assert a in dd
assert b in dd
assert a + 1 not in amap
assert {x for x in amap} == {a, b}
assert set(amap.keys()) == {a, b}
assert set(amap.values()) == {2, 3}
数组映射#
a = tvm_ffi.convert([[1, 2, 3], {"A": 5, "B": 6}])
assert isinstance(a, tvm_ffi.Array)
assert len(a) == 2
assert isinstance(a[0], tvm_ffi.Array)
assert isinstance(a[1], tvm_ffi.Map)
assert tuple(a[0]) == (1, 2, 3)
assert a[1]["A"] == 5
assert a[1]["B"] == 6
a = tvm_ffi.convert([1, 2, 3])
assert dir(a)
a = te.var("a")
b = te.var("b")
amap = tvm_ffi.convert({a: 2, b: 3})
assert dir(amap)
a = te.var("a")
b = te.var("b")
amap = tvm_ffi.convert({a: 2, b: 3})
assert isinstance(amap, tvm.ffi.Map)
整数映射#
amap = tvm_ffi.convert({3: 2, 4: 3})
assert 3 in amap
assert len(amap) == 2
dd = dict(amap.items())
assert 3 in dd
assert 4 in dd
assert 5 not in amap
assert tuple(amap.items()) == ((3, 2), (4, 3))
assert tuple(amap.keys()) == (3, 4)
assert tuple(amap.values()) == (2, 3)
字符串映射#
data = []
for i in reversed(range(10)):
data.append((f"a{i}", i))
amap = tvm_ffi.convert({k: v for k, v in data})
assert tuple(amap.items()) == tuple(data)
for k, v in data:
assert k in amap
assert amap[k] == v
assert amap.get(k) == v
assert tuple(k for k in amap) == tuple(k for k, _ in data)
KeyError#
import pytest
amap = tvm_ffi.convert({3: 2, 4: 3})
with pytest.raises(KeyError):
amap[5]
repr#
a = tvm_ffi.convert([1, 2, 3])
assert str(a) == "[1, 2, 3]"
amap = tvm_ffi.convert({3: 2, 4: 3})
assert str(amap) == "{3: 2, 4: 3}"
smap = tvm_ffi.convert({"a": 1, "b": 2})
assert str(smap) == "{'a': 1, 'b': 2}"
序列化#
import tvm
a = tvm_ffi.convert([1, 2, 3.5, True])
json_str = tvm.ir.save_json(a)
a_loaded = tvm.ir.load_json(json_str)
assert a_loaded[1] == 2
assert a_loaded[2] == 3.5
assert a_loaded[3] == True
assert isinstance(a_loaded[3], bool)
a = te.var("a")
b = te.var("b")
amap = tvm_ffi.convert({a: 2, b: 3})
json_str = tvm.ir.save_json(amap)
amap = tvm.ir.load_json(json_str)
assert len(amap) == 2
dd = {kv[0].name: kv[1] for kv in amap.items()}
assert dd == {"a": 2, "b": 3}
in 容器#
arr = tvm_ffi.convert(["a", "b", "c"])
assert "a" in arr
assert tvm.tir.StringImm("a") in arr
assert "d" not in arr
ndarray 容器#
x = tvm.nd.array([1, 2, 3])
arr = tvm_ffi.convert([x, x])
assert arr[0].same_as(x)
assert arr[1].same_as(x)
assert isinstance(arr[0], tvm.nd.NDArray)
ReturnsVariant#
func = tvm.get_global_func("testing.ReturnsVariant")
res_even = func(42)
assert isinstance(res_even, tvm.tir.IntImm)
assert res_even == 21
res_odd = func(17)
assert res_odd == "argument was odd"
AcceptsVariant#
func = tvm.get_global_func("testing.AcceptsVariant")
assert func("string arg") == "ffi.String"
assert func(17) == "ir.IntImm"
func = tvm.get_global_func("testing.AcceptsVariant")
float_arg = tvm.tir.FloatImm("float32", 0.5)
with pytest.raises(Exception):
func(float_arg)