tvm中使用python调用C++函数流程

1 通过导入模块初始化
	1) 在tvm的package的__init__.py中,有下面几个和初始化相关的模块导入:
	    from ._ffi.runtime_ctypes import TypeCode
		from ._ffi.function import Function
		from ._ffi.base import TVMError, __version__
		from .api import *
	2) 导入tvm相关链接库
2 在tvm/_ffi/runtime_ctypes.py中,有from .base import _LIB, check_call,在base模块中找到相关语句如下:
	def _load_lib():
	    lib_path = libinfo.find_lib_path()
	    lib = ctypes.CDLL(lib_path[0], ctypes.RTLD_GLOBAL)
	    return lib, os.path.basename(lib_path[0])
3 _LIB, _LIB_NAME = _load_lib()
	load lib的时候主要用了python的ctypes.CDLL接口,在mac上做的实验结果显示lib_path为:
		tvm/build/libtvm.dylib
		tvm/build/libtvm_runtime.dylib
4 将c接口设置成python模块的内置函数
		在tvm的各个模块中,可以发现如下的代码:
		_init_api("tvm.api")
		_init_api("tvm.ir_pass")
		_init_api("tvm.make")
		_init_api("tvm.arith")
		_init_api("tvm.module")
		_init_api("tvm.schedule")
		_init_api("tvm.codegen")
		_init_api("tvm.contrib.nnpack")
		_init_api("tvm.contrib.random")
	以其中的_init_api("tvm.api")为例,它会在from .api import *的时候被执行,具体做的工作如下:
	1) 获取注册过的c接口名称
		通过list_global_func_names中的_LIB.TVMFuncListGlobalNames来获取所有注册过的c接口名称
	2) 通过注册名称获取相应的python接口
		通过_LIB.TVMFuncGetGlobal来根据c接口名称得到其相应的函数句柄,再将其封装到一个python函数f中
	3) 通过setattr注册进python的相关模块中
		相关代码如下所示:
		for name in list_global_func_names():
	        if prefix == "api":
            fname = name
            if name.startswith("_"):
                target_module = sys.modules["tvm._api_internal"]
            else:
                target_module = module
        else:
            if not name.startswith(prefix):
                continue
            fname = name[len(prefix)+1:]
            target_module = module
        if fname.find(".") != -1:
            continue
        f = get_global_func(name)
        ff = _get_api(f)
        ff.__name__ = fname
        ff.__doc__ = ("TVM PackedFunc %s. " % fname)
        setattr(target_module, ff.__name__, ff)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值