diff --git a/zh-cn/assets/cover-1ac6df35.webp b/zh-cn/assets/cover-1ac6df35.webp new file mode 100644 index 0000000..ff7824d Binary files /dev/null and b/zh-cn/assets/cover-1ac6df35.webp differ diff --git a/zh-cn/assets/cover-bb683e66.webp b/zh-cn/assets/cover-bb683e66.webp new file mode 100644 index 0000000..831e1c5 Binary files /dev/null and b/zh-cn/assets/cover-bb683e66.webp differ diff --git a/zh-cn/assets/image1-67dc5aad.webp b/zh-cn/assets/image1-67dc5aad.webp new file mode 100644 index 0000000..fa8340f Binary files /dev/null and b/zh-cn/assets/image1-67dc5aad.webp differ diff --git a/zh-cn/assets/image2-5e5cc8ab.webp b/zh-cn/assets/image2-5e5cc8ab.webp new file mode 100644 index 0000000..7a3fe51 Binary files /dev/null and b/zh-cn/assets/image2-5e5cc8ab.webp differ diff --git a/zh-cn/assets/index-6a884c2a.js b/zh-cn/assets/index-02cd55c8.js similarity index 99% rename from zh-cn/assets/index-6a884c2a.js rename to zh-cn/assets/index-02cd55c8.js index 910fa6f..24cd011 100644 --- a/zh-cn/assets/index-6a884c2a.js +++ b/zh-cn/assets/index-02cd55c8.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",m="/zh-cn/assets/image16-2de227b5.png",S="/zh-cn/assets/image17-ecbf7b1e.png",R="/zh-cn/assets/image18-88f5d1b8.png",D="/zh-cn/assets/image19-5df924ff.png",F="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",A=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,S,R,D,F,b],u={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},C=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],T=`

本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

+const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",m="/zh-cn/assets/image16-2de227b5.png",S="/zh-cn/assets/image17-ecbf7b1e.png",F="/zh-cn/assets/image18-88f5d1b8.png",D="/zh-cn/assets/image19-5df924ff.png",R="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",A=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,S,F,D,R,b],u={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},T=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

引言

Poseidon 是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的 SHA-256、SHA-3 以及 Pedersen 哈希函数,在零知识证明的应用场景下,Poseidon 能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon 目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统 Filecoin、加密货币 Mina Protocol 和 Dusk Network 等,主要用于加速其中的零知识证明系统。

0.1 Poseidon 与零知识证明

@@ -252,7 +252,7 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

在上文中介绍的 FPGA 硬件系统和其中 Poseidon 加速器 IP 的基础上,我们通过 Vivado 集成开发环境将其实现在了 Varium C1100 FPGA 加速卡上,该板卡搭载了 Xilinx Virtex UltraScale+系列的 FPGA 芯片,具体芯片型号为具体型号为 XCU55N-FSVH2892-2L-E。整个硬件系统实现(Implementation)后的报告以及计算性能的测试结果如下:

5.1 Vivado Implementation 报告

整体硬件加速系统综合实现后逻辑资源消耗情况如下表所示:

-

图片

+

图片

各项 FPGA 资源中 DSP Slices(70.01%)和 LUT(61.15%)的消耗最多, 主要用于 255-Bit Montgomery 模乘电路的实现上。这两项资源的不足也限制了在加速器中配置更多模乘器来提升计算并行度和整体的加速性能。

在时序上,实现(Implementation)后 Poseidon 加速器刚好能够满足 100MHz 工作频率的要求。关键路径上,建立(set up)时间的余量为 0.069ns,保持(hold)时间的余量为 0.01ns。

除了资源和时序外,FPGA 实现后的功耗信息如下图所示。由下图可见,在运行我们设计的加速器硬件时,FPGA 芯片的整体功耗在 24.7W 左右。而我们在性能测试中使用的 RTX 3070 GPU 加速卡的运行功耗在 120W 左右。

@@ -262,7 +262,7 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
  1. C 语言程序测试结果:在 Xilinx 提供的 XDMA 驱动的基础上使用 C 语言编写简单的性能测试程序。该测试程序向 FPGA 加速器写入一定数量的输入数据,并记录加速器完成所有数据哈希运算所需要的时间。基于该测试程序,我们分别测试了 Poseidon 加速器在三种长度输入数据下的性能表现。当输入数据的大小为 arity2, 即中间状态向量元素个数 时,加速器在 0.877 秒内完成了 850000 次的哈希运算,数据吞吐率可达到 29.1651MB/s, 即每秒大约能够完成 1M 次哈希运算
-

图片

+

图片

  1. Lotus-Bench 测试结果:Lotus 中提供了计算机硬件在 Filecoin 计算负载下性能表现的基准测试程序 Lotus-Bench;与自己实现的 C 语言测试程序相比,Lotus-Bench 的测试更加接近实际的工作负载,能够得到更加准确的测试结果。在 Lotus-Bench 的基础上,我们分别测试了 CPU, GPU 和 FPGA 在 preCommit 阶段(该阶段主要完成 Poseidon 哈希函数的计算)处理 512MB 数据所需要的时间。FPGA 在 Lotus-Bench 测试下的算力可达到 15.65MB/s,大约是 AMD Ryzen 5900X CPU 实现的 2 倍,但和 RTX 3070 GPU 的加速性能相比仍有很大的提升空间.
@@ -278,4 +278,4 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
  • 优化加速器架构:由于需要适配 Filecoin Poseidon 计算实例中不同大小的输入数据,目前在输入较小的情况下加速器中存在一些冗余的运算单元。通过进一步优化加速器的整体架构,使得在不同长度的输入数据下,所有运算单元都能得到更好的利用,能够进一步提升整体的加速性能。

  • -`;export{A as assetURLs,T as default,u as metadata,C as toc}; +`;export{A as assetURLs,C as default,u as metadata,T as toc}; diff --git a/zh-cn/assets/index-bccae718.js b/zh-cn/assets/index-0850e6f5.js similarity index 98% rename from zh-cn/assets/index-bccae718.js rename to zh-cn/assets/index-0850e6f5.js index b0e677f..ec0052b 100644 --- a/zh-cn/assets/index-bccae718.js +++ b/zh-cn/assets/index-0850e6f5.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg",t=[p,o],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],r=`

    喷泉码简介

    +const o="/zh-cn/assets/image1-f1a8209b.jpg",p="/zh-cn/assets/image2-f5de5635.jpg",t=[o,p],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],r=`

    喷泉码简介

    **喷泉码(Fountain Code)**是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。

    传统的纠错码(如海明码、RS 码等)通常需要在发送方对数据进行编码,接收方则使用相同的编码进行解码和纠错。这些方法一般具有固定的码率(Code Rate),即针对一定长度的原始数据,编码后的长度是固定的,这些方法在面对不稳定的信道或严重的信道丢失时可能效果不佳。相比之下,喷泉码通过在发送方生成随机的冗余数据,然后将其注入到原始数据中,以创造出一个“喷泉”流——相应的码率也也就不固定了。接收方可以从这个流中采样任意数量的数据包,并将它们合并以恢复原始数据。

    喷泉码的一种常见应用是在无线传感器网络中,其中网络节点之间的通信可能受到弱信号、干扰和多径传播等因素的影响。通过使用喷泉码,节点可以在较差的通信条件下实现可靠的数据传输。

    @@ -30,9 +30,9 @@ const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg

    上述所说的局限性是受到信息论的约束的,无法进一步降低。那么我们有没有办法实现一种方式来降低计算资源的消耗呢?比如我们如果不需要恢复出全部的原始数据呢?受到这个思路的启发 Raptor 算法应运而生。

    Raptor 算法

    Raptor 本质上是一类混合编码方式,结合 LT 编码和 LDPC 编码,同时获取了两种编码的好处。如下图所示:

    -

    图片

    -

    Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

    图片

    +

    Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

    +

    图片

    该编码具有三层结构,中间编码结果经过了两层固定码率编码,分别是 Hamming 编码LDPC 编码,然后再进行 LT 编码生成最终的编码块。

    针对 Raptor 编码的解码方式一般有两种。第一种和编码方式完全相反,首先利用 LT 编码的解码方式恢复出部分的中间编码块,然后利用固定编码的解码方式恢复出原始的数据块。第二种方式则是将上述所有的多层编码方式都变成一种矩阵运算,针对收到数据后利用矩阵的高斯消元方法解出原始的数据块。

    现有为人所熟知的 Raptor 编码主要有 RFC 5053 和 RFC 6330 RaptorQ 编码。两者的实现细节有诸多区别,但是内在的思路和上述的方法是类似的,有兴趣的读者可以进一步进行阅读和学习。

    diff --git a/zh-cn/assets/index-8a16857f.js b/zh-cn/assets/index-0c28844a.js similarity index 99% rename from zh-cn/assets/index-8a16857f.js rename to zh-cn/assets/index-0c28844a.js index 124de29..c500077 100644 --- a/zh-cn/assets/index-8a16857f.js +++ b/zh-cn/assets/index-0c28844a.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",d="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",i="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",m="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",u="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,d,i,o,m,u,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],C=`

    +const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",d="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",i="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",m="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",u="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,d,i,o,m,u,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],f=`

    简介

    blue-ethernet 项目使用 Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在 FPGA 上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析 Ethernet/IP/UDP 网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的 APR 报文处理单元,用于自动解析设备的物理 MAC 地址。

    除了构建标准的 UDP/IP/Ethernet 协议栈,blue-ethernet 还增加了对 RoCE(RDMA over Converged Ethernet)协议的支持,具体包括:

    @@ -413,4 +413,4 @@ make verilog TARGET=UdpIpEthTx SUPPORT_RDMA=TRUE
  • blue-wrapper: https://github.com/wengwz/blue-wrapper
  • 关于项目更多的详细信息可关注链接:

    -

    https://github.com/wengwz/blue-ethernet

    `;export{I as assetURLs,C as default,P as metadata,D as toc}; +

    https://github.com/wengwz/blue-ethernet

    `;export{I as assetURLs,f as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-012cd7f5.js b/zh-cn/assets/index-0e3994dc.js similarity index 99% rename from zh-cn/assets/index-012cd7f5.js rename to zh-cn/assets/index-0e3994dc.js index 0df1c5a..854ed97 100644 --- a/zh-cn/assets/index-012cd7f5.js +++ b/zh-cn/assets/index-0e3994dc.js @@ -1,4 +1,4 @@ -const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",d="/zh-cn/assets/image14-d780d4f2.png",u="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",P="/zh-cn/assets/image20-ef5a452f.png",b="/zh-cn/assets/image21-ebff1568.png",j="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,d,u,h,k,f,g,P,b,j,F],T={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},y=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

    数据流式编程的思想

    +const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",u="/zh-cn/assets/image14-d780d4f2.png",d="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",b="/zh-cn/assets/image20-ef5a452f.png",P="/zh-cn/assets/image21-ebff1568.png",j="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,u,d,h,k,f,g,b,P,j,F],T={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},y=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

    数据流式编程的思想

    数据流式编程思想简介

    数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到 19 世纪 60 年代,由 MIT 的 Jack Dennis 教授开创。

    图片

    @@ -158,7 +158,7 @@ endinterface PipeOut #(Tuple2 #(a, Bool)) poa) (PipeOut #(b)); -

    图片

    +

    图片

    图 14 mkIfThenElse 节点示意图

    mkIfThenElse 可以实现分支逻辑。输入数据是一个 Tuple2#(a, Bool)类型,该节点会根据 Bool 类型的取值将数据包路由到 pipeT 或者 pipeF 子节点。其内部具有一个 FIFO 结构用于存储 Token,从而实现在 pipeT 和 pipeF 两个节点所需处理周期不一致时起到保序的作用。

    此外,PAClib 中还提供了 mkIfThenElse_unordered 变种实现,当对输入和输出之间的数据没有严格的顺序要求时,可以使用这个变种来简化设计。For 循环 使用 mkForLoop 可以创建条件分支,其定义及示意图如下:

    @@ -170,7 +170,7 @@ endinterface (PipeOut #(b)) provisos (Bits #(a, sa)); -

    图片

    +

    图片

    图 15 mkForLoop 节点示意图

    mkForLoop 需要通过 n_iters 参数传入循环次数。在实现逻辑上,Loop Control Logic 内部有一个共享队列,外部进入的新数据和经过循环体执行过一次处理的数据,都会被放到这个队列中。每个新进入的数据都会被打上一个 Tag,Tag 的值为循环次数,这个 Tag 伴随着数据在循环中流动,每流动一次,Tag 减一,Loop Control Logic 在从共享队列中取出数据时,会根据 Tag 的计数值决定将其送入 mkLoopBody 节点还是 mkFinal 节点。内部有两条 Rule,分别独立负责把新数据和正在循环的数据放入 FIFO 中,为循环提供了内在动力(图中 Pump 标注路径)。

    注意,由于 mkLoopBody 也可能是一个需要多拍才能完成的节点,因此可以有多个数据包同时在流水线中进行循环。

    @@ -261,12 +261,12 @@ endfunction f_radix4 (stagenum), param_buf_unfunnel); -

    图片

    +

    图片

    如上述代码片段和图 20 所示,通过 mkMap_fn_with_funnel_indexed 函数的第一个参数来决定实例化多少个 f_radix4 计算单元,从而改变计算的并行度。

        let permuter = mkFn_to_Pipe_Buffered (False, f_permute,
                                                 param_buf_permuter_output);
     
    -

    图片

    +

    图片

    图 21 在不同位置插入流水线寄存器

    如上述代码片段和图 21 所示,通过 mkFn_to_Pipe_Buffered 函数的两个输入参数来控制是否加入 FIFO,从而实现在流水线或组合逻辑之间的切换,使得程序可以在时序上做出简单的调整。

    return mkCompose (grouper,
    diff --git a/zh-cn/assets/index-4da057d8.js b/zh-cn/assets/index-1407e949.js
    similarity index 99%
    rename from zh-cn/assets/index-4da057d8.js
    rename to zh-cn/assets/index-1407e949.js
    index 3844344..d4dad96 100644
    --- a/zh-cn/assets/index-4da057d8.js
    +++ b/zh-cn/assets/index-1407e949.js
    @@ -1,4 +1,4 @@
    -const e="/zh-cn/assets/cover-ef46e9d6.jpg",B="/zh-cn/assets/image1-5a3b2330.jpg",E="/zh-cn/assets/image2-0cf6d643.jpg",l=[e,B,E],i={label:"开源Bluespec bsc编译器和可重用示例设计",description:"这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。",cover:"./cover.jpg",location:"新疆",author:["朱莉·施瓦兹"],date:"2024-01-11",title:"Open source Bluespec bsc compiler and reusable example designs"},t=[{label:"I. 引言",level:2},{label:"II. BSV和BH高级硬件设计语言的背景",level:2},{label:"A. HLS与RTL、Chisel和其他硬件描述语言的比较",level:3},{label:"III. BSV和BH设计、bsc编译器和流程",level:2},{label:"A. 与现有RTL和C语言的互操作性",level:3},{label:"B. bsc内部实现和可选的图形用户界面",level:3},{label:"IV. 教程和书籍",level:2},{label:"V. BSV和BH示例设计",level:2},{label:"A. 开源RISC-V处理器(Bluespec, Inc.)",level:3},{label:"B. RISC-V系统的开源IP(Bluespec,Inc.)",level:3},{label:"C. AWSteria用于主机+FPGA系统的 Infra和Connectal",level:3},{label:"D. AWSteria-RISCV-Virtio (Bluespec, Inc.)",level:3},{label:"E. 安全RISC-V (剑桥大学)",level:3},{label:"F. Shakti RISC-V 处理器(马德拉斯理工学院)",level:3},{label:"G. 片上网络生成器(卡内基梅隆大学)",level:3},{label:"H. BlueCheck 通用硬件测试平台 (剑桥大学)",level:3}],s=`

    封面

    +const e="/zh-cn/assets/cover-ef46e9d6.jpg",B="/zh-cn/assets/image1-5a3b2330.jpg",E="/zh-cn/assets/image2-0cf6d643.jpg",i=[e,B,E],l={label:"开源Bluespec bsc编译器和可重用示例设计",description:"这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。",cover:"./cover.jpg",location:"新疆",author:["朱莉·施瓦兹"],date:"2024-01-11",title:"Open source Bluespec bsc compiler and reusable example designs"},t=[{label:"I. 引言",level:2},{label:"II. BSV和BH高级硬件设计语言的背景",level:2},{label:"A. HLS与RTL、Chisel和其他硬件描述语言的比较",level:3},{label:"III. BSV和BH设计、bsc编译器和流程",level:2},{label:"A. 与现有RTL和C语言的互操作性",level:3},{label:"B. bsc内部实现和可选的图形用户界面",level:3},{label:"IV. 教程和书籍",level:2},{label:"V. BSV和BH示例设计",level:2},{label:"A. 开源RISC-V处理器(Bluespec, Inc.)",level:3},{label:"B. RISC-V系统的开源IP(Bluespec,Inc.)",level:3},{label:"C. AWSteria用于主机+FPGA系统的 Infra和Connectal",level:3},{label:"D. AWSteria-RISCV-Virtio (Bluespec, Inc.)",level:3},{label:"E. 安全RISC-V (剑桥大学)",level:3},{label:"F. Shakti RISC-V 处理器(马德拉斯理工学院)",level:3},{label:"G. 片上网络生成器(卡内基梅隆大学)",level:3},{label:"H. BlueCheck 通用硬件测试平台 (剑桥大学)",level:3}],s=`

    封面

    这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。

    Science Technology

    摘要: bsc编译器是一个商业可用的编译器,在过去的二十年中被广泛使用,于2020年1月作为免费开源工具发布。本文简要介绍了bsc及其流程,提供了可用的教程材料,并介绍了多个可重用的开源设计案例,其中许多设计聚焦在RISC-V上(覆盖了从嵌入式到支持Linux的CPU和系统),所有设计均可部署在FPGA上。

    @@ -79,4 +79,4 @@ bsc编译器接受以高级硬件描述语言BSV和BH(如下所述)编写的
  • 完全可综合化(以BSV编写):Trstbench可以在FPGA上以DUT的速度运行。它可在https://github.com/CTSRD-CHERI/bluecheck上获取,遵循BERI硬件-软件许可证第1.0版。
  • 原文链接: -https://woset-workshop.github.io/PDFs/2021/a02.pdf

    `;export{l as assetURLs,s as default,i as metadata,t as toc}; +https://woset-workshop.github.io/PDFs/2021/a02.pdf

    `;export{i as assetURLs,s as default,l as metadata,t as toc}; diff --git a/zh-cn/assets/index-7df3558a.js b/zh-cn/assets/index-17cb538a.js similarity index 92% rename from zh-cn/assets/index-7df3558a.js rename to zh-cn/assets/index-17cb538a.js index faf9950..43df27c 100644 --- a/zh-cn/assets/index-7df3558a.js +++ b/zh-cn/assets/index-17cb538a.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",t="/zh-cn/assets/image1-0a18e154.png",o=[s,n,t],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},p=[{label:"线上研讨会",level:2}],r=`

    新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

    +const s="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",t="/zh-cn/assets/image1-0a18e154.png",o=[s,n,t],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},r=[{label:"线上研讨会",level:2}],p=`

    新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

    线上研讨会

    达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。

    为了让对开源硬件感兴趣的朋友进一步了解 SpinalHDL,在北京时间 2022 年 12 月 16 日下午 17:00-21:00,达坦科技联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会(Webinar),本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程 (Flow)。

    @@ -11,4 +11,4 @@ const s="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg" 会议号:830 6630 7799
    密码:1216

    对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

    -

    图片

    `;export{o as assetURLs,r as default,a as metadata,p as toc}; +

    图片

    `;export{o as assetURLs,p as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-5e43e574.js b/zh-cn/assets/index-192ae9c1.js similarity index 92% rename from zh-cn/assets/index-5e43e574.js rename to zh-cn/assets/index-192ae9c1.js index 54df414..9dc105f 100644 --- a/zh-cn/assets/index-5e43e574.js +++ b/zh-cn/assets/index-192ae9c1.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",o=[s,t,n],r={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},p=[],a=`

    封面

    +const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",r=[s,t,n],o={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},p=[],a=`

    封面

    2022 年 8 月 5 日-6 日,**一年一度的中国开源基础设施活动日(OpenInfra Days China)**即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。

    云计算基础设施分论坛主要聚焦云计算基础设施领域的前沿技术和优秀实践,围绕多硬件架构和多操作系统支持、人工智能技术应用、网络与存储,数据处理 DPU 及其他加速硬件、硬件自动化和智能运维等方面展开技术分享和探讨。达坦科技联合创始人施继成将在这一分论坛做题为当 RDMA 遇到 Rust 的专题分享。

    图片

    @@ -10,4 +10,4 @@ const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg"

    参会方式

    想要了解更多达坦科技为什么选择 Rust 做 RDMA 库,以及开发设计背后的理念、逻辑、和实践经验,欢迎扫描海报二维码,免费注册报名。

    有意加入 Rust 前沿交流讨论群,请添加小助手微信:

    -

    图片

    `;export{o as assetURLs,a as default,r as metadata,p as toc}; +

    图片

    `;export{r as assetURLs,a as default,o as metadata,p as toc}; diff --git a/zh-cn/assets/index-0f5b2c4d.js b/zh-cn/assets/index-22038a3d.js similarity index 98% rename from zh-cn/assets/index-0f5b2c4d.js rename to zh-cn/assets/index-22038a3d.js index 9f1196f..d89650f 100644 --- a/zh-cn/assets/index-0f5b2c4d.js +++ b/zh-cn/assets/index-22038a3d.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",H="/zh-cn/assets/image13-d816729e.png",D="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",C="/zh-cn/assets/image19-dfed79f8.png",V="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",y="/zh-cn/assets/image22-27167bbd.png",d="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",A="/zh-cn/assets/image26-a854b9f0.png",z="/zh-cn/assets/image27-5b3ff402.png",v="/zh-cn/assets/image28-f02ef5c0.png",I="/zh-cn/assets/image29-44cafcf0.png",R=[l,p,i,a,e,o,n,t,s,c,r,g,H,D,h,L,S,m,C,V,b,y,d,P,f,A,z,v,I],u={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},w=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],B=`

    封面

    +const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",D="/zh-cn/assets/image13-d816729e.png",H="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",V="/zh-cn/assets/image19-dfed79f8.png",C="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",d="/zh-cn/assets/image22-27167bbd.png",y="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",v="/zh-cn/assets/image26-a854b9f0.png",I="/zh-cn/assets/image27-5b3ff402.png",z="/zh-cn/assets/image28-f02ef5c0.png",u="/zh-cn/assets/image29-44cafcf0.png",A=[l,p,i,a,e,o,n,t,s,c,r,g,D,H,h,L,S,m,V,C,b,d,y,P,f,v,I,z,u],B={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},T=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],R=`

    封面

    摘要:
    领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。

    引言

    @@ -118,11 +118,11 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    和类型,也称为标记联合,是一种可以容纳来自固定数量的不同类型之一的单个值并保留所容纳值的类型的数据结构。虽然Verilog和传统软件编程语言如C都没有直接支持和类型,但我们可以在C中模拟其行为:

    图片

    一个简单但广为人知的和类型的例子是'Option'类型:

    -

    图片

    +

    图片

    表2:从SpinalHDL到Verilog的映射。

    当存在和类型和产品类型时,可以对可表示值的集合施加约束。例如,在深度嵌入式HCL中,由“VALID”信号门控的数据信号可以使用“Option”类型表示,这样在检查“VALID”是否为“高”之前,无法读取该值。

    在浅度嵌入式HCL中,和类型只能用于电路结构而不能用于数据,但我们仍然可以使用新类型模式模拟“Option[T]”的行为。我们创建一个函数:

    -

    图片

    +

    图片

    根据值选择onSome或onNone。由于DynamicOption类型构造器是私有的,所以只需要保护值免受未经意访问的影响而不必检查VALID。

    图片

    子类型和参数化多态:子类型(最常见的形式是继承)是一种构建类型层级结构的机制。参数化多态,也称为泛型,是一种编写以类型为输入并以单态类型或函数为输出的类型级别函数的机制。

    @@ -150,7 +150,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 类型检查和IR编译。
  • 生成IR到Verilog代码。(一些深度嵌入式HCL,如Clash,也可以通过面向软件的编译器编译为模拟电路行为的可执行程序)。
  • -

    图片

    +

    图片

    图11:基于Scala的浅嵌入式HCL需要,而基于Haskell的深嵌入式HCL Clash

    基于Cocotb的验证

    4.1 Cocotb简介

    @@ -160,13 +160,13 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    除了支持不同类型的模拟器外,Cocotb相对于使用Verilog、System Verilog或VHDL进行验证具有各种优势,这些优势可以加速整个硬件设计过程。以下是Cocotb的一些显著优势:

    4.2.1 简洁高效的语言特性

    比传统的用于验证的语言如Verilog、VHDL和System Verilog更高效、更具表现力和更简洁。与使用这些传统语言编码相比,使用Python来实现复杂功能需要更少的代码。

    -

    图片

    +

    图片

    图12: 基于Cocotb的验证框架

    与此同时,Python拥有简单的语法和丰富的在线学习资料,使初学者更容易掌握。此外,Python是一种高级编程语言,具有诸多高级特性,如面向对象编程,可以帮助程序员编写更可重用的代码。

    在大多数硬件验证的情况下,C/C++被用于构建DUT的参考模型,参考模型的代码通过DPI集成到SV(System Verilog)的测试代码中。Python比其他语言(如C/C++)在构建参考模型方面更高效的一个编程场景是涉及超过64位的大整数的算术运算。密码学算法如ECC和RSA以及哈希函数通常涉及128位到2048位范围内宽度的大整数运算。C/C++中的原始类型仅支持最大64位的数字。如果使用C/C++构建您的参考模型,处理这些大整数将会很麻烦。下面的C程序实现了两个超过64位宽度的大整数的加法运算:

    图片

    对任意位宽整数的加法操作的Python实现:

    -

    图片

    +

    图片

    在C程序中,超过64位宽度的整数以数组的格式存储,对这些数字进行加法和乘法等运算需要对数组的每个元素进行操作。然而,Python中的整数支持任意位宽,并且可以使用算术符号直接计算这些大整数的算术运算,而无需额外的代码。还有许多其他情况下,Python可以加速构建参考模型并减少错误的可能性。尽管Python在性能方面可能略逊于C/C++,但在硬件验证中,准确性和效率更为重要。

    4.2.2 繁荣的开源社区

    Python在许多编程场景中被广泛应用,并且具有多种类型的库或包。使用Cocotb,将这些现有的基于Python的算法或模型实现作为硬件设计的黄金模型进行重用是非常直接的。或者基于现有的Python库或包来构建参考模型也更加方便。例如,在设计深度学习加速器时,可以将Pytorch、Tensorflow和Caffe等Python库与Cocotb测试平台轻松结合。对于一些用于SoC集成的复杂总线协议(如AXI、PCIe等)的验证,Cocotb提供了相应的开源库。通过重用现有的Python库来构建黄金模型有两个显著的优势:

    @@ -174,7 +174,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 条件黄金模型的正确性或降低错误的可能性。
  • 避免从零开始构建每个验证组件,大大减少工作量。
  • -

    图片

    +

    图片

    图13: Cocotb验证中使用的不同包

    除了便于构建参考模型外,还有许多开源的Python库和包可以帮助我们编写、组织和执行验证代码。在芯片验证过程中,与模拟器进行交互并在其上执行测试台是不可避免的。Cocotb自身提供了一个Makefile模板,帮助开发人员在不使用特定的Linux命令的情况下与模拟器进行交互。编写和执行Makefile以使代码在模拟器上运行仍然有点麻烦。但是,cocotb-test包封装了对模拟器的操作,并将其作为Python函数提供给开发人员。使用cocotb-test包,用户只需要调用一个Python函数并指定其参数即可启动模拟,为cocotb提供了标准的Python单元测试功能。

    基于使用cocotb-test包,您可以使用pytest更高效地编写和管理测试程序,pytest是一个实现了完整功能的成熟Python测试工具的Python包。此外,您还可以使用pytest-xdist或pytest-parallel包在多核处理器上并行运行您的验证代码,这有助于充分利用计算能力以减少执行时间。同时,pyuvm包已经实现了UVM(通用验证方法学)的主要部分,UVM是业界最广泛使用的验证框架。基于cocotb和pyuvm,开发人员可以使用Python而不是SystemVerilog来应用UVM方法学进行验证。

    @@ -187,16 +187,16 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    表4:被测试矩阵乘法器的接口

    4.3.1 构建参考模型

    矩阵乘法器的参考模型可以基于numpy实现,它是一个广泛应用的Python包,提供了丰富的矩阵运算功能。利用numpy,可以直接使用方法“matmul”来实现矩阵乘法,无需使用循环语法。参考模型的具体Python实现如下:

    -

    图片

    +

    图片

    4.3.2 搭建验证平台

    基于Cocotb构建的简单验证平台结构如下图所示。验证平台主要包括四个部分:1)驱动器;2)监控器;3)参考模型;4)缓冲区。驱动器使用Python包random生成随机的输入信号,包括“valid i”、“a i”和“b i”。当“valid i”为高电平时,生成的“a i”和“b i”被发送到参考模型,并获取相应的参考输出。参考输出通过Python包Queue实现的缓冲区存储,一旦输出信号“valid o”为高电平,监控器会抓取DUT的输出端口,并将其值与从缓冲区中取出的参考输出进行比较。驱动器和监控器的功能都是通过Python的协程实现的,类似于多线程,并且可以并行执行。

    -

    图片

    +

    图片

    图14:基于Cocotb的验证平台结构

    4.3.3 启动仿真

    基于Cocotb的验证代码可以通过Makefile在仿真器上启动,而无需直接与仿真器进行交互。此外,使用cocotb-test包中提供的“simulator.run”方法,可以直接在Python函数中启动验证过程。然后可以直接运行该函数,或者使用pytest,一个成熟的Python测试框架,来管理所有测试的执行。

    -

    图片

    +

    图片

    一些pytest命令来管理测试单元的执行:

    -

    图片

    +

    图片

    结论

    本文主要讨论了基于新兴的开源工具SpinalHDL和Cocotb的数字硬件设计和验证,我们相信这些工具可以改变传统芯片开发过程。硬件设计的需求越来越多样化,但设计语言和工具并未明显改进。SpinalHDL和Cocotb试图将一些先进和高效的软件设计概念和方法引入到硬件开发流程中。与基于System Verilog或VHDL的传统设计和验证方法相比,SpinalHDL和Cocotb可以显著提高硬件开发的效率和质量。

    值得注意的是,SpinalHDL不是一种新的高级综合(HLS)工具,而是与Verilog或VHDL具有相同的描述层次。结合我们使用Spinal的开发经验,总结了它相对于Verilog和VHDL的三个主要优势,包括可靠性、表达性和可重用性。关于可靠性,Spinal可以提供更精确的基本电路元素抽象,在编译过程中提前检查一些设计规则,并分离设计和仿真元素。在表达性方面,SpinalHDL建立在Scala上,这是一种高级编程语言。基于Scala的特性,包括面向对象、函数式编程、递归和丰富的集合类型,更容易让硬件开发人员实现和参数化他们的设计。在可重用性方面,SpinalHDL本身提供了对常用电路元素的丰富封装来实现重用。对于设计师来说,使用Scala及其相关工具链更容易生成更具可重用性的代码和构建自己的代码库。

    @@ -209,4 +209,4 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png" [4] B. J. Rosser, “Cocotb: a python-based digital logic verification framework,” 2018. [5] Cocotb, -“https://github.com/cocotb/cocotb.”

    `;export{R as assetURLs,B as default,u as metadata,w as toc}; +“https://github.com/cocotb/cocotb.”

    `;export{A as assetURLs,R as default,B as metadata,T as toc}; diff --git a/zh-cn/assets/index-25c20c62.js b/zh-cn/assets/index-24fab036.js similarity index 95% rename from zh-cn/assets/index-25c20c62.js rename to zh-cn/assets/index-24fab036.js index 3253389..aff0a01 100644 --- a/zh-cn/assets/index-25c20c62.js +++ b/zh-cn/assets/index-24fab036.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/image1-b917417e.jpg",o="/zh-cn/assets/image1-50beaba8.png",a=[n,o],t={label:"倒计时5天:SpinalHDL应用前景探索线上研讨会",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。达坦科技采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广SpinalHDL在业界的落地应用。在2023年12月10日,我们将联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国香港",date:"2023-12-05",title:"Countdown to 5 days: SpinalHDL application prospect exploration online seminar"},p=[{label:"Tooling and flow:",level:2},{label:"Projects :",level:2}],s=`

    SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

    +const n="/zh-cn/assets/image1-b917417e.jpg",o="/zh-cn/assets/image1-50beaba8.png",a=[n,o],p={label:"倒计时5天:SpinalHDL应用前景探索线上研讨会",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。达坦科技采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广SpinalHDL在业界的落地应用。在2023年12月10日,我们将联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国香港",date:"2023-12-05",title:"Countdown to 5 days: SpinalHDL application prospect exploration online seminar"},t=[{label:"Tooling and flow:",level:2},{label:"Projects :",level:2}],s=`

    SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

    达坦科技采用硬件加速提升存储性能,目前采用 FPGA 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用

    在 2023 年 12 月 10 日,我们将联合 SpinalHDL 社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL 应用前景探索》 的线上研讨会,分为两个 Track。

    Tooling and flow:

    @@ -21,4 +21,4 @@ Explore the SpinalHDL Landscape

    会议链接:
    https://zoom.us/j/82302372789?pwd=OYsFCbiW06KqC4U83ZKsZwefM75gJr.1

    开源硬件和敏捷开发感兴趣的朋友,可以添加达坦科技小助手的微信,加入达坦科技硬件群。

    -

    图片

    `;export{a as assetURLs,s as default,t as metadata,p as toc}; +

    图片

    `;export{a as assetURLs,s as default,p as metadata,t as toc}; diff --git a/zh-cn/assets/index-6f8e9292.js b/zh-cn/assets/index-2701299c.js similarity index 93% rename from zh-cn/assets/index-6f8e9292.js rename to zh-cn/assets/index-2701299c.js index 44f0b15..9e611f9 100644 --- a/zh-cn/assets/index-6f8e9292.js +++ b/zh-cn/assets/index-2701299c.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png",a=[t,e],n={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},s=[],i=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    +const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png",a=[t,e],i={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},n=[],s=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    本周四(2 月 2 日)晚上 8 点,达坦科技和分布式实验室合作,由达坦科技 Rust 分布式存储工程师赵佳炜讲述共识算法与跨数据中心一致性的元数据管理,并介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。

    图片

    直播亮点:

    @@ -11,4 +11,4 @@ const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png

    请添加分布式实验室小助手的微信,报名参与直播:

    图片

    达坦科技(DatenLord)推出的开源分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并保证数据的一致性,方便业务系统实现多地多中心多活部署。

    -

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{a as assetURLs,i as default,n as metadata,s as toc}; +

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{a as assetURLs,s as default,i as metadata,n as toc}; diff --git a/zh-cn/assets/index-7e0a1d2c.js b/zh-cn/assets/index-2ab66d66.js similarity index 97% rename from zh-cn/assets/index-7e0a1d2c.js rename to zh-cn/assets/index-2ab66d66.js index ec6d1be..dcec8e3 100644 --- a/zh-cn/assets/index-7e0a1d2c.js +++ b/zh-cn/assets/index-2ab66d66.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg",e="/zh-cn/assets/image2-d20c4e0b.jpg",a="/zh-cn/assets/image1-50beaba8.png",o=[l,t,e,a],i={label:"2023 hackathon攻略新鲜出炉!最后一周还不速来报名!",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",cover:"./cover.jpg",location:"中国香港",date:"2023-12-05",title:"Ding! 2023 hackathon tips fresh from the oven! Last week to sign up before it's too late!"},n=[{label:"Hackathon2023",level:2},{label:"大赛时间线",level:3},{label:"达坦科技 DatenLord 赛题",level:2},{label:"主题",level:3},{label:"背景介绍",level:3},{label:"赛题介绍",level:3},{label:"项目目标",level:3},{label:"项目假设",level:3},{label:"评估标准",level:3},{label:"注意事项",level:3}],r=`

    图片

    +const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg",e="/zh-cn/assets/image2-d20c4e0b.jpg",a="/zh-cn/assets/image1-50beaba8.png",o=[l,t,e,a],i={label:"2023 hackathon攻略新鲜出炉!最后一周还不速来报名!",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",cover:"./cover.jpg",location:"中国香港",date:"2023-12-05",title:"Ding! 2023 hackathon tips fresh from the oven! Last week to sign up before it's too late!"},n=[{label:"Hackathon2023",level:2},{label:"大赛时间线",level:3},{label:"达坦科技 DatenLord 赛题",level:2},{label:"主题",level:3},{label:"背景介绍",level:3},{label:"赛题介绍",level:3},{label:"项目目标",level:3},{label:"项目假设",level:3},{label:"评估标准",level:3},{label:"注意事项",level:3}],s=`

    图片

    Hackathon2023

    DatenLord Hackathon 2023 正式启动! 达坦科技基于其跨云分布式文件系统 DatenLord 项目,结合 AI 大模型时代背景,搭建了擂台,在此正式向您发出邀约!

    本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台 PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!

    @@ -53,4 +53,4 @@ const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg"

    图片

    如有任何问题欢迎联系达坦科技微信小助手:DatenLord_Tech或发送邮件至 info@datenlord.com

    -

    图片

    `;export{o as assetURLs,r as default,i as metadata,n as toc}; +

    图片

    `;export{o as assetURLs,s as default,i as metadata,n as toc}; diff --git a/zh-cn/assets/index-0c25eea3.js b/zh-cn/assets/index-2b1c59a2.js similarity index 97% rename from zh-cn/assets/index-0c25eea3.js rename to zh-cn/assets/index-2b1c59a2.js index 25c7558..88f473f 100644 --- a/zh-cn/assets/index-0c25eea3.js +++ b/zh-cn/assets/index-2b1c59a2.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],g=`

    封面

    +const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],p=`

    封面

    倒计时

    Rust 语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用 Rust。达坦科技(DatenLord)旗下的开源项目 Xline (用于元数据管理的分布式 KV 存储)就是用 Rust 写就的,我们也一直坚定地做 Rust 语言在中国的布道。

    因此,2023 年 6 月 17-18 日 我们也将奔赴上海,支持 Rust 语言中文社区在疫情之后首次举办的大型线下 Rust 开发者大会。达坦科技的两位创始人将在 Rust China Conf 2023 上分别做主题演讲,在 6 月 17 日晚,达坦科技还将赞助举办一场干货满满的 workshop。

    @@ -31,4 +31,4 @@ const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg"

    添加小助手微信,进入达坦科技 Rust 前沿技术交流群

    封面

    更多关于 Rust China Conf 2023 官方信息,请查阅
    --https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,g as default,r as metadata,e as toc}; +-https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,p as default,r as metadata,e as toc}; diff --git a/zh-cn/assets/index-40aedb60.js b/zh-cn/assets/index-2bfed728.js similarity index 98% rename from zh-cn/assets/index-40aedb60.js rename to zh-cn/assets/index-2bfed728.js index 7811479..6c36a0b 100644 --- a/zh-cn/assets/index-40aedb60.js +++ b/zh-cn/assets/index-2bfed728.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",g="/zh-cn/assets/image16-73064f95.png",m="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",f=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,g,m,R,_,b,j,S,E],y={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],F=`

    引 言

    +const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",m="/zh-cn/assets/image16-73064f95.png",g="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",y=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,m,g,R,_,b,j,S,E],f={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],v=`

    引 言

    循环冗余校验码,即 Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC 算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC 检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要 CRC 来保证数据传输的正确性。而不同的应用场景往往需要采用不同的 CRC 配置参数,同时对计算的性能也有不同的需求。例如,在基于 Ethernet 协议的网络传输中需要采用 IEEE802-3 协议所规定的 CRC 参数,同时需要高吞吐率的 CRC 实现以和网络带宽相匹配。

    对于一个具体的通信系统,CRC 既可以通过软件编程也可以硬件电路的形态来实现。相较于网络上丰富的软件库,开源的 CRC 硬件实现却相对落后,尤其是面向高性能的应用场景。例如,下述链接都提供了参数可配置的 CRC 硬件电路生成器,但这些实现方式都是直接将 CRC 算法映射到组合逻辑电路上,这往往会导致较长的组合逻辑延时进而降低电路的整体工作频率,无法满足高吞吐率的需求。

    下面我们来定义系统做可能发生的动作。

    -

    图片

    +

    图片

    -

    图片

    `;export{e as assetURLs,o as default,s as metadata,r as toc}; +

    图片

    `;export{e as assetURLs,o as default,r as metadata,s as toc}; diff --git a/zh-cn/assets/index-b5bb516b.js b/zh-cn/assets/index-50ad21f0.js similarity index 93% rename from zh-cn/assets/index-b5bb516b.js rename to zh-cn/assets/index-50ad21f0.js index 93c613d..b5a596d 100644 --- a/zh-cn/assets/index-b5bb516b.js +++ b/zh-cn/assets/index-50ad21f0.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-2326b9d3.jpg",i="/zh-cn/assets/image1-62ba36d5.png",t="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,i,t,l],a={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},n=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],c=`

    封面

    +const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png",i="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,t,i,l],a={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},c=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],n=`

    封面

    为什么要发起设立 MIT 体系结构公开课学习社区?

    随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。

    由此,在 2023 年伊始,达坦科技发起成立了 MIT 体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。

    @@ -20,7 +20,7 @@ const e="/zh-cn/assets/cover-2326b9d3.jpg",i="/zh-cn/assets/image1-62ba36d5.png" -

    封面

    +

    封面

    `;export{e as assetURLs,n as default,i as metadata,t as toc}; +`;export{l as assetURLs,s as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-68779906.js b/zh-cn/assets/index-68779906.js new file mode 100644 index 0000000..edd8c1e --- /dev/null +++ b/zh-cn/assets/index-68779906.js @@ -0,0 +1,80 @@ +const t="/zh-cn/assets/cover-1ac6df35.webp",r=[t],o={label:"达坦科技@了你,并邀请你参加2024开源之夏!",description:"开源之夏(英文简称“OSPP”)是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与,积极鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者。今年,达坦科技一如既往带着对开源的热忱与初心,携旗下开源项目第五次参与开源之夏。",cover:"./cover.webp",location:"中国香港",date:"2024-05-09",title:"DartanLord @ you and invited you to the 2024 Summer of Open Source!"},l=[{label:"开源之夏为什么值得参加?",level:2},{label:"达坦科技项目列表",level:2},{label:"题目一",level:3},{label:"题目二",level:3},{label:"学生参与指北:",level:2},{label:"活动日程",level:2}],n=`

    图片

    +

    开源之夏(英文简称“OSPP”)是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与,积极鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者。今年,达坦科技一如既往带着对开源的热忱与初心,携旗下开源项目第五次参与开源之夏。

    +

    开源之夏为什么值得参加?

    + +

    达坦科技项目列表

    +

    题目一

    +

    项目名称:为开源 RDMA 网卡驱动程序适配 NVIDIA 或 AMD GPU

    +

    项目描述: 随着 AI 浪潮的到来,读写 GPU 显存成为了 RDMA 网卡必须支持的功能之一。本项目需要为开源 RDMA 网卡 blue-rdma 编写对应的内核态及用户态驱动程序,从而使之能够支持对 N 卡或 A 卡显存进行访问的能力。其中用户态驱动使用 Rust 开发,部分功能涉及到 Linux Kernel 开发以及 C-FFI 调用交互。

    +

    项目备注:
    +https://docs.nvidia.com/cuda/gpudirect-rdma/index.html
    +https://rocm.docs.amd.com/en/latest/

    +

    项目难度: 进阶

    +

    项目产出要求:

    + +

    项目技术要求:

    + +

    项目成果仓库:
    +https://github.com/datenlord/open-rdma

    +

    题目二

    +

    项目名称:为开源 RDMA 网卡适配 lumina 测试工具

    +

    项目描述: lumina 是微软开源的一款 RDMA 网卡测试工具,由于 blue-rdma 项目对标准 RDMA 协议进行了优化调整,因此无法直接使用 lumina 测试工具。本项目要求参与者修改 lumina 项目,使之能够适配 blue-rdma 所使用的通信协议。

    +

    项目备注:
    +github.com/lumina-test/lumina
    +https://www.cs.jhu.edu/~zhuolong/papers/sigcomm23lumina.pdf

    +

    项目难度: 进阶

    +

    项目产出要求:

    + +

    项目技术要求:
    +熟悉 C、Python 语言
    +有很强的学习能力,能够快速掌握 P4 交换机开发、能够快速掌握 RDMA 协议的基本概念和编程模型

    +

    项目成果仓库:
    +https://github.com/datenlord/open-rdma

    +

    学生参与指北:

    + +

    活动日程

    +

    03/11 - 03/31
    +社区报名与审核

    +

    04/30 - 06/04
    +学生注册、与导师沟通项目、提交项目申请
    +当前

    +

    06/05 - 06/25
    +项目申请审核

    +

    06/26
    +中选公示

    +

    06/26 - 06/30
    +项目开发预热

    +

    07/01 - 09/30
    +项目开发

    +

    10/01 - 10/31
    +结项审核-PR/MR 合并与导师审核

    +

    11/01 - 11/08
    +结项审核-组委会成果审核

    +

    11/09
    +结项公示

    +

    对于报名方式有任何疑问,或者对某一个任务非常感兴趣,并且想要深入了解的同学,欢迎扫码添加小助手微信:DatenLord_Tech,或发邮件至info@datenlord.com

    +

    “开源之夏”活动在众多的开源项目与高校学生之间搭建了一座桥梁。同学们通过参与“开源之夏”的活动,在开源项目导师的指导下,不但可以丰富项目实践经验,提升项目开发的技能,而且可以与开源项目的开发者进行深度的交流,以一种最直接的方式了解开源,深入开源,为后续的学业方向提供参考,职业发展积累人脉。欢迎各位同学热情参与体验 DatenLord 的开源之夏项目!

    `;export{r as assetURLs,n as default,o as metadata,l as toc}; diff --git a/zh-cn/assets/index-a154d453.js b/zh-cn/assets/index-696ef44a.js similarity index 98% rename from zh-cn/assets/index-a154d453.js rename to zh-cn/assets/index-696ef44a.js index 0e9d7ef..cc57ed1 100644 --- a/zh-cn/assets/index-a154d453.js +++ b/zh-cn/assets/index-696ef44a.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},l=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],p=`

    图片

    +const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},l=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],r=`

    图片

    作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨会。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

    Part.1

    《RISC-V敏捷硬件开发-软件定义芯片》

    @@ -19,4 +19,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷

    《MetaHVL硬件敏捷验证与协同仿真》

    华南理工大学计算机学院副教授赖晓铮的分享主题是《MetaHVL硬件敏捷验证与协同仿真》。赖老师从芯片设计的规模和芯片设计的成本是不成比例(规模是线性提升,成本是指数提升)的现状出发,提出硬件设计的流程有更敏捷的需求。而敏捷是包含设计和验证两个维度的全流程敏捷。他分享了运用创新EDA方法学和工具以进一步分离设计与实现;此外,提高设计抽象层次的同时,也需要提高验证的抽象层次。赖老师介绍了他在Meta-HVL项目研究的中期结论,即小规模设计的加速比明显,规模越大,DUT运行时间占比越大,则验证加速起到的作用越小。因此,时间应该花在提高验证的效率上,而不是把时间和资源花在加速验证代码的运行上。

    结束语

    -

    如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

    `;export{e as assetURLs,p as default,a as metadata,l as toc}; +

    如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

    `;export{e as assetURLs,r as default,a as metadata,l as toc}; diff --git a/zh-cn/assets/index-71801d47.js b/zh-cn/assets/index-6a3ed4c3.js similarity index 95% rename from zh-cn/assets/index-71801d47.js rename to zh-cn/assets/index-6a3ed4c3.js index 1fe4386..434a40f 100644 --- a/zh-cn/assets/index-71801d47.js +++ b/zh-cn/assets/index-6a3ed4c3.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",s=[t,o],e={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},n=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

    图片

    +const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",e=[t,o],n={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},s=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

    图片

    2023 RISC-V中国峰会

    2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会

    随着数字芯片的设计规模和复杂度越来越大,加之芯片市场的竞争越来越激烈,如何提升数字芯片的开发和验证效率成为业界关注的焦点。虽然各种设计工具、验证方法学层出不穷,但是一直没有得到业界广泛认可。目前业界普遍采用的还是基于Verilog、SystemVerilog、VHDL和UVM的工具和方法。

    @@ -16,4 +16,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg"

    收看链接:
    https://wx.vzan.com/live/tvchat-904511107?v=1691984417574
    或欢迎点击下方链接预约公众号直播。

    -

    感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

    `;export{s as assetURLs,r as default,e as metadata,n as toc}; +

    感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

    `;export{e as assetURLs,r as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-69ce89cf.js b/zh-cn/assets/index-7007c1ed.js similarity index 93% rename from zh-cn/assets/index-69ce89cf.js rename to zh-cn/assets/index-7007c1ed.js index dc1b8d9..750c022 100644 --- a/zh-cn/assets/index-69ce89cf.js +++ b/zh-cn/assets/index-7007c1ed.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png",a="/zh-cn/assets/image1-50beaba8.png",n=[t,o,a],e={label:"叮!您收到了一封来自达坦科技的Hackthon邀请函",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",location:"中国香港",date:"2023-11-17",title:"Ding! You've received a Hackthon invitation from Dartan Technologies!"},s=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],l=`

    Hackathon2023

    +const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png",n="/zh-cn/assets/image1-50beaba8.png",a=[t,o,n],e={label:"叮!您收到了一封来自达坦科技的Hackthon邀请函",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",location:"中国香港",date:"2023-11-17",title:"Ding! You've received a Hackthon invitation from Dartan Technologies!"},r=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],s=`

    Hackathon2023

    DatenLord Hackathon 2023 正式启动! 达坦科技基于其跨云分布式文件系统 DatenLord 项目,结合 AI 大模型时代背景,搭建了擂台,在此正式向您发出邀约!

    本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台 PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!

    主题

    @@ -30,5 +30,5 @@ const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png

    图片

    如有任何问题欢迎联系达坦科技微信小助手:DatenLord_Tech 或发送邮件至
    info@datenlord.com

    -

    图片

    -

    让我们一起在 Hackathon2023 的舞台上尽情释放创意的火花,期待与优秀的你碰撞出新的想法!

    `;export{n as assetURLs,l as default,e as metadata,s as toc}; +

    图片

    +

    让我们一起在 Hackathon2023 的舞台上尽情释放创意的火花,期待与优秀的你碰撞出新的想法!

    `;export{a as assetURLs,s as default,e as metadata,r as toc}; diff --git a/zh-cn/assets/index-81d1e484.js b/zh-cn/assets/index-81d1e484.js new file mode 100644 index 0000000..27203a9 --- /dev/null +++ b/zh-cn/assets/index-81d1e484.js @@ -0,0 +1,153 @@ +const s="/zh-cn/assets/cover-ca6ff87c.webp",e="/zh-cn/assets/image1-78435096.webp",n=[s,e],l={label:"Xline中区间树实现小结",description:"在Xline最近的一次重构中, 我们发现有两个在关键路径上的数据结构Speculative Pool和Uncommitted Pool导致了性能瓶颈。这两个数据结构用于在CURP中进行冲突检测。具体来说, 由于CURP协议的要求, 对于每个处理的command, 需要在已经接收的commands中找到所有与当前command相冲突的commands。",cover:"./cover.webp",location:"中国香港",author:["尹正皓"],date:"2024-03-28",title:"A short summary of the implementation of interval trees in Xline copy"},a=[{label:"实现区间树的起因",level:2},{label:"区间树实现简介",level:2},{label:"插入/删除",level:3},{label:"查询重叠操作",level:3},{label:"使用 Safe Rust 实现区间树",level:2},{label:"困难点",level:3},{label:"Rc封面

    +

    实现区间树的起因

    +

    在 Xline 最近的一次重构中, 我们发现有两个在关键路径上的数据结构 Speculative Pool 和 Uncommitted Pool 导致了性能瓶颈。这两个数据结构用于在 CURP 中进行冲突检测。具体来说, 由于 CURP 协议的要求, 对于每个处理的 command, 需要在已经接收的 commands 中找到所有与当前 command 相冲突的 commands。

    +

    例如对于 KV 操作 put/get_range/delete_range, 我们需要考虑这些操作之间可能的冲突情况。由于每个 KV 操作都会有一个 key 的范围, 所以问题就转化为要查询某一个 key 范围和某个 Pool 中所有 key 范围的集合是否有相交。采用朴素遍历整个集合的方法会导致每次查询的时间复杂度为 O(n),从而降低效率并导致性能瓶颈。

    +

    为了解决这一问题, 我们需要引入区间树这一数据结构。区间树能够高效支持重叠区间的插入,删除和查询操作, 这三种操作都可以在 O(log(n)) 的时间内完成。因此, 我们可以利用区间树维护 key 范围的集合, 从而解决性能瓶颈的问题。

    +

    区间树实现简介

    +

    Xline 中的区间树是基于 Introduction to Algorithms (3rd ed.) 实现的, 它是由二叉平衡树扩展而来。

    +

    区间树以一颗二叉平衡树为基础(例如使用红黑树实现), 将区间本身作为平衡树的 key。对于区间 [low, high] , 我们首先按照 low 值进行排序, 如果 low 值相同, 再按照 high 值进行排序, 这样对区间集合能够定义一个全序的关系(如果不处理重复区间则不需要对 high 排序)。同时, 对于平衡树的每一个节点, 我们在这个节点上记录以这个节点为根的子树中 high 的最大值, 记为 max 。

    +

    插入/删除

    +

    与红黑树的插入/删除相同, 最坏时间复杂度为 O(log(n))

    +

    查询重叠操作

    +

    给出一个区间 i , 我们需要查询当前树中是否有区间和 i 重合。在 Introduction to Algorithms 中给出的伪代码如下

    +

    图片

    +

    有了 max 的定义, 解决这个问题的思路就非常简单了: 对于以 x 为根的子树 T_x , 如果 i 不和 x_i 相交, 那么 i 一定是在 x_i 的左侧或者右侧。

    +
      +
    1. 如果 i 在 x_i 的左侧这时可以直接排除右子树, 因为这时 i.high 比 x_i.low 还要小
    2. +
    3. 如果 i 在 x_i 的右侧在这种情况下, 我们无法直接排除左子树, 因为左子树中的节点区间仍然可能和 i 相交。这时候 max 值就派上用场了:
    4. +
    +
      +
    • 如果 x 的左子树中 high 的最大值仍然小于 i.low 的话, 那么可以直接排除 x 的左子树。
    • +
    • 如果 x 的左子树中 high 的最大值大于或等于 i.low 的话, 那么左子树中一定存在和 i 相交的区间, 因为 x 左子树中所有的 low 都小于 x_i.low , 而 i 在 x_i 的右侧, 所以 x 左子树中所有的 low 也小于 i.low , 因此一定有相交。
    • +
    +

    通过以上两点可以验证上述伪代码的正确性, 并且从代码可以看出查询的最坏时间复杂度为 O(log(n)) 。

    +

    使用 Safe Rust 实现区间树

    +

    困难点

    +

    为了构建区间树, 我们首先需要实现一个红黑树。在红黑树中, 每个树节点需要指向父节点, 这就要求一个节点实例存在多个所有权。

    +

    Rc<RefCell>

    +

    最初我尝试使用了 Rust 最常见的多所有权的实现 Rc<RefCell> , 树节点结构类似于以下的代码:

    +
    struct Node<T, V> {
    +    left: Option<NodeRef<T, V>>,
    +    right: Option<NodeRef<T, V>>,
    +    parent: Option<NodeRef<T, V>>,
    +    ...
    +}
    +
    +struct NodeRef<T, V>(Rc<RefCell<Node<T, V>>>);
    +
    +

    从数据结构定义上看起来还算清晰, 但是实际使用起来相当繁琐, 因为 RefCell 要求用户明确地调用 borrow , 或者 borrow_mut , 我不得不构建很多 helper functions 来简化实现, 下面是一些例子:

    +
    impl<T, V> NodeRef<T, V> {
    +    fn left<F, R>(&self, op: F) -> R
    +    where
    +        F: FnOnce(&NodeRef<T, V>) -> R,
    +    {
    +        op(self.borrow().left())
    +    }
    +
    +    fn parent<F, R>(&self, op: F) -> R
    +    where
    +        F: FnOnce(&NodeRef<T, V>) -> R,
    +    {
    +        op(self.borrow().parent())
    +    }
    +
    +    fn set_right(&self, node: NodeRef<T, V>) {
    +        let _ignore = self.borrow_mut().right.replace(node);
    +    }
    +
    +    fn set_max(&self, max: T) {
    +        let _ignore = self.borrow_mut().max.replace(max);
    +    }
    +    ...
    +}
    +
    +

    RefCell 使用上不符合人体工程学是一点, 更糟糕的是我们在代码中需要使用大量的 Rc::clone , 因为在自上而下遍历树节点时, 我们需要持有一个节点的 owned type, 而不是一个引用。例如在之前提到的 INTERVAL-SEARCH 操作中, 每次 x = x.left 或者 x = x.right , 首先需要 borrow x 本身, 再赋值给 x。因此需要先取得左(或右)节点的 owned type, 再更新 x 到新值。这样导致大量的节点计数开销。

    +

    具体开销到底有多大?我尝试对于我们上面的实现进行 benchmark, 使用随机数据插入和删除。我本机环境为 Intel 13600KF 和 DDR4 内存。

    +
    test bench_interval_tree_insert_100           ... bench:       9,821 ns/iter (+/- 263)
    +test bench_interval_tree_insert_1000          ... bench:     215,362 ns/iter (+/- 6,536)
    +test bench_interval_tree_insert_10000         ... bench:   2,999,694 ns/iter (+/- 134,979)
    +test bench_interval_tree_insert_remove_100    ... bench:      18,395 ns/iter (+/- 750)
    +test bench_interval_tree_insert_remove_1000   ... bench:     385,858 ns/iter (+/- 7,659)
    +test bench_interval_tree_insert_remove_10000  ... bench:   5,465,355 ns/iter (+/- 114,735)
    +
    +

    使用相同数据和环境, 和 etcd 的 golang 区间树实现进行对比:

    +
    BenchmarkIntervalTreeInsert100-20                 123747             12250 ns/op
    +BenchmarkIntervalTreeInsert1000-20                  7119            189613 ns/op
    +BenchmarkIntervalTreeInsert10_000-20                 340           3237907 ns/op
    +BenchmarkIntervalTreeInsertRemove100-20            24584             45579 ns/op
    +BenchmarkIntervalTreeInsertRemove1000-20             344           3462977 ns/op
    +BenchmarkIntervalTreeInsertRemove10_000-20             3         358284695 ns/op
    +
    +

    可以看到我们的 Rust 实现并无优势, 甚至有时插入操作还会更慢。(注: 这里的 etcd 的节点删除实现似乎有问题, 观察节点数量从 1000->10000 时耗时的增长, 复杂度可能不是 O(log(n)))

    +

    线程安全问题

    +

    即使我们勉强接受以上的性能, 一个更严重的问题浮出水面: Rc<RefCell> 无法在多线程环境下使用! 由于 Xline 是在 Rust 的 Tokio runtime 之上构建, 需要在多个线程间共享一个区间树实例。可惜的是, Rc 本身是 !Send , 因为 Rc 内部的引用计数是以非原子的方式递增/减的。那么这就导致整个区间树的数据结构无法发送到其他线程。除非我们采用一个专用线程, 并且通过 channel 与这个线程进行通信, 我们无法在多线程环境下使用。

    +

    其他智能指针

    +

    于是我们需要考虑其他智能指针来解决这个问题。一个自然的想法是使用 Arc<RefCell> 。然而, RefCell 本身是 !Sync , 因为 RefCell 的 borrow checking 只能在单线程下使用, 无法同时由多个线程共享, 并且 Arc 是 Send 当且仅当 T 是 Sync , 因为 Arc 本身允许克隆。

    +

    Arc<Mutex>?

    +

    那么在多线程环境多所有权似乎只能够使用 Arc<mutex> 了。但是显然这对于我们的用例来说是一个 anti-pattern, 因为这样我们就需要对每一个节点都加上一把锁, 而树中可能有数十万乃至几百万的节点, 这是不可接受的。

    +

    QCell

    +

    在使用常规方法无果后, 我们尝试使用了 qcell 这个 crate, 其中 QCell 作为 RefCell 的多线程替代品。作者非常巧妙地解决了多所有权下借用检查的问题。

    +

    QCell 设计

    +

    由于 qcell 的设计在 GhostCell 的论文中有正式的证明, 这里我就介绍介绍一下 GhostCell 论文中的设计:

    +

    在 Rust 中, 对于数据操作的权限和数据本身是绑定在一起的, 也就是说, 你首先要拥有一个数据, 才能修改它的状态。具体一点, 想要修改数据 T , 你要么有一个 T 本身, 要么有一个 &mut T 。

    +

    GhostCell 的设计概念是将对数据操作的权限和数据本身分开, 那么对于一种数据, 数据 T 本身是一个类型, 而它的权限同样也是是一个具体的类型, 记为 P_t 。这种设计相比与 Rust 现有设计就更加灵活, 因为可以让一个权限类型的实例拥有对一个数据集合的权限, 即一个 P_t 拥有多个 T 。在这种设计下, 只要权限类型实例本身是线程安全的, 它所管理的这一个数据集合也是线程安全的。

    +

    在 qcell 中使用方法如下, 首先需要创建一个 QCellOwner 代表前述的权限, QCell 则表示储存的数据。

    +
    let mut owner = QCellOwner::new();
    +let item = Arc::new(QCell::new(&owner, Vec::<u8>::new()));
    +owner.rw(&item).push(0);
    +
    +

    QCellOwner 拥有注册到它这里的 QCell 的读写权限(通过 QCellOwner::rw 或者 QCellOwner::ro ), 所以只要 QCellOwner 是线程安全, QCell 中的数据也是线程安全的。在这里 QCellOwner 本身是 Send + Sync , QCell 也可以是 Send + Sync 只要 T 满足:

    +
    impl<T: ?Sized + Send> Send for QCell<T>
    +impl<T: ?Sized + Send + Sync> Sync for QCell<T>
    +
    +

    使用 QCell

    +

    得益于它的设计, QCell 本身开销非常小(这里的具体的开销不展开讲了), 因为它借助于 Rust 类型系统使得 borrow checking 是在编译期检查的, 而 RefCell 相比之下则是在运行时检查, 因此使用 QCell 不仅能在多线程环境下使用, 还能够提升一部分性能。

    +

    接下来就是应用 QCell 到我们的树实现上了。由于 QCell 只提供内部可变性, 要能够使用多重所有权, 我们还需要有 Arc , 结构大致看起来如下:

    +
    pub struct IntervalTree {
    +    node_owner: QCellOwner,
    +    ...
    +}
    +
    +struct NodeRef<T, V>(Arc<QCell<Node<T, V>>>);
    +
    +

    看起来不错, 那么性能如何呢?

    +
    test bench_interval_tree_insert_100           ... bench:      41,486 ns/iter (+/- 71)
    +test bench_interval_tree_insert_1000          ... bench:     586,854 ns/iter (+/- 13,947)
    +test bench_interval_tree_insert_10000         ... bench:   7,726,849 ns/iter (+/- 102,820)
    +test bench_interval_tree_insert_remove_100    ... bench:      75,569 ns/iter (+/- 325)
    +test bench_interval_tree_insert_remove_1000   ... bench:   1,135,232 ns/iter (+/- 7,539)
    +test bench_interval_tree_insert_remove_10000  ... bench:  15,686,474 ns/iter (+/- 194,385)
    +
    +

    比较之前的测试结果, 性能竟然下降了 1-3 倍。这说明最大的开销不是 Cell, 而是引用计数, 在我们的区间树用例中, 使用 Arc 比 Rc 慢了非常多。

    +

    一个不使用 Arc 的方法是使用 arena 分配, 即一次性对所有对象分配内存, 并且销毁也是一次性的, 但是这在树的数据结构中并不适用, 因为我们需要动态地分配和销毁节点的内存。

    +

    数组模拟指针

    +

    性能测试反映出我们的智能指针尝试是失败的。在 Rust 所有权模型下, 使用智能指针来实现树结构是非常糟糕的。

    +

    那么我们可不可以不使用指针来实现呢? 一个自然的想法是使用数组来模拟指针。

    +

    于是我们的树结构重新设计如下:

    +
    pub struct IntervalTree {
    +    nodes: Vec<Node>,
    +    ...
    +}
    +
    +pub struct Node {
    +    left: Option<u32>,
    +    right: Option<u32>,
    +    parent: Option<u32>,
    +    ...
    +}
    +
    +

    可以看出在 Rust 中数组模拟指针的优势是不需要某个节点的所有权, 只需要记录下某个节点在 Vec 中的位置即可。每次插入新节点即向 nodes 后面 push 一个节点, 它的模拟指针就是 nodes.len() - 1 。

    +

    对于插入操作非常简单, 但是如果我们需要删除节点呢? 如果使用朴素的删除方法: 更新树节点的指针后直接将 Vec 中的对应的节点置为空, 那么这样就会在我们的 Vec 中留下一个“空洞”。这样的话我们需要再额外维护一个链表结构来记录这个“空洞”的位置, 以便在下一次插入的时候能重新使用。而且这种方法会导致 nodes 这个 Vec 的空间难以回收, 即使大部分节点已经被删除。

    +

    那么如何解决这个问题呢? 接下来我参照了 petgraph 中的方法, 在删除一个节点时, 将这个节点与 Vec 中最后一个节点交换再移除, 这样就解决了之前的内存回收的问题。需要注意的是, 我们需要同时更新与最后一个节点有关节点的指针, 因为它的位置发生了变化。在 petgraph 的图实现中, 这个操作可能是很耗时的, 因为一个节点可能会连接多条边, 但是在我们的树用例中, 我们只需要更新这个节点的父亲/左孩子/右孩子总共 3 个节点, 因此这个操作是 O(1) 的, 这样就非常高效的解决了节点删除的问题。

    +

    我们再来对我们的新实现进行 benchmark:

    +
    test bench_interval_tree_insert_100           ... bench:       3,333 ns/iter (+/- 87)
    +test bench_interval_tree_insert_1000          ... bench:      85,477 ns/iter (+/- 3,552)
    +test bench_interval_tree_insert_10000         ... bench:   1,406,707 ns/iter (+/- 20,796)
    +test bench_interval_tree_insert_remove_100    ... bench:       7,157 ns/iter (+/- 69)
    +test bench_interval_tree_insert_remove_1000   ... bench:     189,277 ns/iter (+/- 3,014)
    +test bench_interval_tree_insert_remove_10000  ... bench:   3,060,029 ns/iter (+/- 50,829)
    +
    +

    从结构来看这次的性能提升非常之大, 对比之前的 Rc<RefCell> 或者是 etcd 的 golang 的实现大约快了 1-2 倍。

    +

    使用数组模拟指针不仅轻松解决了所有权的问题, 并且由于数组内存的连续性使其对于缓存更加友好, 比纯指针性能甚至会更高。

    +

    总结

    +

    至此, 我们成功完美解决了使用 safe Rust 实现区间树的问题。从之前所述的多种尝试来看, 在 Rust 中使用引用计数智能指针来实现树或者图的数据结构是失败的, 因为这些智能指针并不适用于大量的内存操作。将来如果需要使用 safe Rust 实现指针类数据结构, 我会优先考虑使用数组而不是智能指针。

    `;export{n as assetURLs,t as default,l as metadata,a as toc}; diff --git a/zh-cn/assets/index-b9ee750d.js b/zh-cn/assets/index-89698b14.js similarity index 86% rename from zh-cn/assets/index-b9ee750d.js rename to zh-cn/assets/index-89698b14.js index b0d35f5..8ef61af 100644 --- a/zh-cn/assets/index-b9ee750d.js +++ b/zh-cn/assets/index-89698b14.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",n="/zh-cn/assets/image2-20a7bcaa.jpg",a=[t,e,n],s={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},o=[{label:"CURP 协议",level:2}],c=`

    图片

    +const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",a="/zh-cn/assets/image2-20a7bcaa.jpg",n=[t,e,a],o={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},s=[{label:"CURP 协议",level:2}],c=`

    图片

    CURP 协议

    传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源的分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。

    Xline 中所使用的共识协议,即非 Paxos ,也非 Raft,而是一种新的名为 Curp 的共识协议,其全称为 “Consistent Unordered Replication Protocol”。CURP 协议发表于 2019 年,其协议主要论述的是主从备份的场景,共识场景仅仅在附录中有简单表述,缺乏严肃验证。

    @@ -6,4 +6,4 @@ const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg"

    本次直播分享,达坦科技联合思否,邀请达坦科技的联合创始人兼 CTO 施继成做一个关于 CURP 协议的工业化实践的直播,分享将论述 CURP 协议的正确性,同时以 KV 存储软件 Xline 为例子讲述如何在工业产品中使用该共识算法。

    图片

    会议号:474-6575-9473

    -

    图片

    `;export{a as assetURLs,c as default,s as metadata,o as toc}; +

    图片

    `;export{n as assetURLs,c as default,o as metadata,s as toc}; diff --git a/zh-cn/assets/index-86e42443.js b/zh-cn/assets/index-90593fbc.js similarity index 99% rename from zh-cn/assets/index-86e42443.js rename to zh-cn/assets/index-90593fbc.js index e71ef1d..9099a01 100644 --- a/zh-cn/assets/index-86e42443.js +++ b/zh-cn/assets/index-90593fbc.js @@ -1,4 +1,4 @@ -const s="data:image/png;base64,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",a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANAAAABGCAAAAACY8EX2AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAeOSURBVGje7ZptUFTXGcd/vKwgEeMiK8qLJRJFjUZEBqdNQ3cSpVUno+RDLWJL1UCTVEtLfCG+ZIJOUUOaCTFpNFajGGmDlTGDk2iMIpIJVYbIm2hQCriKk7Cwiu5ScNntBwT27i537142rMnw/8Ke5zznuc9vzrnn7eJh5sclb2luu+tb29Y86+5kXQhkaK0nxN25SpKnNLf038Hj7s7VlUBUEiuxM38gQGVEuTtVlwJpNcxyd6rSJHEc1UAkd06cmbza190ZO5DEHqokRtGQXH69sNzdCbsIqIzZdS8nLzXQ7e6EXQPUpkGflp7gw9RodyfsSB6Stj7ntkByshedPhKc9dm623fen+AmIMtJ4XK32Wy2AvSZBlCBHweLtwdL4aHL2KRjnJt4LHvo/jx7DseUQHJjSsL2Er9CiXNiTsHcN9wFZJGiIvUDInaPeFDq1rV8c7oKip6H241EPfJSiUEXkLxhpoSgwlW43d9jCIEsJ4XEaOp39xa8Aqct2ZUVzHGgFiLRg7JS85iEmFoNT/aXcp/LGkIeAZDnJj+OfmVZ+1Tu9PprUE2sgol+3Nu7eJSEmDUQ2V8qkJ3bN5tWJyYPBojALbBNa2lRbOI0fMsz4LuCxcYXpcSsJEZB0+6V+QCkr1wtE6jTVN3s/GRpFujtuLg/GQWWc4fM5vZ6s9l419xxzWSWoqS4j8xFcZlxcTpJ7qKR8hx41BmtDFYL64vhVBwWWJ5eDv6T0C5d1OAbIentbtXw5Gc73wsDk8yu6VWbBtE5SHsq4wWtlc1qIvbJTGZf9Azbtl+34DVgYF1XkEWpBsqPvRtxiecC0OeVRiWq5AJVCV5GAFNzaH9KOY122lhvfcLXw+t3bf1il2VPtP9UY83BZbmWhkr4cEMES0+uxbix+LGjeXJ5uEiMQmi5lNL/e9TMtD/YtrFZKheVFbW8mWnjN8ZOWwC2fWFtuYBSl6F+1dcXiisO135RJhuonGgoP3F9VWyvxWzor52ylgrbNrab01dUnD0u/aEhSZnhAoNOw7bDYWezAI4tCD0j/6ir1TDL9PfN96/0LY4S3kpbIP/XIdvqVStfn3Z6gAArU9VjBIYamBqaxFUaltxflaIt5ZdygWrg8b+dP6Slq8/keCtt5/gwYwURwvXzQnpI3dYWiWlUEatAz3iKQxVRY08T/IRcoEoidjS9GziKZU40srPdNF1VbhcctE3vLEgrMdT+QlrECmbDdLxvfLwOzIUslHoPY6My6m/t82eHpENLr+w8be+X24MEhkrN8sstTAXahTLYi3iDn8E09YWk+c/AZQ3zmhbclsWj06AyJOaZEeWxHoS2PfRZXuY0oSXsndAcooPgplXfq/5t5wkHCAKPzNbOYKCUqAk5UWOQoxrIK9+6Z2QCwP5LALTzSk/l73tXXIdAFTtWqa1MgYGdJ1gIhPyz1+SBhwf0DUzLqA96dywAfkwuKchFlqqIHfHTuBMNnCzaQVTPW32jbm5PZd8B0hHQzVfjfysw1GvUUGrg5wDBziY17+iRI+k/kQdUTjTcQ0VhNET3XGZc/OTXDlpZAd3dELFOsGEzvRGhhk9ZNHLngGuryGyqym8c+6g8nnv1zIQZX3qdrd7sRDMhkPG1/20bYWkw51x5AQzniW/59AP0RcLGo9QO43tOkocDWlRTYf6ZPWwaL+ImPuTe/vqA0rKs33fMbzZ4wbis+EjaC4WNA9QDRHWFwvcHeUPg3utjRtt30P+n6zx8/IT3U5aLjAAovzDb4ojd1VRyxMB8b/BZuT9xymaYsOd7SHxARfT8mThQ/dWtfvhx6pThqCWQ5b1caQZRPQuTCZO+TQfAW3MAdO2hA5weqm/d22tQJY2eMN2JXNu77BiVXo4bXvxzsQOPfqCGuhy9bf0jaQ4W+kNNIwC6Yn4l6jbfsqBfaM/lL0ssS9ca7Pl8+0mqg+gWQIf5/hSyQlAsaO9PoG9VixMMrmv/ciK8xTQo7Sr4ByRZ3xk/P6NrfTrN3am7EKij8wruuox3JHlDri2B952Z1VyllpZxYx3cPMn7tF0NkweR1/0V9+xYX4530KxiZzOoUsXd5AFV2FzHOCWPSDv3Sg/25yIPTZuX0fVRxV9bE0Vjyxpyic2pSYMAkqfEjg+VGF+q49BEES9Z52NtM7Mwfr4u4+YQ8mibdVvA+zdwTsxN1pCrgUj9xlb/2rA/Dh2QAm4DoXBDzE1WD1US05E+blftkH4TfzRz0UbgOwgQc5PVQ2UErIle06H0djQvuVRqNcBFmCPmJWdSaEuAmdkj6UbC/tjFak4kNlvMQc6QqwFl9fNleA09j3kX4a+JesgBqiKmIMWw9uqQ40DuV9N3+bscqIw5nsuVXCdb/pcSeTq5P/at0eIuMoDaG4kCHSr98UjnWw9GZVnPZo0k/6CLgS7DZJgLB8JmDylP3drFmxVwSjRnGdP2d8QrYGndGr/3ZN/Dy9Gt9YzPN3ffqRPddcmYto3/neQNmOrDB7NBdVodKZoHv/4httOX0UPeUwDwHMwBQoZae3nE/9/6R3enMKRvwTDQMNAw0MOvYaCHXcNAD7uGgR52/R+g8fXmzEjniwAAAABJRU5ErkJggg==",n="data:image/png;base64,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",e="data:image/png;base64,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",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABGCAAAAABp19w+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAPnSURBVFjD7ZZdTFtlGMd/UJhrGWAdlY91MO0mY4EOyFzAhIaBaYJbJMgFURc1DKfGiyGaxWYxdYshkixuQPwITozuioSQ7EInmhmihu7DlZZtpaFUmbU10kbo2jEYX1605RzkbAZkJkvOc3POeZ7/+Z2c//uc57xxC9yriL9nZBkto2W0jJbRMlpG/3/ohMUzdyAYDOVUrpgw6wwGgyHD9jujg/UAz6wcfdEEkLscvWhIXF0VkL/y99bUlgJ5ywtxwu5pthK6MlZhquM1NN3L06JldIFmNWSuwG6JtAg9CI+vhswAFN4dfQfFv8asRXqNBPScBQpWgx4BdZZEXuhr1xLFDZc7IV+nAJi+HC5JAbg6tE8ZLc9fd43l6FNjRpZyV7RYMfFFD0BWRzL0m4ADL8D3R/mpNVLv/8gD0FgDYIUiKbRgyICg6KnuUb/8SUeZ7zg4TaoTBXw2BefANgXwxyGTp9x82szJkaiRMavnwlLouf5Fq7tb0Z3an5d7EDt8zKniEAShErgFjDfZaDxakV1Rxi8RqzVRIwN1e3+VQI+AJhMASzuY04Br5OCyVW7yjsJGqKiCVJh/24exBgj7SAfsQldb/SgkvBYUnVCdAxNnOnkRK9X8AE8lAPvO7oiH805ogHnH+x79zqU9u/u5omwJ9KLCPgxXTZNeP6ojxdQY1XwFewASKQC6gPbbATeUmaJG6qOMB1+R6hBBcQ245UvONeaVJMK6dbg8qIoAnJTAvA1Uo0p1la5UGzNSejzE0ILCD8UnxJILUJ4I0KfeCRNAi16oDi4aeblr+mnxTI4XK4IuIAyblzz9EuwCCFirFBAGMkVVKxTi9cLFpk3Dx/wSaBsU8mlDCNIgLeZSAOA6bAU4QwWwEXgoWg/MRnp24a13mG+rOpSEQwJthfzb57YkwyMwHMn91VQ7DigjrD+/1G8DkjQQbd7e2g5+B3XmkK8Yu2f/kJ/tEmggvX/yScCg4scZgCv1tj2pgA7cMNVMIwB1cAlg+ngz5cTBNr7DwOY27bcUp4vQincjx6HfSPow8ch6SND24Uhx957ujH/9oAJI7WUwyfHBUFNkxOjsYz9vmDrf02rf1bIVVfeMV/25/qU4Vcb0ezMHdCJ07Afme9OH2hwZIpY2H6B+oiHqae/JSVC9YYzeMtn+NcBjz5cDWI5NssOcAfSZ+UYpgWbGdTM3JbZ8o2MbslMF0ZR3QvnoeuF63BPWZsXaNuRe0CsADl/Ye7hF/NUsrFXcNBgGxgxOIbF2uycFPNxszJXskP8YD9TzbPhVKa/XIMZvaEUzdU3R/4j7cxMso2W0jJbRMvr+QP8NsluKv9sZ0eAAAAAASUVORK5CYII=",p="data:image/png;base64,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",t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAARbSURBVGje7ZhtTFtVGMd/UJjQCayOyngZ6OqGEOgYmQRMIAxMIzBBxIQ4lpkguvkJxgwbMabZTIjEJdsg0YXNF+YnEoLug8uYzky3gEBg5WWAlCoE6bJBhI7aAePFD325rWuFy4hL9J5PPec5//vrff7POefe67XM42nej4krgSWwBJbAElgCS2AJLIH/y2Afxy/DpMk0E5Up+goLgyaTaSbt+bWCTcUAr4kHt1cCRIsFO1LtVZgFxInPmbIgBYgRK/MS3iQWMqFhi3gy/e+ibBQrciouPSjXwqUXkkSLnMA98MJauNyEhEcBr0kPLLSupTYE8GIrxK8FPAyKMNEqYR3rXfT39AafOJUMYK7TnBwI0Dew198WXhrV341SB4HVohTxf1cAO+un65sAwuoCoKUSeOsA/HCcG2es8ZZPxgDK8gG6YJd4sJDqm4K+Ka9J8fbZulTjSRislJ+K57NZuAq6WYDbpZVj6dqvtJwetllkt3jRLB682OKwuPEMqvP7Y6LfoRs+5XziDJggE7gPTJXrKDueEZmRyq9Wi5U2iyYLc34TDR4GZSgArbWgDQZuEYVelxk+PgKbISMLgmDpmBFNPmA2EgJ0C6u4awKZR9LUHfdgQf855EXBdP1HvEkXefwE2T7AXmK94edBKIGlvkMG9U7XVZi07+NI99SFvvp9F9wXl0PfPQR9lZbxCeTvJ5KvUfAt7AHwJR5oAGrnJw2QWmmzSG27xqaDHu72w+8fGrKDBf0t4L4xIFoTk+wLGzagH0O+C2CQZFjSgXzEX5GlSomwW7TiRhtetOOLEfdgQT8Biaecp7RBui/ANcVOmAaq1UK0x2FRZ8NcrodTtRi+9lBcPZCESQ+YYavLlA7YDTDZlSUDMxDqFO2CBMbHob08fOjExEr3/hBYBwmcK5mBYAi2538SYBSeA7hIBrAZeMoWn1ywrsLl9z5gqSardCP9osFdEDd/9ZkAeBaGrGN/lBdMAf5W0p0L6u3ARiXYFmtzQR2/gyJ0wJhI99j+gQlW/xzidDqFtFheAtLkXH8A0Fus2xMEqMAAs1WUAVAIHQBzJ6tIxwu28x1pbK2JuEJiyKrB9uJKvEHjl/JcwO+olmOvz/3Sr5OX5XoD+depPjB/0VCuAuCVH3vP+mwbHeiY2l0aSajc0v5Nkzqe4OC5y2T/E8r1q6n90cd4xIhCa92sW2uMgOLFEpuXzactID+ssUkstZcAdhSlA7SesBCr3QJc03LZH7jS7EI4Yt1PS3U5Fe7APND/GR1oL6qRu09GBgmTZsen/bf5Cf2pMXNEmD1XM4ZltQygoi2nonrTQQydLuCXA23g7KPuUo1vrDAoU6lctH6uXRQKp06AbcO0tKGZuFQHfxOvXFyP2GTwdJUm2vMEV4/XD/xEMW+YD616utc6fqGfuhfh4VTsvW0+Z1EWBYYKfq4n2HMr1ckBLK8e/pfBbtr/7/1YAktgCSyBJbAElsCO9hdp+FP075MrqAAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABGCAAAAABkyax5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAATISURBVFjD7ZhtbFNVGMd/2xw0l21uSkM2HQPGJkzGYDpgBC8SlaBimjE3A3zgRTQKhGD8oCIYlQ8wjS8ENLwaEUTIBAkD4wJmEEeWDAbSjjoHS7c1bs7hLmDXrbDt+qFr77nt7VIaSDTp8+mc5/zPr895znPuubcxKvfOYu8hOwqPwqPwKDwK19l9kUza4oLY4mzAcTA+nv7hq+4evF/prYHeD4DuNiukPxFKqUZi/fNkWe5QVVVVK+SzIWWR5dzhLobjALSbZ4aURQavl16VKPcAXJgRWhYZ/EK+qRT3GaDHPvUuwwdqH2M+lAN2JofWBVdL168X7DeZ9GTBCJ27pXVmnK/d7M7FPKeq0Z6DNc3s83pqstOGhv/xeS1kP9RYVcVGWfDbVqfN8MNt0jgoruKHHOoK/BJPGVvH62m62rn1rSxbjiuq2lMpy/I+beDPeXKj1ntvnaqq6jJZvtYtV2nuWtnyV+hS7Fixg7n7nk8G09ztsKvWN9C73v1GlpDyqQAl8ONvTNKmFyxR3uoOtaEdq5qxvJPo7UxcDF8MDK7u48ZZFk3ncOcCzJE4fC59pABYktv0aQh499pO5qz1OyzQfNbbvHiKpTGa0Mp4AFMRyncFIixuGaeuGMN3tyFpbEYBV73Nw0zJEuacL/Ru7QtAnm4D88fwtSHcdgRWJwtDZmgBoK2alwS/q3qQmDqLgCqPWUR1gwHcUwbS06KyD1oBqEDSzrh9/2ucKPcOLCD9AX3tzYbTBvCTTigZLuj6FZAA+o4yRVvgll1OnNuuDGZB1rMx5VCj9fyHqAbQBe4AxgG0uMXF7xCzsJdAy7M3d/lX4wvJUw0po0WZDRgD0Ag5hGuPgjUoLfWA/sF8HsgYhI8NGz7WVwViWqzABFHVVg1kAbRDgt990hCZUOhrJcKNIHgPkCLqy4HlSQAuJG0/XZeN4E/5W5IRfARwvyBXjoBUDMB1hOovKho6LfFwPQieAdwWRMeApd5suISs+Oz3b278PWyvET1FUfztWAF+TQj8IGRafL/fH4TwDNjaUkMHHwB/eLDUvXZ7g5uUMpO38yBdQYDJm9IDHiv+sEgKgse/DlW+0D2bbEgf+e6vFJRgRpeTXCN2r3f79HBKJsCGWwB0rPmZzD3ZvpFk/W54zQqPGMFdGERO3Doz9uW/KP/YPyttoPRL7a5NxiAvF3k83giuiCdOu6Az9n91yLkegIUvivfLRGgYFQipIx/qfmp9eZre3yCuSLj9TSuLrjpakjJGZyXq9HlweXYA+5qTvIHtFdMbtgfA6wefdoFwSE01el9Nzmy6FOirh/Gf1O97n1tBK5puCs75EFZIw80A1yUyN7dsG5nAIr2/vRPhCIfzfj5/PycW6l3naGrfk8hmz3C9/xhp07VeOJGnLuBQn86jODG7Fx5QCWC7j1ISe2dwFqGcCUz5gc3SjqOBwkq39Ax3CDe/wlZd1q1MG1Yo46DybdHdsZMPE+8UzuJnlTLxn7Y68sGFmYpswdu30b1S95IUHjzmzfzq77Wuq4lcmETcadtzgmq3bW6pfl6Yn1g311j6/B2HXHxbVTtXyHKlIOmU3+3RT4qJ6H/FplEJAK3JSUPKIoOHaf/fb/8oPAqPwv/L8H8BwYY2Ks9nd80AAAAASUVORK5CYII=",r="data:image/png;base64,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",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAASkSURBVGje7Zh/TJR1HMdfJ8jgSPEERBDBRCAcnErGkA2G4G6iBiNdbMVsM8iaaxCWSeZuukbS3FRoSWSU1dpsjOVaJjSbqYOEgOOHgByXMOJa3OVx8kNAPPrjfjxHnLaHaG71fP763vez9/N6ns/78/1+n+dk0zyaWPCIuBJYAktgCSyBJbAElsAS+L8MdneMdEazeTg0VfQVprrMZvNw0hNzBZv3ADwjHlxfCBApFuwotSwrDYgWXzP/nZuAKLEymfAlMZUK55aLJ9PxCv6VYkVOzaUF/7lwaYM40SIncCs8NRcuzbD+n4DnpAem6ubSGwL4fh3EzAXcA4og0SphHWtn6O9ode7RYW4AE40j8YsB2jt3eNnSlj7tYKjSB6wWbRJ/uwLYWT90tgogqHwR1BYCL+6GH45w7ZQ1X/tBP0B+JkATbBAPFkrdLOirMqoUuWXlifrj0FUoPxHDx+NwCTTjAL/lFfYnqz9Xc7LHZpHd4vsj4sH3ax0WV54i7Ex2VORLtMBpzsQOgxlSgbuAqUBD/pGUkJREfrFa7G+zyJi1/ZZocA/4BwJQVwpqP+AGoWg1qSsGesEXUtLABywH9agygRE9AUCLsIqbDLg9gDOuvTXu2mNBXwEZoTB0voIXaCKDK7DNHdjx3doF8FMX5ICl41i/ct3MVRj33IYQl9i7FV8BqtxlLsAOfUs3tBeODRiQH4olU6XgW9gMsJAY4BxQOmnUQWKhzSKl7RpL9rp+XMvbHW+FtL9f01y+dBZY0N8A7uoXRaqi4heChwfafuQbALqIB4sG5L1eirSwTcF2i/5uo73y88sqWVTAYcPpQ7PAgt4AsSecZdcheSHAZcU6GAKKlUK21WFR47mJdNenajNlEU+SGKSv2e/51+ZqhTjMWmAEVs6QNcBGAGNTmhuMAIFO2SZYz8AA1Bes6D5qcAn2gmGQrYLbs7paA+v5KGcY/MDPXn8jQB+sAThPCuAL2J0yTllX4fTrh7GUpOV50+ESvOvZ3ARADz6zwE0QPXlp1SJ4HLqtc7cLdpqs97sU+P0zZTjg7Q+2xVq9s5xfQRHYqY+lpT+704Dr9xC/fdke8EcvMd6zwEBA7dgWIEnO1XsAbXs0m32AMNDBeBH5AGRBA8DE8SKSkUE435PEypLgGmIDHtJin4BT19ubK/YalZ/K0wHPN9Uc3DVxs0Mjz09fAGRepXj35HldQRgAT//YVua+uq+zwbQxL4RA+Vj911XKGPz8Ji6y7SHcjm94w+n0s7/66PfrUaitm3VdiR5QJOTYvKw+OQby11Q2yVjpBYCI55MB6o6OsVa9HLis5qIXUFM9A7jfup8ac0yHVMwGc087GrnY3lS9g4+FCH3A+MCQ12pP4bepfyQ4yF6rYd200g3gwPXtB4qX7EXXOAO8dTHA6Ku6dxNmzE/PV4wmJTUPJnW5Tk7mb22ZnjbtMzhm3JmvcINlRapIlznLe12la+Bmm1BG2fz9UX62gohjvi5TH365JRzLvdrRL/4NMKY7wa5PxQvFtkHiO465+Ss1KBQPSDTbB2HC3Hw+saj4/30fS2AJLIElsASWwBLYEX8COk7eiUf+0c0AAAAASUVORK5CYII=",A="data:image/png;base64,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",i="data:image/png;base64,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",h="/zh-cn/assets/003b1add7c7cb3a3e1dc779588014fab-6e38a540.png",j="/zh-cn/assets/bfdd9f38cc1b1220f25734c917e16153-633580be.png",g="/zh-cn/assets/e05d5510aaeaf46a9e2cdf6ae3b818a2-b38efa29.png",d="/zh-cn/assets/7e948d626ced5b735cff1801c43863a5-6ab26544.png",u="/zh-cn/assets/dd296480837e3618f70d3410d656da79-b4b17dcf.jpeg",m=[s,a,n,e,l,p,t,c,r,o,A,i,h,j,g,d,u],y={label:"Xline 持久化存储设计与实现",description:"在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-05-25",title:"Xline Persistent Storage Design and Implementation"},k=[{label:"引言",level:2},{label:"B+ Tree 读写放大分析",level:3},{label:"LSM Tree 读写放大分析",level:3},{label:"总结",level:3},{label:"持久化存储层设计与实现",level:2},{label:"整体架构与写入流程",level:3},{label:"接口设计",level:3},{label:"实现相关",level:3},{label:"性能评估",level:2}],f=`

    引言

    +const s="data:image/png;base64,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",a="data:image/png;base64,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",n="data:image/png;base64,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",e="data:image/png;base64,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",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABGCAAAAABp19w+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAPnSURBVFjD7ZZdTFtlGMd/UJhrGWAdlY91MO0mY4EOyFzAhIaBaYJbJMgFURc1DKfGiyGaxWYxdYshkixuQPwITozuioSQ7EInmhmihu7DlZZtpaFUmbU10kbo2jEYX1605RzkbAZkJkvOc3POeZ7/+Z2c//uc57xxC9yriL9nZBkto2W0jJbRMlpG/3/ohMUzdyAYDOVUrpgw6wwGgyHD9jujg/UAz6wcfdEEkLscvWhIXF0VkL/y99bUlgJ5ywtxwu5pthK6MlZhquM1NN3L06JldIFmNWSuwG6JtAg9CI+vhswAFN4dfQfFv8asRXqNBPScBQpWgx4BdZZEXuhr1xLFDZc7IV+nAJi+HC5JAbg6tE8ZLc9fd43l6FNjRpZyV7RYMfFFD0BWRzL0m4ADL8D3R/mpNVLv/8gD0FgDYIUiKbRgyICg6KnuUb/8SUeZ7zg4TaoTBXw2BefANgXwxyGTp9x82szJkaiRMavnwlLouf5Fq7tb0Z3an5d7EDt8zKniEAShErgFjDfZaDxakV1Rxi8RqzVRIwN1e3+VQI+AJhMASzuY04Br5OCyVW7yjsJGqKiCVJh/24exBgj7SAfsQldb/SgkvBYUnVCdAxNnOnkRK9X8AE8lAPvO7oiH805ogHnH+x79zqU9u/u5omwJ9KLCPgxXTZNeP6ojxdQY1XwFewASKQC6gPbbATeUmaJG6qOMB1+R6hBBcQ245UvONeaVJMK6dbg8qIoAnJTAvA1Uo0p1la5UGzNSejzE0ILCD8UnxJILUJ4I0KfeCRNAi16oDi4aeblr+mnxTI4XK4IuIAyblzz9EuwCCFirFBAGMkVVKxTi9cLFpk3Dx/wSaBsU8mlDCNIgLeZSAOA6bAU4QwWwEXgoWg/MRnp24a13mG+rOpSEQwJthfzb57YkwyMwHMn91VQ7DigjrD+/1G8DkjQQbd7e2g5+B3XmkK8Yu2f/kJ/tEmggvX/yScCg4scZgCv1tj2pgA7cMNVMIwB1cAlg+ngz5cTBNr7DwOY27bcUp4vQincjx6HfSPow8ch6SND24Uhx957ujH/9oAJI7WUwyfHBUFNkxOjsYz9vmDrf02rf1bIVVfeMV/25/qU4Vcb0ezMHdCJ07Afme9OH2hwZIpY2H6B+oiHqae/JSVC9YYzeMtn+NcBjz5cDWI5NssOcAfSZ+UYpgWbGdTM3JbZ8o2MbslMF0ZR3QvnoeuF63BPWZsXaNuRe0CsADl/Ye7hF/NUsrFXcNBgGxgxOIbF2uycFPNxszJXskP8YD9TzbPhVKa/XIMZvaEUzdU3R/4j7cxMso2W0jJbRMvr+QP8NsluKv9sZ0eAAAAAASUVORK5CYII=",p="data:image/png;base64,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",t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAARbSURBVGje7ZhtTFtVGMd/UJjQCayOyngZ6OqGEOgYmQRMIAxMIzBBxIQ4lpkguvkJxgwbMabZTIjEJdsg0YXNF+YnEoLug8uYzky3gEBg5WWAlCoE6bJBhI7aAePFD325rWuFy4hL9J5PPec5//vrff7POefe67XM42nej4krgSWwBJbAElgCS2AJLIH/y2Afxy/DpMk0E5Up+goLgyaTaSbt+bWCTcUAr4kHt1cCRIsFO1LtVZgFxInPmbIgBYgRK/MS3iQWMqFhi3gy/e+ibBQrciouPSjXwqUXkkSLnMA98MJauNyEhEcBr0kPLLSupTYE8GIrxK8FPAyKMNEqYR3rXfT39AafOJUMYK7TnBwI0Dew198WXhrV341SB4HVohTxf1cAO+un65sAwuoCoKUSeOsA/HCcG2es8ZZPxgDK8gG6YJd4sJDqm4K+Ka9J8fbZulTjSRislJ+K57NZuAq6WYDbpZVj6dqvtJwetllkt3jRLB682OKwuPEMqvP7Y6LfoRs+5XziDJggE7gPTJXrKDueEZmRyq9Wi5U2iyYLc34TDR4GZSgArbWgDQZuEYVelxk+PgKbISMLgmDpmBFNPmA2EgJ0C6u4awKZR9LUHfdgQf855EXBdP1HvEkXefwE2T7AXmK94edBKIGlvkMG9U7XVZi07+NI99SFvvp9F9wXl0PfPQR9lZbxCeTvJ5KvUfAt7AHwJR5oAGrnJw2QWmmzSG27xqaDHu72w+8fGrKDBf0t4L4xIFoTk+wLGzagH0O+C2CQZFjSgXzEX5GlSomwW7TiRhtetOOLEfdgQT8Biaecp7RBui/ANcVOmAaq1UK0x2FRZ8NcrodTtRi+9lBcPZCESQ+YYavLlA7YDTDZlSUDMxDqFO2CBMbHob08fOjExEr3/hBYBwmcK5mBYAi2538SYBSeA7hIBrAZeMoWn1ywrsLl9z5gqSardCP9osFdEDd/9ZkAeBaGrGN/lBdMAf5W0p0L6u3ARiXYFmtzQR2/gyJ0wJhI99j+gQlW/xzidDqFtFheAtLkXH8A0Fus2xMEqMAAs1WUAVAIHQBzJ6tIxwu28x1pbK2JuEJiyKrB9uJKvEHjl/JcwO+olmOvz/3Sr5OX5XoD+depPjB/0VCuAuCVH3vP+mwbHeiY2l0aSajc0v5Nkzqe4OC5y2T/E8r1q6n90cd4xIhCa92sW2uMgOLFEpuXzactID+ssUkstZcAdhSlA7SesBCr3QJc03LZH7jS7EI4Yt1PS3U5Fe7APND/GR1oL6qRu09GBgmTZsen/bf5Cf2pMXNEmD1XM4ZltQygoi2nonrTQQydLuCXA23g7KPuUo1vrDAoU6lctH6uXRQKp06AbcO0tKGZuFQHfxOvXFyP2GTwdJUm2vMEV4/XD/xEMW+YD616utc6fqGfuhfh4VTsvW0+Z1EWBYYKfq4n2HMr1ckBLK8e/pfBbtr/7/1YAktgCSyBJbAElsCO9hdp+FP075MrqAAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABGCAAAAABkyax5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAATISURBVFjD7ZhtbFNVGMd/2xw0l21uSkM2HQPGJkzGYDpgBC8SlaBimjE3A3zgRTQKhGD8oCIYlQ8wjS8ENLwaEUTIBAkD4wJmEEeWDAbSjjoHS7c1bs7hLmDXrbDt+qFr77nt7VIaSDTp8+mc5/zPr895znPuubcxKvfOYu8hOwqPwqPwKDwK19l9kUza4oLY4mzAcTA+nv7hq+4evF/prYHeD4DuNiukPxFKqUZi/fNkWe5QVVVVK+SzIWWR5dzhLobjALSbZ4aURQavl16VKPcAXJgRWhYZ/EK+qRT3GaDHPvUuwwdqH2M+lAN2JofWBVdL168X7DeZ9GTBCJ27pXVmnK/d7M7FPKeq0Z6DNc3s83pqstOGhv/xeS1kP9RYVcVGWfDbVqfN8MNt0jgoruKHHOoK/BJPGVvH62m62rn1rSxbjiuq2lMpy/I+beDPeXKj1ntvnaqq6jJZvtYtV2nuWtnyV+hS7Fixg7n7nk8G09ztsKvWN9C73v1GlpDyqQAl8ONvTNKmFyxR3uoOtaEdq5qxvJPo7UxcDF8MDK7u48ZZFk3ncOcCzJE4fC59pABYktv0aQh499pO5qz1OyzQfNbbvHiKpTGa0Mp4AFMRyncFIixuGaeuGMN3tyFpbEYBV73Nw0zJEuacL/Ru7QtAnm4D88fwtSHcdgRWJwtDZmgBoK2alwS/q3qQmDqLgCqPWUR1gwHcUwbS06KyD1oBqEDSzrh9/2ucKPcOLCD9AX3tzYbTBvCTTigZLuj6FZAA+o4yRVvgll1OnNuuDGZB1rMx5VCj9fyHqAbQBe4AxgG0uMXF7xCzsJdAy7M3d/lX4wvJUw0po0WZDRgD0Ag5hGuPgjUoLfWA/sF8HsgYhI8NGz7WVwViWqzABFHVVg1kAbRDgt990hCZUOhrJcKNIHgPkCLqy4HlSQAuJG0/XZeN4E/5W5IRfARwvyBXjoBUDMB1hOovKho6LfFwPQieAdwWRMeApd5suISs+Oz3b278PWyvET1FUfztWAF+TQj8IGRafL/fH4TwDNjaUkMHHwB/eLDUvXZ7g5uUMpO38yBdQYDJm9IDHiv+sEgKgse/DlW+0D2bbEgf+e6vFJRgRpeTXCN2r3f79HBKJsCGWwB0rPmZzD3ZvpFk/W54zQqPGMFdGERO3Doz9uW/KP/YPyttoPRL7a5NxiAvF3k83giuiCdOu6Az9n91yLkegIUvivfLRGgYFQipIx/qfmp9eZre3yCuSLj9TSuLrjpakjJGZyXq9HlweXYA+5qTvIHtFdMbtgfA6wefdoFwSE01el9Nzmy6FOirh/Gf1O97n1tBK5puCs75EFZIw80A1yUyN7dsG5nAIr2/vRPhCIfzfj5/PycW6l3naGrfk8hmz3C9/xhp07VeOJGnLuBQn86jODG7Fx5QCWC7j1ISe2dwFqGcCUz5gc3SjqOBwkq39Ax3CDe/wlZd1q1MG1Yo46DybdHdsZMPE+8UzuJnlTLxn7Y68sGFmYpswdu30b1S95IUHjzmzfzq77Wuq4lcmETcadtzgmq3bW6pfl6Yn1g311j6/B2HXHxbVTtXyHKlIOmU3+3RT4qJ6H/FplEJAK3JSUPKIoOHaf/fb/8oPAqPwv/L8H8BwYY2Ks9nd80AAAAASUVORK5CYII=",r="data:image/png;base64,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",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAASkSURBVGje7Zh/TJR1HMdfJ8jgSPEERBDBRCAcnErGkA2G4G6iBiNdbMVsM8iaaxCWSeZuukbS3FRoSWSU1dpsjOVaJjSbqYOEgOOHgByXMOJa3OVx8kNAPPrjfjxHnLaHaG71fP763vez9/N6ns/78/1+n+dk0zyaWPCIuBJYAktgCSyBJbAElsAS+L8MdneMdEazeTg0VfQVprrMZvNw0hNzBZv3ADwjHlxfCBApFuwotSwrDYgWXzP/nZuAKLEymfAlMZUK55aLJ9PxCv6VYkVOzaUF/7lwaYM40SIncCs8NRcuzbD+n4DnpAem6ubSGwL4fh3EzAXcA4og0SphHWtn6O9ode7RYW4AE40j8YsB2jt3eNnSlj7tYKjSB6wWbRJ/uwLYWT90tgogqHwR1BYCL+6GH45w7ZQ1X/tBP0B+JkATbBAPFkrdLOirMqoUuWXlifrj0FUoPxHDx+NwCTTjAL/lFfYnqz9Xc7LHZpHd4vsj4sH3ax0WV54i7Ex2VORLtMBpzsQOgxlSgbuAqUBD/pGUkJREfrFa7G+zyJi1/ZZocA/4BwJQVwpqP+AGoWg1qSsGesEXUtLABywH9agygRE9AUCLsIqbDLg9gDOuvTXu2mNBXwEZoTB0voIXaCKDK7DNHdjx3doF8FMX5ICl41i/ct3MVRj33IYQl9i7FV8BqtxlLsAOfUs3tBeODRiQH4olU6XgW9gMsJAY4BxQOmnUQWKhzSKl7RpL9rp+XMvbHW+FtL9f01y+dBZY0N8A7uoXRaqi4heChwfafuQbALqIB4sG5L1eirSwTcF2i/5uo73y88sqWVTAYcPpQ7PAgt4AsSecZdcheSHAZcU6GAKKlUK21WFR47mJdNenajNlEU+SGKSv2e/51+ZqhTjMWmAEVs6QNcBGAGNTmhuMAIFO2SZYz8AA1Bes6D5qcAn2gmGQrYLbs7paA+v5KGcY/MDPXn8jQB+sAThPCuAL2J0yTllX4fTrh7GUpOV50+ESvOvZ3ARADz6zwE0QPXlp1SJ4HLqtc7cLdpqs97sU+P0zZTjg7Q+2xVq9s5xfQRHYqY+lpT+704Dr9xC/fdke8EcvMd6zwEBA7dgWIEnO1XsAbXs0m32AMNDBeBH5AGRBA8DE8SKSkUE435PEypLgGmIDHtJin4BT19ubK/YalZ/K0wHPN9Uc3DVxs0Mjz09fAGRepXj35HldQRgAT//YVua+uq+zwbQxL4RA+Vj911XKGPz8Ji6y7SHcjm94w+n0s7/66PfrUaitm3VdiR5QJOTYvKw+OQby11Q2yVjpBYCI55MB6o6OsVa9HLis5qIXUFM9A7jfup8ac0yHVMwGc087GrnY3lS9g4+FCH3A+MCQ12pP4bepfyQ4yF6rYd200g3gwPXtB4qX7EXXOAO8dTHA6Ku6dxNmzE/PV4wmJTUPJnW5Tk7mb22ZnjbtMzhm3JmvcINlRapIlznLe12la+Bmm1BG2fz9UX62gohjvi5TH365JRzLvdrRL/4NMKY7wa5PxQvFtkHiO465+Ss1KBQPSDTbB2HC3Hw+saj4/30fS2AJLIElsASWwBLYEX8COk7eiUf+0c0AAAAASUVORK5CYII=",A="data:image/png;base64,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",i="data:image/png;base64,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",h="/zh-cn/assets/003b1add7c7cb3a3e1dc779588014fab-6e38a540.png",j="/zh-cn/assets/bfdd9f38cc1b1220f25734c917e16153-633580be.png",g="/zh-cn/assets/e05d5510aaeaf46a9e2cdf6ae3b818a2-b38efa29.png",d="/zh-cn/assets/7e948d626ced5b735cff1801c43863a5-6ab26544.png",u="/zh-cn/assets/dd296480837e3618f70d3410d656da79-b4b17dcf.jpeg",m=[s,a,n,e,l,p,t,c,r,o,A,i,h,j,g,d,u],y={label:"Xline 持久化存储设计与实现",description:"在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-05-25",title:"Xline Persistent Storage Design and Implementation"},f=[{label:"引言",level:2},{label:"B+ Tree 读写放大分析",level:3},{label:"LSM Tree 读写放大分析",level:3},{label:"总结",level:3},{label:"持久化存储层设计与实现",level:2},{label:"整体架构与写入流程",level:3},{label:"接口设计",level:3},{label:"实现相关",level:3},{label:"性能评估",level:2}],k=`

    引言

    在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。

    基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。

    ## 存储引擎选型

    @@ -476,4 +476,4 @@ StorageEngine Trait 定义(engine/src/engine_api.rs):

    性能评估

    在 v0.3.0 的新版本中,我们除了引入了 Persistent Storage Layer 以外,还对 CURP 的部分内容做了一些大型的重构。在重构完毕,添加新功能后,前不久通过了 validation test 和 Integration test。性能部分的测试信息,已经在 Xlinev0.4.0  中释放出来。

    性能报告请参考链接:

    -

    https://github.com/datenlord/Xline/blob/master/img/xline-key-perf.png

    `;export{m as assetURLs,f as default,y as metadata,k as toc}; +

    https://github.com/datenlord/Xline/blob/master/img/xline-key-perf.png

    `;export{m as assetURLs,k as default,y as metadata,f as toc}; diff --git a/zh-cn/assets/index-af83501f.js b/zh-cn/assets/index-9a9f68d0.js similarity index 98% rename from zh-cn/assets/index-af83501f.js rename to zh-cn/assets/index-9a9f68d0.js index e10ccf2..7540ddb 100644 --- a/zh-cn/assets/index-af83501f.js +++ b/zh-cn/assets/index-9a9f68d0.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",o="/zh-cn/assets/image5-184dc93a.png",r="/zh-cn/assets/image6-18c75b26.jpg",n="/zh-cn/assets/image7-6a4a9bfe.png",t="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,o,r,n,t,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},h=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],c=`

    2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

    +const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",o="/zh-cn/assets/image5-184dc93a.png",r="/zh-cn/assets/image6-18c75b26.jpg",t="/zh-cn/assets/image7-6a4a9bfe.png",n="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,o,r,t,n,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},h=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],C=`

    2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

    数据通路加速

    图片

    分享人:Tianrui Li

    @@ -32,12 +32,12 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg

    演讲摘要: This presentation / live demo shows how the NaxRiscv project (Out-of-order / superscalar RISC-V CPU) mix Scala and the SpinalHDL API to describe its hardware. By many aspect, it goes beyond the VexRiscv project, and should provide some usefull / interresting design patterns for the public.


    硬件设计流程

    -

    图片

    +

    图片

    分享人:Readon

    演讲主题: Recent progress on formal verification support on SpinalHDL

    演讲摘要: The formal verification is a technology to verify design, which helps to find the corner cases. SpinalHDL have provided an integration of this tech with SymbiYosys easily. The brief introduction on how to verify a design would be presented by example. Some new build blocks helping to simplify the verification process would be introduced. At last, a short overview of the verification of some facilities in SpinalHDL's lib would also be summarized.


    -

    图片

    +

    图片

    分享人:Sebastien-riou

    演讲主题: SpinalHDL for ASIC

    演讲摘要: The presentation is a highlights of a ASIC done entirely in SpinalHDL, fabricated in GF22FDX. Focus on pads, RAMs and FPGA for ASIC verification.

    @@ -53,4 +53,4 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg https://github.com/datenlord/TRIDENT

    推荐阅读

    万字长文,详述 TRIDENT: Poseidon 哈希算法的硬件加速与实现!

    -

    精彩回顾|硬件敏捷开发与验证方法学研讨

    `;export{p as assetURLs,c as default,l as metadata,h as toc}; +

    精彩回顾|硬件敏捷开发与验证方法学研讨

    `;export{p as assetURLs,C as default,l as metadata,h as toc}; diff --git a/zh-cn/assets/index-ffd93bc8.js b/zh-cn/assets/index-a1a1a279.js similarity index 95% rename from zh-cn/assets/index-ffd93bc8.js rename to zh-cn/assets/index-a1a1a279.js index 0305554..6149306 100644 --- a/zh-cn/assets/index-ffd93bc8.js +++ b/zh-cn/assets/index-a1a1a279.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-c938ebe8.png",t="/zh-cn/assets/image1-a88ec652.jpg",s="/zh-cn/assets/image2-0d688c12.png",n=[e,t,s],r={label:"4.8 Beijing Rust Meetup | Call For Presenters",description:"如果你有兴趣参与探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于Rust编程语言相关应用的线下Meetup。我们的主题是Rust💡X,意在探讨用Rust编程语言“点亮”的任何应用、实践和探索。",cover:"./cover.png",location:"中国香港",date:"2023-03-31",title:"4.8 Beijing Rust Meetup | Call For Presenters"},i=[{label:"嘉宾演讲 (Presenter & Topic)",level:2},{label:"提交议题 (Call for Presenters)",level:2},{label:"Meetup 报名方式 (Registration)",level:2}],o=`

    如果你有兴趣参与探讨 Rust 作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于 Rust 编程语言相关应用的线下 Meetup。我们的主题是 Rust💡X,意在探讨用 Rust 编程语言“点亮”的任何应用、实践和探索

    +const e="/zh-cn/assets/cover-c938ebe8.png",t="/zh-cn/assets/image1-a88ec652.jpg",s="/zh-cn/assets/image2-0d688c12.png",r=[e,t,s],n={label:"4.8 Beijing Rust Meetup | Call For Presenters",description:"如果你有兴趣参与探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于Rust编程语言相关应用的线下Meetup。我们的主题是Rust💡X,意在探讨用Rust编程语言“点亮”的任何应用、实践和探索。",cover:"./cover.png",location:"中国香港",date:"2023-03-31",title:"4.8 Beijing Rust Meetup | Call For Presenters"},i=[{label:"嘉宾演讲 (Presenter & Topic)",level:2},{label:"提交议题 (Call for Presenters)",level:2},{label:"Meetup 报名方式 (Registration)",level:2}],o=`

    如果你有兴趣参与探讨 Rust 作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于 Rust 编程语言相关应用的线下 Meetup。我们的主题是 Rust💡X,意在探讨用 Rust 编程语言“点亮”的任何应用、实践和探索

    时间: 2023 年 4 月 8 日 14:00 地点: 环球财讯中心 M 层 北京市西城区宣武门外大街甲 1 号

    嘉宾演讲 (Presenter & Topic)

    @@ -31,4 +31,4 @@ const e="/zh-cn/assets/cover-c938ebe8.png",t="/zh-cn/assets/image1-a88ec652.jpg"

    Meetup 报名方式 (Registration)

    欢迎扫描下方二维码或点击阅读原文,即可报名。

    阅读原文

    -

    图片

    `;export{n as assetURLs,o as default,r as metadata,i as toc}; +

    图片

    `;export{r as assetURLs,o as default,n as metadata,i as toc}; diff --git a/zh-cn/assets/index-1dde53bb.js b/zh-cn/assets/index-b503fc36.js similarity index 96% rename from zh-cn/assets/index-1dde53bb.js rename to zh-cn/assets/index-b503fc36.js index 23a48ca..f49e372 100644 --- a/zh-cn/assets/index-1dde53bb.js +++ b/zh-cn/assets/index-b503fc36.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",l="/zh-cn/assets/image3-204919ac.png",p="/zh-cn/assets/image4-e50f112d.png",t="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,l,p,t],n={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},o=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

    数据库隔离级别介绍

    +const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",t="/zh-cn/assets/image3-204919ac.png",l="/zh-cn/assets/image4-e50f112d.png",p="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,t,l,p],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

    数据库隔离级别介绍

    数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:

    Table 1:

    图片

    @@ -8,19 +8,19 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

    图片

    在 Read uncommitted 的隔离级别中,多个同时执行的事务是能够互相看到互相没有 commit 的写操作,因此可以认为这种隔离级别几乎没有作用。在上述例子中,Operation 2 读到的内容是 “AA”,Operation 4 读到的内容则是“DD”,即使第二个事务最终 Rollback 了。Read committed 有两个事务同时被执行,自上而下是执行顺序。

    Table 3:

    -

    图片

    +

    图片

    在 Read committed 的隔离级别中,只有被 Commit 后的结果可以被看到,因此在 Table 2 的执行顺序中,Operation 2 和 4 都能够读取到 “AA” 的值,即 Key 1 的值没有改变。如果按照 Table 3 中的情况执行两个事务,Operation 2 读到的值为 “AA”,Operation 5 读到的值为 “DD”,因为此时事务 2 已经执行成功。

    Repeatable read

    如果在 Table 3 中的事务 1 两次连续读操作,用户想要保证读到相同的值,那就需要使用 repeatable read 隔离级别。在这个隔离级别中,在同一个事务中对同一条数据的多次读取保证会得到相同的值,即使这个过程中该数据被其他已经提交的事务修改掉。当然该隔离级别也有一些情况无法保证隔离性,比如下列情况:

    Table 4:

    -

    图片

    +

    图片

    在 repeatable read 的隔离级别下,Operation 2 的返回结果是 ["CC"] —— 只有 Key 3 的值被返回了,但是 Operation 5 的返回值是 ["CC", "DD"]。总结一下,repeatable read 的隔离级别仍然无法很好处理涉及多条数据的情况,特别是当有新的数据插入或者删除的情况。

    Serializable

    最严格的隔离级别叫做 Serializable,这个级别的定义也是最清晰明了的,在这种隔离级别下的执行结果,就“仿佛”是将所有事务串行起来一条一条执行的结果。上面这句话中值得强调的是 “仿佛” 二字,为了提高性能,几乎没有数据库是采用真正物理意义上的串行执行来保证 Serializable 的,仅仅达到类似效果即可,实现的方法是可以多种多样的。在 Serializable 级别下还有一个细致的分类,叫做 Snapshot,该分类与 Serializable 类似但约束能力上稍弱。正是因为 Snapshot 在约束上的放松,使得其实现起来具有更好的性能,也是绝大多数数据库默认支持的隔离级别。下面我们就来说说 Snapshot,以及引申出来的 MVCC 实现方法。

    Snapshot 隔离级别及 MVCC

    想要区分最严格的 Serializable 和 Snapshot,我们还是从例子来看,看下列两个事务的操作:

    Table 5:

    -

    图片

    +

    图片

    如果按照严格的 Serializable 的隔离级别,无论 Transaction 1 和 2 哪个先执行,最终 Key 1 和 2 的值都是相同的,有可能是 “AA”, 也有可能是 “BB”。但是在 Snapshot 的级别下执行,执行结果则是 Key 1 和 2 的值进行互换。很明显在这种情况下 Snapshot 的隔离能力明显更弱。Isolation 对于存在读写交集的事务的先后顺序无能为力,只能保证存在写冲突的事务间的先后顺序。

    上述例子中,我们虽然具体地看了 Snapshot 隔离级别和 Serializable 之间的差异,但是我们还没有完整介绍过 Snapshot 的特性:

    第一行和前面的例子类似,第二行的语义为从 map 中寻找 key 对应的 value,获取 value 的引用,其生命周期不超过 guard 的生命周期。通过生命周期的方法,我们限定了 value 引用的使用范围为 guard 的存活范围。

    总结

    -

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

    `;export{a as assetURLs,p as default,o as metadata,s as toc}; +

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

    `;export{o as assetURLs,p as default,a as metadata,s as toc}; diff --git a/zh-cn/index.html b/zh-cn/index.html index 6efa04f..0c3c13b 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +