1、背景
在当前经典计算机结构中,要完成计算,需要有处理器、内存、存储三个组件,一直以来都有厂商希望存储盘能够实现特定的计算加速功能,可以在更加靠近数据的位置进行计算,降低主机cpu的运算压力,减少大量无效数据的读写操作。
NVMe协议已经定义了完备的存储相关的功能,如果需要在存储设备中完成计算功能,就需要在NVMe协议中补齐“计算”,“内存”两个组件,本次发布的spec也是为了统一这两方面的内容
computational-programs-command-set
subsystem-local-memory-command-set
本文主要介绍computational-programs-command-set
1.1、Compute\SLM\NVM 3种namespace之间的关系
本次推出的两份command set都属于I/O command set,分别对应两种新的namespace,这两种新的namespace不是NVM namespace,他们是不能持久化保持数据的,大致的关系如下
ns | cmd set | NVM? | 备注 |
---|---|---|---|
block ns | NVM-Block | Yes | 最常见的盘 |
zns ns | NVM-Zns | Yes | |
kv ns | NVM-KV | Yes | |
memory ns | SLM | No | |
compute ns | Computational Programs | No |
1.2 Compute namespace
- 在compute namespace中可以执行特定的计算,计算的算法可以是device中内置的算法,也可以是临时下载的代码片段
- compute namespace中可以同时存在多个程序(内置 or 下载)在执行之前需要activate某一个程序,也可以deactivate
- 计算所需的数据,生成的数据都是放在SLM中,SLM中的数据可以来自于host,也可以是通过copy命令从NVM NS中导入。生成的数据可以被host通过memory read命令读取,也可以通过copy命令写入NVM NS中进行持久化保持,后续可以通过NVM NS的读命令获取
- 每个compute namespace支持1或者多个program type
- ebpf、vendor specific等等
1.3 Memory Range Sets
- Memory Range Set(MRS):单个MRS是一段或者多段SLM中的内存区域,每一段都由nsid、offset、length唯一指定
- MRS是在compute ns中创建的
- MRS被创建之后,compute ns执行Execute program命令时需要提供RSID
- 不同的compute ns创建的MRS可以是overlap重叠的(不同的program允许共享内存区域),在单个MRS中不同的range不允许重叠
- MRS中不同的range,可以来自于不同的memory namespace
- compute ns只能在创建过Reachability Association的memory ns中创建MRS
- RSID是在compute ns中进行管理,在compute ns中RSID需要唯一
- MRS是有Memory Range Set Management commnad进行管理
1.4 Program执行流程
- 下载/激活PIND0的程序
- 为程序创建MRS内存资源
- 将需要计算的数据准备到MRS中(可以是NVM ns copy,也可以是host memory write)
- Execute Program执行程序成功
- Host可以memory read结果,也可以调用copy命令将结果存入NVM namespace,还可以执行下一个程序,将结果用于后续的计算
1.5 Reachability
目前这部分内容是在Base Specification中定义,可以参见下图
1.6 PUID
- PUID是一个64 byte的值,代表一个Global Unique的Program
- PUID由OID和UPI构成,OID确定一个全球唯一的组织,UPI确定组织内唯一的Program
- PUID需要通过NVMe的申请流程
1.7 Downloadable/Device-defined Programs
- Compute ns可以支持Downloadable 或者 Device-defined程序
- Downloadable是通过一系列命令来支持
- Program Activate(activate/deactivate)
- Load Program(download/unload) download的行为和fw-download类似
- Load Program的第一个命令必须提供以下信息
- PIT 是否使用PID
- PTYPE
- PIND index类似于fw-slot
- PID PUID(基于PIT)
- PSIZE 需要下载代码片段总大小
- LOFF 当前代码片段的off
- NUMB 当前代码片段的size(dowrd)
- Load Program的第一个命令必须提供以下信息
1.8 Activating/Deactivating Programs
- 程序执行前必须被activate激活
- I/O Command set specific id-ns(CNS=0x5)里面的MAXACT值可以声明compute ns上可以同时激活的程序数量
2、Compute Program Command Set
2.1、I/O 命令部分
计算存储的I/O命令部分比较简单,只有1个
- Execute Program 执行程序
2.2、Admin命令部分
Compute command set 专属的管理命令
- Load Program:下载程序,可选支持
- Program Activation Management 激活程序
- Memory Range Set Management 给程序指定内存区域
为了支持I/O部分的功能,必须支持这些LogPage
- Program List LID=0x82 计算ns中有多少program
- Downloadable Program Type List LID=0x83 计算ns允许下载哪些类型的程序
- Memory Range set List LID=0x84 计算ns目前设定过的MRS查询
为了支持I/O部分功能,必须支持的Identify
- id-ns CNS05:支持的最大程序数量、MRS颗粒度 size等限制、下载程序颗粒度
- id-ctrl CNS06:主要是声明协议版本
2.2.1 MRS management command
所有管理命令中,可能最重要的就是MRS管理命令,管理命令分为2个子命令
- MRS Create:最多创建128个range,每个range的内容放在data buffer中,执行成功后返回1个RSID
- MRS Delete