# aladdin自动化测试流程 **Repository Path**: yinist/aladdin-auto-script ## Basic Information - **Project Name**: aladdin自动化测试流程 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-06-02 - **Last Updated**: 2025-06-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 自动化aladdin测试 由于每次改变一次config文件都要重新跑一次Aladdin的执行过程,并且如果在同一目录下跑的话最新的结果会覆盖之前的,为了有效地收集结果并且使结果以图表的方式可视化,本研究编写了一系列自动化测试脚本用于Stencil的设计空间探索: 1. generate_summary_table.py: 处理Aladdin工具跑出来的多个子目录下的Stencil_summary文件。并提取重要数据,比如Cycle、Avg Power、Total Area、FU数量等等。自动生成一张Markdown表格,横向比较每个子目录(也就是不同配置)下的指标,保存成一个Markdown文件。使用方法如下:确保有一个总目录,该目录里面每个子目录下都有一个文件叫Stencil_summary\ 运行命令:`python3 generate_summary_table.py [总目录] --output [xxx.md]` 2. Plot_metrics.py: 用于单因子探索,提取每个目录里的Cycle、Power、Area,根据指定的因子(比如partition factor)排序,把Cycle/Avg Power/Total Area随因子变化的趋势画在一张图上。\ 使用方法如下:`python3 your_script.py目录1 目录2 目录3 --factor [要探索的因子前缀]` 3. run_dse.py: 用于单因子探索,自动批量修改config,生成不同的partition配置,运行Aladdin仿真,并调用绘图脚本(plot_metrics)出结果图。支持以下参数: * --function:要测试的kernel名字(如Stencil)。 * --factor:用户期望探索的配置参数,比如partition,cyclic,orig。 * --values:要测试的配置参数取值,比如2,4,8,16或cyclic,block,complete。 * --skip:只生成config,不画图。 * --cached:省略Aladdin的执行流程,直接用已有结果画图 示例使用方法如下,该方法对orig的partition factor进行三种取值的探索:`python3 run_dse.py --function Stencil --factor partition,cyclic,orig --values 2,4,8` 4. run_all.py: 用于多因子探索,自动遍历所有可能的配置组合,批量修改config_example,运行Aladdin仿真,并把结果写进文件。 5. Score.py: 用于多因子探索,首先读取一个文件,里面是用户探索得到的一堆不同配置对应的性能数据。然后进行归一化指标,把Cycle、Power、Area归一化到[0,1]范围。计算综合得分(Score),按自定义的权重组合,比如Cycle(50%)、Power(25%)、Area(25%)。根据归一化指标的结果就可以画图了(生成results.png),图中包含每个配置的得分分布。自动标注得分最低(最好)的配置。\ 使用方法如下: * 确保你有一个叫res.txt的文件,格式大致如下,每一行是一个配置+三列结果:p_orig,p_sol,p_filter,pf_orig,outer,inner,Cycle,avg_power,total_area * 运行:python3 Score.py。 ### 使用方法 将本仓库下所有py文件集成到与gem5-aladdin平级的目录下,然后使用即可 ### 使用示例 1. 单因子探究 主要根据论文的表4-1进行 ![image-20250530215814063](./pic/1.png) ```c // 生成表格 // orig partition type 探究 python run_dse.py --function stencil --factor partition,cyclic,orig --values cyclic,block,complete python generate_summary_table.py ../gem5-aladdin/src/aladdin/SHOC/stencil/example/tmp // 生成图片 // orig partition type 探究 python run_dse.py --function stencil --factor partition,cyclic,orig,4096,4 --values 2,4,8 ``` 2. 多因子探究 ![image-20250530221327169](./pic/2.png) 根据前一步探索的最优结果进行多因子探究,结合编码图,运行脚本前设置好要选的编码,改好配置文件 ![image-20250530221551546](./pic/3.png) 评分并画图 3. C语言描述探究:修改C语言描述然后执行aladdin ```c void stencil (int *orig, int *sol, int const *filter) { #ifdef DMA_MODE dmaLoad(&orig[0], 0, N*sizeof(int)); #endif const int BLOCK = 16; // 根据 L1 Cache 大小调整 const int f0 = filter[0], f1 = filter[1], f2 = filter[2]; const int f3 = filter[3], f4 = filter[4], f5 = filter[5]; const int f6 = filter[6], f7 = filter[7], f8 = filter[8]; outer:for (int ii = 0; ii < N-2; ii += BLOCK) { inner:for (int jj = 0; jj < N-2; jj += BLOCK) { // 计算分块的实际范围 int i_end = (ii + BLOCK < N-2) ? ii + BLOCK : N-2; int j_end = (jj + BLOCK < N-2) ? jj + BLOCK : N-2; other:for (int i = ii; i < i_end; i++) { int *row0 = orig + i*N; int *row1 = row0 + N; int *row2 = row1 + N; int *sol_row = sol + i*N; for (int j = jj; j < j_end; j++) { int sum = row0[j] * f0 + row0[j+1] * f1 + row0[j+2] * f2 + row1[j] * f3 + row1[j+1] * f4 + row1[j+2] * f5 + row2[j] * f6 + row2[j+1] * f7 + row2[j+2] * f8; sol_row[j] = sum; } } } } #ifdef DMA_MODE dmaStore(&sol[0], 0, N*sizeof(int)); #endif } ``` ``` cd $ALADDIN_HOME/SHOC/stencil/example $ALADDIN_HOME/common/aladdin stencil ../dynamic_trace.gz config_example ```