VirtualDevice
#
import tvm
import tvm.testing
通过
tvm.device("cuda")
创建物理设备构造 VirtualDevice 时仅传递物理设备参数
验证四个关键属性的默认值:
设备类型对应 CUDA(DLDeviceType 枚举值 2)
虚拟设备 ID 初始化为 0
目标编译器为空(需后续显式设置)
内存作用域未指定
virtual_device = tvm.target.VirtualDevice(tvm.device("cuda"))
# 断言设备类型为CUDA(kDLCUDA对应值2)
assert virtual_device.device_type == 2
# 虚拟设备ID默认为0
assert virtual_device.virtual_device_id == 0
# 未指定target时自动推导为None
assert virtual_device.target is None
# 内存作用域默认为空字符串
assert virtual_device.memory_scope == ""
创建CUDA编译目标对象
同时传入物理设备(CUDA)和编译目标构造VirtualDevice
验证三个关键属性:
设备类型匹配CUDA枚举值
目标编译器对象正确绑定
内存作用域保持未指定状态
target = tvm.target.Target("cuda")
virtual_device = tvm.target.VirtualDevice(tvm.device("cuda"), target)
assert virtual_device.device_type == 2 # ie kDLCUDA
assert virtual_device.target == target
assert virtual_device.memory_scope == ""
验证当同时指定物理设备、编译目标和内存作用域时,VirtualDevice对象的属性正确性
target = tvm.target.Target("cuda")
scope = "local"
virtual_device = tvm.target.VirtualDevice(tvm.device("cuda"), target, scope)
# 验证设备类型为CUDA(kDLCUDA=2)
assert virtual_device.device_type == 2
# 确认目标编译器绑定正确
assert virtual_device.target == target
# 检查内存作用域设置生效
assert virtual_device.memory_scope == scope
核心验证点:
完整参数构造:同时传入物理设备(CUDA)、编译目标(cuda Target)和内存作用域(local)
属性三元组验证:
设备类型映射到CUDA的DLDeviceType枚举值
Target对象与传入参数严格相等
内存作用域字符串完全匹配输入参数
扩展能力测试:验证VirtualDevice对内存作用域参数的支持机制
该测试验证了 TVM 中 VirtualDevice 对象在同时指定物理设备、编译目标和内存作用域时的正确构造。以下是关键分析点:
三元参数验证: 物理设备(cuda)对应DLDeviceType枚举值2 编译目标(target)绑定CUDA编译配置 内存作用域("local")明确指定存储范围
设备映射机制:
virtual_device = tvm.target.VirtualDevice(tvm.device("cuda"), target, scope)
通过device_type字段实现硬件抽象层(HAL)与DLPack标准的对接
内存作用域校验: 验证memory_scope参数支持不同存储层级的配置:
global:全局显存
local:片上共享内存
texture:纹理内存等特殊存储
目标编译器绑定: 确保target参数正确传递CUDA编译配置(如compute capability、线程配置等)
该测试覆盖了TVM运行时设备管理系统的核心功能,为后续异构计算调度提供基础设备抽象支持。