Cosmos NDP编程框架(easyNDP)说明文档

news2024/11/17 3:56:46

Cosmos NDP编程框架(easyNDP)说明

更新时间:2023-2-17

作者:Gary

一.简介

本文档主要用于说明本简易NDP框架——easyNDP framework的架构、开发新应用以及使用的方法。

在开始前,有一个概念需要提前说明,文档中的块这个概念,对应的是主机中的块/扇区/sector或者CSD内的页/page,并不是指的闪存中擦除单位的块/block。通常块是4KB大小,在Cosmos中一个page、即文中的块为16KB,因此在主机中提到块时指的是4KB大小的块,在固件中提到块时是16KB的块,他们在FTL中需要进行转换。

本项目的开源地址:

(国内建议访问)https://gitee.com/lijiali1101/easyNDP

(同步更新到)https://github.com/GaryLee1101/easyNDP

二.架构介绍

近数据计算(NDP,Near-data processing)作为一种新兴的计算范式正在蓬勃发展之中。NDP主要解决的问题是传统存储系统的存储墙问题,相比于传统系统中需要将数据全部从storage搬运到dram、再搬运到CPU中进行计算,NDP系统可以在存储器内部直接进行计算后返回计算结果。NDP极大地减轻了通信的开销以及主机CPU的负担,具有性能易扩展、能耗低、性能高等特点。

能够支持近数据计算功能的存储器称为计算型存储(CSD,Computational Storage)。由于闪存和SSD的性能进步以及成本的降低,CSD通常由SSD扩展而来。CSD的固件通常是闭源的(例如三星的SmartSSD、NGD system的Newport等),非常不利于NDP技术的发展。即使已经有开源的NDP系统(例如ATC‘19的Insider、FAST’22的FusionFS等),他们也往往并不是真的在SSD设备上进行的实现,而是采用FPGA模拟或者在主机端进行模拟,无法真实应用。因此本框架的目的是打破这一困境,基于开放闪存盘Cosmos Plus OpenSSD开发了一个简易的NDP开发框架easyNDP,便于开发者和研究人员更方便的开发NDP应用和进行NDP系统的研究。

easyNDP包含2部分的代码,分别是主机端和固件端。主机端部分主要负责为应用提供接口,同时通过NVMe协议与Cosmos进行交互,分发任务以及读写数据。

easyNDP的基本原理是,通过对数据从闪存中读取完成的处理函数进行拦截,执行一段数据处理程序以实现NDP操作。具体流程是如下:

  1. 主机端应用先在内存中构建出需要下发的自定义指令结构和数据结构,然后通过API下发NDP请求,指令的阻塞与否取决于固件的程序。
  2. 固件在接受到请求后,首先可以通过DMA接收刚刚在主机内存中构建的指令然后解析出所需的信息(如数据地址、操作类型、操作参数等),然后将请求推送到NDP任务队列中,固件继续接受新的请求。NDP任务队列是easyNDP新增的数据结构,主要作用是维护NDP相关的任务,例如计算、分发闪存操作、聚合计算结果等。
  3. 在固件的每次主循环末尾,都会检查NDP任务队列是否有尚未完成的请求,若有则遍历NDP任务队列查找是否有已经完成的请求(开销比较大,后续可以进行优化例如专门设定一个待完成任务队列或者取消这个遍历过程采用触发式的完成)。若某个请求已完成则返回结果并删除该任务,若某请求处于初始化状态则进行任务分发。
  4. easyNDP在闪存的读取完成函数中埋了一个处理函数,每当读上来一个数据就进行一次处理,目前只支持当场计算模式,处理完成后设置任务的完成状态以便于在步骤3中进行请求的处理。

三.应用开发及使用示例

这里采用一个在文本文件内进行字符串检索的应用作为示例。这里采用文件系统对数据进行管理,CSD作为一个块设备在主机端进行挂载并且可以进行文件读写操作。这里采用从上到下,即从应用到底层的顺序进行示例介绍。

1. 主机端(代码在Host文件夹中)

  1. Cosmos首先通过创建或者拷贝的方式往Cosmos中写入一个文本文件,接着用fsync同步元数据。由于CSD中包含DRAM数据缓存,写入的文件是先保存在缓存中没有写入闪存中的,并且Cosmos的固件(FTL)中没有支持刷写缓存的操作,我们需要写入一个数十MB的文件(Cosmos数据缓存默认大小是16MB)来保证文件已经全部写入到了闪存。

  2. 文件写入后需要获取该文件的逻辑块地址。因为CSD中并没有文件语义的信息,无法通过文件名来获取文件存储的位置,因此需要主机告诉CSD数据所在的块。这里的逻辑块地址与物理块地址是针对CSD中来说的,主机与CSD交互时利用的是逻辑块地址,CSD中的FTL负责将逻辑块地址转换为物理块地址。获取块地址有现成的应用叫filefrag,可以通过该应用获取某个文件的起始块地址、文件长度的信息,指令格式为filefrag -v -b4096 <file name>

  3. 获取到文件地址后我们将其作为参数填入到内存中。本步骤的代码包含在string_demo.c中。我们首先需要包含dma.h头文件,该文件包含了与Cosmos进行交互的接口和底层代码,基于unvme实现。接着我们申请一块内存区域,用于按顺序存放我们所需的字段。例如步骤2中我们获取到的文件起始逻辑块号为33793,长度为4000B,占用1个块,那么我们可以按如下方法构建出指令:image-20230217205445932

  4. 构建出NDP指令后下一步是发送。发送前需要先打开unvme设备,发送后需要关闭,NVMe设备路径在dma.h中修改,不过一般不会改变都是/dev/nvme0n1。发送的API是DMA_Send,第一个参数目前没有用;第二个参数是刚刚构建的指令地址;第三个参数是指令长度;第四个是指令操作符由应用自行定义,建议操作符定义专门作为一个头文件,方便在主机端和固件端进行同步,例如本例中在command_list.h中定义了多种操作,固件端与主机端头文件内容完全相同。image-20230217210733398

  5. 至此,主机端的代码开发完成,进行编译即可。

2. 固件端(代码在CSD文件夹中)

  1. 固件端我们首先需要解析刚刚收到的请求。NVMe的通信原理是首先通过数十个Byte的NVMe指令发送基础信息给NVMe设备,然后所需的数据再通过DMA的方式(DMA地址在NVMe指令中)接受或者发送。我们刚刚在主机端第4步定义的TEST_C请求类型在这里就发挥作用了。请求类型保存在NVMe指令的writeInfo12.reserved0保留字段中,相关代码在nvme_io_cmd.c的第120行。程序解析到是TEST_C请求后,首先通过DMA接受请求数据,即刚刚在主机端第3步构建的请求数据。第124行是发起dma传输,第125行的作用是阻塞等待dma传输完成(可以设计成非阻塞的,会复杂很多因为CSD内部没有多进程机制需要自己手动进行完成状态检查,我们这里先用阻塞接受的方式)。image-20230217211457777

  2. 在接受到请求后我们可以按序解析出所需的请求字段,这部分没太多重点。不过我们可以设置一个检查机制,简单检查一下数据是否有错误。例如我们这里的块数量信息和数据的字节大小其实是存在冗余的,因此可以通过计算他们的值是否匹配来检查数据是否有错误。我们也可以在字段里面构建校验码、幻数或者序号来检查。image-20230217211445414

  3. 接着我们将这个请求推入到任务列表tasklist中。首先构建一个任务实体task_entry并全部置0(task_entry设计的是所有字段都可以置0以表示无效状态)。同时将所需的字段信息填入到task_entry的相关项中。注意状态项设置为INIT表示这个指令刚刚被推入任务列表中等待进一步被处理,请求槽cmdSlotTag是用于标识这个请求所属的NVMe请求的,用于完成请求返回时调用。注意插入操作可能会失败,因为任务列表可能已满,可以设置一个内存空间用于保存这些暂时无法被送入的请求,也可以像示例一样直接返回请求。set_auto_nvme_cpl的作用就是将这一NVMe请求设置为完成,调用时主机那边就会解除阻塞,在调用前主机那边的程序一直都是阻塞状态。

image-20230217211930669

  1. 解析NVMe请求完成后,固件就会进入到任务列表的处理函数check_task_list中,该函数在task_handler.c的第199行。一个新应用需要做的就是在205行的for循环内新增一个任务处理程序。例如以TEST任务为例,我们首先检查他的状态,如果是初始化状态那么我们就分发他需要读取的块地址的读请求,这部分可以直接使用已经写好的函数generate_child_task,这个函数会直接分发写入在task_entry结构中的块地址请求信息,并且在分发完成后直接置其为READING状态。generate_child_task函数会根据请求数据长度自动分割为多个FLASHREAD指令并增加父任务(在这里就是TEST任务)的子任务child_task_count的数量,一个FLASHREAD指令负责一个16K块的数据读取。其次,当指令变成READING状态后,我们需要检查他的子任务是否都已经完成,子任务的数量控制我们在第5步中描述。如果完成的子任务数大于等于(正常情况下不会大于只会等于,但是我们在开发阶段加上大于可以避免某些bug),那么就说明该任务已经完成,可以设置NVMe指令完成并且利用reset_task重置本任务以便接受下一个任务了。数据的返回也是利用DMA完成,该功能待补充。

    image-20230217213001529

5.最后一步就是在handle_task(task_handler.c第292行)添加数据处理函数了。在Cosmos的固件中,每当一个读闪存请求完成后,都会调用low_level_scheduler.c第694行的内容,我们在里面插入了一个handle_task函数,当一个块的数据读上来后我们会检查这是否是一个NDP所发出的读请求(通过FTL请求的task_index字段是否有值判断),是的话我们就会调用handle_task函数,把数据在DRAM中的缓存地址、任务编号、数据偏移量等信息传递到数据处理函数中。如图所示,当所完成的读任务的编号是我们的FLASHREAD任务时,我们进一步检查这个读任务的父任务是否是我们的TEST任务,是的话我们将其打印出来(也可以通过一个字符串检索函数检索关键字,这里只是简单的打印处理),并且将父任务即TEST的已完成子请求数量+1。那么在下一次进行任务列表遍历时就可以发现子任务已完成就可以返回了,如第四步所示。

image-20230217215051417

四.最后

easyNDP目前还很不完善,还存在很多bug,例如当任务列表已满时会执行出错。以及许多功能尚未实现例如DMA返回结果,例如在盘内写入数据,例如检查CSD的数据缓存是否存在所需数据。希望能获得大家的完善和支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO-V5 系列算法和代码解析(八)—— 模型移植

文章目录工程目标芯片参数查阅官方文档基本流程Python 版工具链安装RKNPU2的编译以及使用方法移植自己训练的模型工程目标 将自己训练的目标检测模型【YOLO-V5s】移植到瑞芯微【356X】芯片平台&#xff0c;使用C推理&#xff0c;最终得到预期的结果。 芯片参数 芯片参数介绍…

IOS 自动化测试环境搭建

购买MacPDD 比TB JD 便宜500&#xff0c;下单安装homebrew/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装npm cnpmbrew install node; npm install -g cnpm --registryhttps://registry.npm.taobao.org;安装类似Andro…

Windows平台使用gdb连接qemu虚拟机上的系统

先安装MinGW&#xff1b; 除了gcc、g&#xff0c;把gdb也选上&#xff1b;可能选第一个就可以了&#xff0c;不清楚把后面几个也选上&#xff1b; 安装完成看一下gcc, g&#xff0c;gdb&#xff0c;编译工具和调试器都有了&#xff1b; 把bin目录加到环境变量&#xff1b; 看一…

element-ui实现动态添加表单项并实现事件触发验证验证

需求分析&#xff1a;点击新增后新增一个月度活动详情&#xff0c;提交时可同时提交多个月度活动详情。点击某一个月度活动信息的删除后可删除对应月度活动信息 H5部分&#xff1a; <el-dialog :title"title" :visible.sync"open" append-to-body>…

数据结构时间空间复杂度笔记

&#x1f57a;作者&#xff1a; 迷茫的启明星 本篇内容&#xff1a;数据结构时间空间复杂度笔记 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;家人们&#xff0c;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤…

基础篇—CSS margin(外边距)解析

什么是CSS margin(外边距)? CSS margin(外边距)属性定义元素周围的空间。 属性描述margin简写属性。在一个声明中设置所有外边距属性。margin-bottom设置元素的下外边距。margin-left设置元素的左外边距。margin-right设置元素的右外边距。margin-top设置元素的上外边距。mar…

Linux 磁盘配额与VDO技术

目录 磁盘容量限额quota技术 磁盘配额分类 对磁盘开启限额服务 xfs_quota管理磁盘配额 edquota 管理磁盘配额 VDO虚拟数据优化 创建VDO卷 vdostats 查看vdo卷的使用情况 磁盘容量限额quota技术 磁盘配额可以限制用户的硬盘可用容量和用户所能创建的最大文件个数 磁盘…

2023美赛 ICM E题详细版思路

问题E&#xff1a;光污染注&#xff1a;楷体为题目原文&#xff0c;宋体为思路部分首先&#xff0c;我们需要考虑的就是美赛ABEF的核心问题&#xff0c;数据。这里E题是以光污染为背景的题目&#xff0c;首当其冲的我们就需要收集一些数据以支撑我们的模型。对于E题提出的问题&…

Allegro如何更改DRC尺寸大小操作指导

Allegro如何更改DRC尺寸大小操作指导 在做PCB设计的时候,DRC可以辅助设计,有的时候DRC的尺寸过大会影响视觉,Allegro支持将DRC的尺寸变小或者改大 如下图,DRC尺寸过大 如何改小,具体操作如下 点击Setup选择Design Parameters

结构体——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是结构体噢&#xff0c;之前我们在初始C语言中其实就已经学习过了结构体的知识&#xff0c;但是不是很全面&#xff0c;这次&#xff0c;我们也只是稍微详细一点&#xff0c;敬请期待小雅兰之后的博客&#xff…

分享五款功能简单粗暴的小软件

今天分享几款功能简单的小软件&#xff0c;小伙伴们们可以来看一下有没有你需要的功能软件。 1.书签管理工具——Toby for Chrome Toby是一个特别有用的浏览器书签管理工具。使用它&#xff0c;您可以创建自己的不同类别的书签。比如在工作生活等方面&#xff0c;学习常用的查…

操作系统(进程管理)

一、进程的定义及特征进程的定义由程序、数据、进程控制块三部分组成为了使程序可以并发执行&#xff0c;且可以对并发执行的程序加以描述和控制。不同角度的定义&#xff1a;进程是程序的一次执行&#xff1b;进程是一个程序及其数据在处理机上顺序执行时所发生的活动&#xf…

js实现元素样式切换的基本功能

需求&#xff1a;用户第一次点击某些元素&#xff0c;改变元素的某些样式&#xff0c;比如背景颜色&#xff0c;字体颜色。用户第二次点击某些元素&#xff0c;恢复之前的样式。.....思路&#xff1a;准备一定量的div盒子&#xff0c;并取相同的类名<div class"box&quo…

2022年襄阳中级工程师职称水平能力测试成绩出来了吗?

2022年下半年襄阳水平能力测试考试在2月初举行的&#xff0c;目前襄阳水测成绩已出&#xff0c;合格标准已出&#xff0c;襄阳水测今年合格标准是50分及格&#xff0c;以前是30多分及格&#xff0c;今年合格标准突然上涨蛮多&#xff0c;不过大家考的还是不错&#xff0c;分享一…

STC单片机 VS/HX1838红外接收和发送实验

STC单片机 VS/HX1838红外接收和发送实验 📌相关篇《STC单片机获取红外解码从串口输出》🔨所使用的红外接收头VS1838 📋VS1838引脚定义🌿5MM发射头,940nm红外发射二极管 红外遥控发射头。(外观看起来和普通的发光二极管没有什么差异,购买时需要注意确认)。 🔰采用的…

XXL-JOB分布式任务调度框架(二)-路由策略

文章目录1.引言2.任务详解2.1.执行器2.2.基础配置3.路由策略(第一个)-案例4.路由策略(最后一个)-案例5.轮询策略-案例7.分片广播任务1.引言 本篇文章承接上文《XXL-JOB分布式任务调度框架(一)-基础入门》&#xff0c;上一次和大家简单介绍了下 xxl-job 的由来以及使用方法&…

【Node.js】全局可用变量、函数和对象

文章目录前言_dirname和_filename变量全局函数setTimeout(cb,ms)clearTimeout(t)setInterval(cb,ms)clearInterval(t)setImmediate(cb)clearImmediate()console对象console.info([data][,...])console.error([data][,...])console.warn([data][,...])console.dir(obj[,options]…

【Linux 多线程互斥】如何保证锁的原子性(互斥的原理)

临界资源:可以被多个执行流&#xff08;线程或者叫轻量级进程&#xff09;同是访问的&#xff08;多个执行流共享的&#xff0c;比如&#xff1a;全局、堆等等&#xff09;&#xff1b;临界区&#xff1a;访问这些临界资源的代码&#xff1b;原子性&#xff1a;没有中间态&…

vue动画

vue动画 1.vue动画&#xff08;transition &#xff09; 使用 组件 组件可以用来添加过渡效果&#xff0c;当一个元素或组件被插入或删除时&#xff0c;它会自动应用过渡效果。 name 属性用于指定具体是那个动画生效&#xff0c;如果不加默认是v-开头的 <!-- 可以添加指定的…

Win10搭建Pyspark2.4.4+Pycharm开发环境(亲测可用)

下载资源hadoop3.0.0spark-2.4.4-bin-without-hadoopwinutils下载(对应hadoop3.0.1的bin目录覆盖本地hadoop的bin目录)jdk1.8(默认已按照配置)conda/anaconda(默认已安装)注意:cdh6.3.2的spark为2.4.0但是使用2.4.0本地pyspark有bug,下载的文件可能在第一次解压缩后,如未出现目…