VirtualDevice

VirtualDevice#

import tvm
import tvm.testing
  1. 通过 tvm.device("cuda") 创建物理设备

  2. 构造 VirtualDevice 时仅传递物理设备参数

  3. 验证四个关键属性的默认值:

    • 设备类型对应 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 == ""
  1. 创建CUDA编译目标对象

  2. 同时传入物理设备(CUDA)和编译目标构造VirtualDevice

  3. 验证三个关键属性:

    • 设备类型匹配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

核心验证点

  1. 完整参数构造:同时传入物理设备(CUDA)、编译目标(cuda Target)和内存作用域(local)

  2. 属性三元组验证:

    • 设备类型映射到CUDA的DLDeviceType枚举值

    • Target对象与传入参数严格相等

    • 内存作用域字符串完全匹配输入参数

  3. 扩展能力测试:验证VirtualDevice对内存作用域参数的支持机制

该测试验证了 TVM 中 VirtualDevice 对象在同时指定物理设备、编译目标和内存作用域时的正确构造。以下是关键分析点:

  1. 三元参数验证: 物理设备(cuda)对应DLDeviceType枚举值2 编译目标(target)绑定CUDA编译配置 内存作用域("local")明确指定存储范围

  2. 设备映射机制

    virtual_device = tvm.target.VirtualDevice(tvm.device("cuda"), target, scope)
    

    通过device_type字段实现硬件抽象层(HAL)与DLPack标准的对接

  3. 内存作用域校验: 验证memory_scope参数支持不同存储层级的配置:

    • global:全局显存

    • local:片上共享内存

    • texture:纹理内存等特殊存储

  4. 目标编译器绑定: 确保target参数正确传递CUDA编译配置(如compute capability、线程配置等)

该测试覆盖了TVM运行时设备管理系统的核心功能,为后续异构计算调度提供基础设备抽象支持。