# DFGraph **Repository Path**: DFGraph/dfgraph ## Basic Information - **Project Name**: DFGraph - **Description**: DFGraph是动态图计算机的高效高层次综合系统,可以简单高效地支持动态图更新和动态图计算场景 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 152 - **Forks**: 4 - **Created**: 2026-01-06 - **Last Updated**: 2026-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DFGraph ## 1. 介绍 DFGraph是动态图计算机的高效高层次综合系统,可进行高效的动态图更新和动态图分析任务。 ## 2. 项目运行 ### 2.1 动态图更新 #### 环境依赖 - [mimalloc](https://github.com/pdclab/graphbolt). - 使用mimalloc.sh脚本获取 - 根据提示将LD_PRELOAD加入环境 - [opencilk](https://github.com/OpenCilk/opencilk-project/releases?page=2)(版本:OpenCilk-9.0.1-Linux). - [parlaylib](https://github.com/cmuparlay/parlaylib). #### 编译并运行 动态图更新在updateEngine目录下进行。 ``` cd updateEngine ``` 编译并运行代码 ``` make ./LSGraph -f filenames -bs 10000000 ``` 运行代码接受以下参数: - `-f`: 读取的图初始数据文件,该数据文件为邻接表格式,可通过[graphbolt](https://github.com/pdclab/graphbolt)中的SNAPtoAdjConverter进行转化得到 - `-bs`: 处理的批量大小 ### 2.2 动态图分析 #### 概述 ![image](./analysisEngine/img/overview.png) 上图展示了analysisEngine工作流程的概述。 - **步骤 1**:为图应用获取定制化加速器设计,开发者只需使用提供的编程接口编写图抽象采样(GAS)模型三个阶段的用户定义函数(UDFs)。 - **步骤 2**:analysisEngine随后接收UDFs、加速器模板和平台特定优化,生成一组具有所有可能流水线组合的、可综合的加速器代码。 - **步骤 3**:使用Xilinx Vitis工具链将可综合代码编译成比特流。之后,用户分配待加速的图。 - **步骤 4**:analysisEngine根据顶点入度对顶点重新排序并对图进行分区。然后,任务调度器内置的图感知任务调度方法选择具有最合适大、小流水线数量的加速器并生成调度计划。 - **步骤 5**:analysisEngine部署选定的加速器并在目标FPGA上运行。 #### 编程接口 使用analysisEngine,用户只需编写三个高级函数:`accScatter()`、`accGather()` 和 `accApply()`,即可实现不同的图加速器。默认情况下,我们提供了三种内置图算法作为示例:PageRank(PR)、广度优先搜索(BFS)和紧密中心性(CC)。可以通过将参数 ```APP=[算法名称]``` 传递给 ```make``` 命令来编译所需应用。 #### 加速器生成 小流水线和大流水线的数量是可配置的。您可以在 `./global_para.mk` 中修改 `LITTLE_KERNEL_NUM` 和 `BIG_KERNEL_NUM` 来改变它们。请注意,由于内存端口数量有限,对于U280平台,流水线总数(即 `LITTLE_KERNEL_NUM + BIG_KERNEL_NUM`)不应超过14;对于U50平台,流水线总数不应超过13。 您还可以在文件 `./autogen/autogen.py` 中指定希望将内核放置在哪一个SLR中,以及允许每个内核访问哪些存储体。有三个可配置的变量:`apply_kernel_hbm_id`、`all_kernels_slr_id` 和 `all_kernels_hbm_id`。请注意,由于URAM资源有限,对于U50平台,`LITTLE_KERNEL_DST_BUFFER_SIZE` 和 `BIG_KERNEL_DST_BUFFER_SIZE` 应减半,即分别设为32768和262144。 配置完成后,运行 `make autogen` 以生成可综合的加速器和连接性文件。以下是一个配置11个小流水线和3个大流水线的详细示例。 - **步骤 1(必须执行)**: 修改 `./global_para.mk`:指定每种流水线的数量 ```makefile #Little kernel 设置 LITTLE_KERNEL_NUM=11 LITTLE_KERNEL_DST_BUFFER_SIZE=65536 ################################################################################################################# #Big kernel 设置 BIG_KERNEL_NUM=3 BIG_KERNEL_DST_BUFFER_SIZE=524288 ################################################################################################################# ``` - **步骤 2(可选)**:修改 `./autogen/autogen.py`:配置slr id和hbm id。请注意,U280的HBM存储体30和U50的HBM存储体27被保留给出度信息,请避免使用这两个存储体。对于U280,建议使用HBM存储体0到29;对于U50,建议使用HBM存储体0到26。为了获得更好的时序并避免布线拥塞,请将内核均匀地分配到各个SLR中。 ```python # 可配置的hbm封装存储体id(用于顶点属性) # 小流水线顶点属性 | 大流水线顶点属性 wrapper_kernel_hbm_id = [1,3,5,7,9,11,13,15,17,19,21, 23,25,27] # 可配置的小和大封装存储体id(用于边) # 小流水线顶点边 | 大流水线顶点属性 little_and_big_kernels_hbm_id = [0,2,4,6,8,10,12,14,16,18,20, 22,24,26] # 可配置的小和大内核slr id # 每个小流水线的SLR | 每个大流水线的SLR little_and_big_kernels_slr_id = [0,1,2,0,1,2,0,1,2,0,1, 2,1,2] ``` #### 设备 可以通过将参数 ```DEVICES=[设备名称]``` 传递给 ``` make ``` 命令来指定目标设备。如果未指定,默认平台是U280。下表供快速参考。 | 参数 | 设备 | |--------------|--------------| | ```DEVICES=xilinx_u280_xdma_201920_3``` | Alveo U280| | ```DEVICES=xilinx_u50_gen3x16_xdma_201920_3``` | Alveo U50 | #### 环境依赖 - gcc-9.4 - 工具: - Vitis 2020.2 - Xilinx的评估平台: - Alveo U50 数据中心加速卡 - Alveo U280 数据中心加速卡 #### 编译并运行 动态图分析在analysisEngine目录下进行 ``` cd analysisEngine ``` 以在Vitis 2020.2下,在Alveo U280平台上为PageRank实现加速器为例,编译并运行代码 ``` # 配置小流水线数量(LITTLE_KERNEL_NUM)和大流水线数量(BIG_KERNEL_NUM) $ vim global_para.mk # 为每个内核分配slr和hbm存储体 $ vim ./autogen/autogen.py # 配置目标(TARGET)、设备(DEVICES)和算法(APP) $ vim Makefile # 根据指定的配置生成加速器和连接性文件 $ make autogen # 编译主机执行程序和FPGA比特流。这需要一些时间 : $ make APP=pr all # 在真实硬件上执行,需要动态图更新的结果图数据文件。 $ ./host_graph_fpga_pr xclbin_pr/*.xclbin /updateEngine/test.mtx 3 ```