Vortex GPGPU的github流程跑通与功能模块波形探索(二)
文章目录
- 前言
- 一、环境配置和debugging.md文档
- 1.1 调试 Vortex GPU
- 1.1.1测试 RTL 或模拟器 GPU 驱动的更改
- 1.1.2 SimX 调试
- 1.1.3 RTL 调试
- 1.1.4 FPGA 调试
- 1.1.5 分析 Vortex 跟踪日志
- 二、跑出波形文件和日志文件
- 总结
前言
昨天另辟蹊径地去探索了子模块的波形仿真,但找朋友唠嗑发现有可以直接生成vcd格式波形文件的方式。遂,写下此篇,简单记录下。不过今天测试完,发现看子模块波形还是有点不方便,得把引脚拉出来才能看到子模块波形。尽管多少还是有点不方便,但起码有个例子可以参考了 。傻了,信号都在里面。
还是打算再琢磨琢磨子模块直接导出波形。
接下来就结合波形分析模块代码和功能吧!
一、环境配置和debugging.md文档
其实跟昨天那个一样,没有多大改动(就是昨天大改动前没备份,今天重新配了一次环境)
主要还是参考这个文档:https://github.com/vortexgpgpu/vortex/blob/master/docs/install_vortex.md
用的是ubuntu18.04镜像,能在vmware上跑通,具体流程如下:
# step 1. 安装依赖
sudo apt-get install build-essential zlib1g-dev libtinfo-dev libncurses5 uuid-dev libboost-serialization-dev libpng-dev libhwloc-dev# step 2. 升级到g++-11和gcc-11
# 展开一下,ubuntu18.04默认的gcc和g++版本是7.4,没有11的ppa源,因此只能在添加ppa源以后再进行安装
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update & upgrade
sudo apt install gcc-11 g++-11
# 随后修改gcc和g++运行版本
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 11# step 3. 下载vortex gpgpu包
git clone --depth=1 --recursive https://github.com/vortexgpgpu/vortex.git
# 多提一嘴,这个步骤有点麻烦,国内下载速度慢
# 我用了proxychains4和socks5通过主机代理加速下载,具体怎么配合不能说太多,我贴个链接
# https://blog.csdn.net/weixin_48915167/article/details/136705698
# 加速器方案自个儿确定
# 在有proxychains4的情况下,使用
proxychains4 git clone --depth=1 --recursive https://github.com/vortexgpgpu/vortex.git
# 可以加速下载# step4. build vortex
cd vortex
mkdir -p build
cd build
../configure --xlen=32 --tooldir=$HOME/tools
#./ci/toolchain_install.sh --all # 这一步略麻烦,需要下载包,否则不太能成功,建议改为如下:
proxychains4 ./ci/toolchain_install.sh --all
source ./ci/toolchain_env.sh
make -s
# 至此环境搭建完毕
官网跑出vcd的debugging.md文件如下:
1.1 调试 Vortex GPU
1.1.1测试 RTL 或模拟器 GPU 驱动的更改
如果硬件配置与上次运行时相同,Blackbox 实用脚本将不会检测到您的更改。
要强制实用程序构建驱动程序,您需要在运行测试时传递 --rebuild=1 选项。
使用 --rebuild=0 将阻止重建,即使硬件配置与上次运行不同。
```
$ ./ci/blackbox.sh --driver=simx --app=demo --rebuild=1
```
1.1.2 SimX 调试
SimX 循环近似模拟器允许更快地调试 Vortex 内核的执行。
推荐的方法是在运行程序时向 blackbox 工具传递 --debug=<level> 标志以启用调试。
```
// 在 SimX 上以调试模式运行演示程序
$ ./ci/blackbox.sh --driver=simx --app=demo --debug=1
```
在程序执行期间,在当前目录下生成一个调试跟踪 run.log。跟踪包括模拟处理器的重要状态(解码指令、寄存器状态、流水线状态等)。您可以通过更改调试级别来增加跟踪的详细程度。
```
// 使用 SimX 在调试模式下进行详细级别 3 的调试
$ ./ci/blackbox.sh --driver=simx --app=demo --debug=3
```
1.1.3 RTL 调试
要调试处理器 RTL,您需要使用 VLSIM 或 RTLSIM 驱动程序。VLSIM 模拟完整的处理器,包括 AFU 命令处理器(使用 /rtl/afu/opae/vortex_afu.sv 作为顶层模块)。RTLSIM 仅模拟 Vortex 处理器(使用 /rtl/Vortex.v 作为顶层模块)。
推荐的方法是在运行程序时向 blackbox 工具传递 --debug 标志以启用调试。
```
// 在 opae 模拟器上以调试模式运行演示程序
$ TARGET=opaesim ./ci/blackbox.sh --driver=opae --app=demo --debug=1// 在 rtlsim 上以调试模式运行演示程序
$ ./ci/blackbox.sh --driver=rtlsim --app=demo --debug=1
```
在程序执行期间,在当前目录下生成一个调试跟踪 run.log。跟踪包括模拟处理器的重要状态(内存、缓存、流水线、停顿等)。在程序执行期间,当前目录下还会生成一个波形跟踪 trace.vcd。您可以使用任何可以打开 VCD 文件的工具来可视化波形跟踪(Modelsim、Quartus、Vivado 等)。GTKwave 是一个很棒的开源示波器分析器,也适用于 VCD 文件。
1.1.4 FPGA 调试
直接调试 FPGA 可能是必要的,以调查 RTL 模拟无法捕获的运行时错误。我们为 Vortex 实现了一个内部示波器分析器,当 FPGA 运行时可以使用。要启用 FPGA 示波器分析器,应该使用 SCOPE=1 标志构建 FPGA 比特流。
```
& cd /hw/syn/opae
$ CONFIGS="-DSCOPE=1" TARGET=fpga make
```
在 FPGA 上运行程序时,您需要向 blackbox 工具传递 --scope 标志。
```
// 在启用了示波器的 FPGA 上运行演示程序
$ ./ci/blackbox.sh --driver=fpga --app=demo --scope
```
在程序执行期间,在当前目录下将生成一个波形跟踪 trace.vcd。这个跟踪包括在 /hw/scripts/scope.json 中定义的一组有限的信号。您可以通过更新 JSON 文件来扩展您的信号选择。
1.1.5 分析 Vortex 跟踪日志
当调试 Vortex RTL 或 SimX 模拟器时,如果跟踪变得非常大,阅读跟踪 run.log 文件可能会令人不知所措。
我们在 ./hw/scripts/trace_csv.py 下提供了一个跟踪清理工具,您可以使用它将大型跟踪转换为包含所有执行指令及其源和目标操作数的 CSV 文件。
```
$ ./ci/blackbox.sh --driver=rtlsim --app=demo --debug=3 --log=run_rtlsim.log
$ ./ci/trace_csv.py -trtlsim run_rtlsim.log -otrace_rtlsim.csv$ ./ci/blackbox.sh --driver=simx --app=demo --debug=3 --log=run_simx.log
$ ./ci/trace_csv.py -tsimx run_simx.log -otrace_simx.csv$ diff trace_rtlsim.csv trace_simx.csv
```
CSV 跟踪中的第一列是指令的 UUID(通用唯一标识符),内容按 UUID 排序。
您可以使用 UUID 来跟踪在 RTL 硬件或 SimX 模拟器上运行的相同指令。
如果您想通过比较 CSV 跟踪来使用 SimX 调试您的 RTL 硬件,这将非常有效。
二、跑出波形文件和日志文件
我们使用如下命令:
// 在 rtlsim 上以调试模式运行演示程序
./ci/blackbox.sh --driver=rtlsim --app=demo --debug=1
得到结果如下:
root@ubuntu:/home/dention/vortex/build# ./ci/blackbox.sh --driver=rtlsim --app=demo --debug=1
CONFIGS=-DNUM_CLUSTERS=1 -DNUM_CORES=1 -DNUM_WARPS=4 -DNUM_THREADS=4
running: DEBUG=1 CONFIGS=-DNUM_CLUSTERS=1 -DNUM_CORES=1 -DNUM_WARPS=4 -DNUM_THREADS=4 make -C ./ci/../runtime/rtlsim
running: make -C ./ci/../tests/regression/demo run-rtlsim > run.log 2>&1
root@ubuntu:/home/dention/vortex/build# ls
blackbox.rtlsim.cache blackbox.simx.cache ci config.mk hw kernel Makefile run.log runtime sim tests trace.vcd
果不其然出现trace.vcd和run.log,使用gtkwave打开看看:
gtkwave -o trace.vcd
终端显示如下内容:
root@ubuntu:/home/dention/vortex/build# gtkwave -o trace.vcd
Gtk-Message: 23:19:11.438: Failed to load module "canberra-gtk-module"GTKWave Analyzer v3.3.86 (w)1999-2017 BSIFSTLOAD | Processing 11763 facs.
FSTLOAD | Built 4461 signals and 7302 aliases.
FSTLOAD | Building facility hierarchy tree.
FSTLOAD | Sorting facility hierarchy tree.

但可以看到子模块信号还是太少,不利于整体分析。解决方案是明显的,就是改sv代码,把引脚信号全部拉到top模块里面。尽管操作还是复杂,但不失为一种办法 。没啥问题!
另外再看看run.log文件:

内容确实很多,我复制部分内容:
make: Entering directory '/home/dention/vortex/build/tests/regression/demo'
LD_LIBRARY_PATH=/home/dention/vortex/build/runtime: VORTEX_DRIVER=rtlsim ./demo -n64
open device connection
CONFIGS: num_threads=4, num_warps=4, num_cores=1, num_clusters=1, socket_size=1, local_mem_base=0xffff0000, num_barriers=21: cluster0-socket0-core0-execute-lsu0-scheduler-core-rsp: valid=1000, sop=1, eop=1, data={0xb2911cd0, 0x2e1ce6f5, 0xc9ea8cb6, 0x9baf9594}, tag=0x2d9806c71a815a3b3921136c4 (#6266371498832)1: cluster0-socket0-core0-execute-lsu0-scheduler-mem-req-rd: valid=1011, addr={0x211b5b19, 0x01ad9b13, 0x0d7bdb09, 0x06a0d7ee}, ibuf_idx=0, batch_idx=0 (#15901476565582)1: cluster0-socket0-core0-execute-lsu0-scheduler-mem-rsp: valid=1000, data={0xb2911cd0, 0x2e1ce6f5, 0xc9ea8cb6, 0x9baf9594}, ibuf_idx=0, batch_idx=0 (#6266371498832)1: cluster0-socket0-core0-execute-lsu0 Rsp: wid=0, PC=0xad1d9c90, tmask=1000, rd=34, sop=1, eop=1, data={0xb2911cd0, 0x2e1ce6f5, 0xc9ea8cb6, 0x9baf9594}, tag=0x2d9806c71a815a3b3921136c4 (#6266371498832)1: cluster0-socket0-core0-lmem wr-req: req_idx=0, addr=0xb01bfa9, tag=0xa9f46272b86, byteen=b, data=0x09a66b5e (#5839596524995)1: cluster0-socket0-core0-lmem rd-rsp: req_idx=0, tag=0x1847b287eaee, data=0x0 (#13348108498295)1: cluster0-socket0-core0-fetch req: wid=3, PC=0x9df71fbe, tmask=0101 (#15048647525781)1: cluster0-socket0-core0-commit: wid=0, PC=0x3f21b19c, ex=LSU, tmask=0111, wb=1, rd=15, sop=1, eop=0, data={0xd6162ae9, 0xfce4f3e5, 0xa39414f9, 0xff93a710} (#14919940279918)1: cluster0-socket0-core0-issue0 wid=2, PC=0xb34b4dc4, ex=FPU, op=FCVT.WU.S, tmask=0101, wb=0, rd=4, rs1_data={0xb9c434c3, 0x821b50e3, 0xbd4ff2d8, 0x497ab619}, rs2_data={0xfbc1199f, 0xbd29f7c5, 0x739a3358, 0x41a322b6}, rs3_data={0xa4e814ee, 0xdce0a093, 0x86310bb9, 0x81ccea89}, fmt=0x0, frm=0x6 (#10157724225657)3: cluster0-socket0-dcache0 core-wr-req: addr=0xe1ba9240, tag=0x21441e1f66c1, req_idx=0, byteen=0000, data=0x3407d50e5adeeaa388a89927590f2118 (#9144111716784)3: cluster0-socket0-core0-lmem rd-rsp: req_idx=0, tag=0xa9c00b84b7a, data=0x0 (#5832571626941)3: cluster0-socket0-core0-coalescer0-out-req-wr: valid=0, addr={0xe1ba924}, atype={111}, byteen={0x0000}, data={0x3407d50e5adeeaa388a89927590f2118}, offset={0, 3, 0, 1}, pmask=0000, tag=0x21441e1f66c1 (#9144111716784)3: cluster0-socket0-core0-commit: wid=0, PC=0xb3ccb642, ex=SFU, tmask=1111, wb=0, rd=53, sop=0, eop=0, data={0xb7bb7551, 0xe62dff9d, 0x9940c52f, 0x4cacda6a} (#11419158434087)3: cluster0-socket0-core0-issue0 wid=0, PC=0xfbbbfaf8, ex=LSU, op=FSD, tmask=1111, wb=1, rd=53, rs1_data={0x5d6bf8a8, 0x1695ab67, 0x705b24e1, 0x271ecdea}, rs2_data={0xd811c13d, 0x59322eb, 0xc4a23e97, 0x30cfe099}, rs3_data={0x58d9ecde, 0x1ff81b1e, 0x177b5869, 0xf02ae9a6}, offset=0x956 (#2532625589879)5: cluster0-socket0-core0-commit: wid=2, PC=0x12ebd040, ex=FPU, tmask=0110, wb=1, rd=12, sop=1, eop=1, data={0xabb3d6c4, 0x43068626, 0x7ea9351f, 0x41cbd8bb} (#14284082376393)5: cluster0-socket0-core0-issue0 wid=0, PC=0x10389b0, ex=FPU, op=FCVT.S.D, tmask=0101, wb=1, rd=39, rs1_data={0x616c205d, 0xf7b84b92, 0xf93a1f0f, 0x94b32b97}, rs2_data={0x8cd065a8, 0xfe10a0d4, 0xcf05a5c1, 0xc4958570}, rs3_data={0xd321a039, 0x19427b9f, 0x3b93af7, 0xeb3fa6cd}, fmt=0x0, frm=0x2 (#17591375243918)7: cluster0-socket0-dcache0 mem-wr-req: addr=0xe1ba9240, tag=0x10a20f0fb3603, byteen=0000000000000000, data=0x980f46c0088357e9ab0567413e8ca313ce6e7ce19d50d1232fd1aca27533540ed5074e1f1a0f0e76491e759dd36e3a6a3407d50e5adeeaa388a89927590f2118 (#9144111716784)7: cluster0-socket0-core0-fetch req: wid=0, PC=0xebe2bc9a, tmask=0001 (#0)9: cluster0-socket0-core0-commit: wid=0, PC=0xad1d9c90, ex=LSU, tmask=1000, wb=0, rd=34, sop=1, eop=1, data={0xd0861f27, 0x8b5a99d7, 0x2f249119, 0x5d86c0b4} (#6266371498832)
[VXDRV] DEV_OPEN: hdevice=0x55e052c6f7c0
[VXDRV] DCR_WRITE: hdevice=0x55e052c6f7c0, addr=0x1, value=0x8000000017: base-dcr: state=STARTUP_ADDR0, data=0x80000000
[VXDRV] DCR_WRITE: hdevice=0x55e052c6f7c0, addr=0x2, value=0x019: base-dcr: state=STARTUP_ADDR1, data=0x00000000
[VXDRV] DCR_WRITE: hdevice=0x55e052c6f7c0, addr=0x3, value=0x021: base-dcr: state=STARTUP_ARG0, data=0x00000000
[VXDRV] DCR_WRITE: hdevice=0x55e052c6f7c0, addr=0x4, value=0x023: base-dcr: state=STARTUP_ARG1, data=0x00000000
[VXDRV] DCR_WRITE: hdevice=0x55e052c6f7c0, addr=0x5, value=0x025: base-dcr: state=MPM_CLASS, data=0x00000000
[VXDRV] DEV_CAPS: hdevice=0x55e052c6f7c0, caps_id=3, value=1
[VXDRV] DEV_CAPS: hdevice=0x55e052c6f7c0, caps_id=2, value=4
[VXDRV] DEV_CAPS: hdevice=0x55e052c6f7c0, caps_id=1, value=4
data type: float
number of points: 1024
buffer size: 4096 bytes
allocate device memory
[VXDRV] MEM_ALLOC: hdevice=0x55e052c6f7c0, size=4096, flags=0x1, hbuffer=0x55e053017910
[VXDRV] MEM_ADDRESS: hbuffer=0x55e053017910, address=0x10000
[VXDRV] MEM_ALLOC: hdevice=0x55e052c6f7c0, size=4096, flags=0x1, hbuffer=0x55e053017970
[VXDRV] MEM_ADDRESS: hbuffer=0x55e053017970, address=0x11000
[VXDRV] MEM_ALLOC: hdevice=0x55e052c6f7c0, size=4096, flags=0x2, hbuffer=0x55e0530179d0
[VXDRV] MEM_ADDRESS: hbuffer=0x55e0530179d0, address=0x12000
dev_src0=0x10000
dev_src1=0x11000
dev_dst=0x12000
allocate host buffers
upload source buffer0
[VXDRV] COPY_TO_DEV: hbuffer=0x55e053017910, host_addr=0x55e0530179f0, dst_offset=0, size=4096
upload source buffer1
[VXDRV] COPY_TO_DEV: hbuffer=0x55e053017970, host_addr=0x55e053018a00, dst_offset=0, size=4096
upload program
[VXDRV] MEM_RESERVE: hdevice=0x55e052c6f7c0, address=0x80000000, size=29260, flags=0x0, hbuffer=0x55e053025fe0
[VXDRV] MEM_ACCESS: hbuffer=0x55e053025fe0, offset=0, size=29232, flags=1
[VXDRV] MEM_ACCESS: hbuffer=0x55e053025fe0, offset=29232, size=28, flags=3
[VXDRV] COPY_TO_DEV: hbuffer=0x55e053025fe0, host_addr=0x55e05301ecd0, dst_offset=0, size=29232
upload kernel argument
[VXDRV] MEM_ALLOC: hdevice=0x55e052c6f7c0, size=32, flags=0x1, hbuffer=0x55e05301cdd0
[VXDRV] COPY_TO_DEV: hbuffer=0x55e05301cdd0, host_addr=0x55e0528711a0, dst_offset=0, size=32
start device
[VXDRV] START: hdevice=0x55e052c6f7c0, hkernel=0x55e053025fe0, harguments=0x55e05301cdd027: base-dcr: state=STARTUP_ADDR0, data=0x8000000029: base-dcr: state=STARTUP_ADDR1, data=0x0000000031: base-dcr: state=STARTUP_ARG0, data=0x0001300033: base-dcr: state=STARTUP_ARG1, data=0x00000000
wait for completion
[VXDRV] READY_WAIT: hdevice=0x55e052c6f7c0, timeout=86400000
34: [sim] run()45: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000000, tmask=0001 (#0)559: cluster0-socket0-icache0 core-rd-req: addr=0x80000000, tag=0x0, req_idx=0 (#0)565: cluster0-socket0-icache0 mem-rd-req: addr=0x80000000, tag=0x0 (#0)567: MEM Rd Req: addr=0x80000000, tag=0x0, byteen=0xffffffffffffffff567: l3cache mem-rd-req: addr=0x80000000, tag=0x0 (#0)567: l3cache core-rd-req: addr=0x80000000, tag=0x0, req_idx=0 (#0)567: cluster0-l2cache mem-rd-req: addr=0x80000000, tag=0x0 (#0)567: cluster0-l2cache core-rd-req: addr=0x80000000, tag=0x0, req_idx=0 (#0)607: MEM Rd Rsp: tag=0x0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3607: l3cache mem-rd-rsp: tag=0x0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3 (#0)607: l3cache core-rd-rsp: tag=0x0, req_idx=0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3 (#0)607: cluster0-l2cache mem-rd-rsp: tag=0x0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3 (#0)607: cluster0-l2cache core-rd-rsp: tag=0x0, req_idx=0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3 (#0)609: cluster0-socket0-icache0 mem-rd-rsp: tag=0x0, data=0x14c000ef0002800bfff002930062900b14c3031300000317fc1022f30002800b00100293118000ef0002800bfff002930062900b15c3031300000317fc1022f3 (#0)619: cluster0-socket0-icache0 core-rd-rsp: tag=0x0, req_idx=0, data=0xfc1022f3 (#0)619: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x80000000, tmask=0001, instr=0xfc1022f3 (#0)619: cluster0-socket0-core0-decode: wid=0, PC=0x80000000, instr=0xfc1022f3, ex=SFU, op=CSRRS, tmask=0001, wb=1, rd=5, rs1=0, rs2=0, rs3=0, opds=1100, addr=0xfc1, use_imm=0, imm=0x15 (#0)623: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000004, tmask=0001 (#1)625: cluster0-socket0-icache0 core-rd-req: addr=0x80000004, tag=0x4, req_idx=0 (#1)631: cluster0-socket0-icache0 core-rd-rsp: tag=0x4, req_idx=0, data=0x00000317 (#1)631: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x80000004, tmask=0001, instr=0x317 (#1)631: cluster0-socket0-core0-decode: wid=0, PC=0x80000004, instr=0x317, ex=ALU, op=AUIPC, tmask=0001, wb=1, rd=6, rs1=0, rs2=0, rs3=0, opds=1000, use_PC=1, use_imm=1, imm=0x0 (#1)635: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000008, tmask=0001 (#2)637: cluster0-socket0-icache0 core-rd-req: addr=0x80000008, tag=0x8, req_idx=0 (#2)637: cluster0-socket0-core0-issue0 wid=0, PC=0x80000000, ex=SFU, op=CSRRS, tmask=0001, wb=1, rd=5, rs1_data={0x0, 0x0, 0x0, 0x0}, rs2_data={0x0, 0x0, 0x0, 0x0}, rs3_data={0x0, 0x0, 0x0, 0x0}, addr=0xfc1, use_imm=0, imm=0x15 (#0)643: cluster0-socket0-icache0 core-rd-rsp: tag=0x8, req_idx=0, data=0x15c30313 (#2)643: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x80000008, tmask=0001, instr=0x15c30313 (#2)643: cluster0-socket0-core0-decode: wid=0, PC=0x80000008, instr=0x15c30313, ex=ALU, op=ADDI, tmask=0001, wb=1, rd=6, rs1=6, rs2=0, rs3=0, opds=1100, use_PC=0, use_imm=1, imm=0x15c (#2)647: cluster0-socket0-core0-fetch req: wid=0, PC=0x8000000c, tmask=0001 (#3)649: cluster0-socket0-icache0 core-rd-req: addr=0x8000000c, tag=0xc, req_idx=0 (#3)649: cluster0-socket0-core0-commit: wid=0, PC=0x80000000, ex=SFU, tmask=0001, wb=1, rd=5, sop=1, eop=1, data={0x4, 0x4, 0x4, 0x4} (#0)649: cluster0-socket0-core0-issue0 wid=0, PC=0x80000004, ex=ALU, op=AUIPC, tmask=0001, wb=1, rd=6, rs1_data={0x0, 0x0, 0x0, 0x0}, rs2_data={0x0, 0x0, 0x0, 0x0}, rs3_data={0x0, 0x0, 0x0, 0x0}, use_PC=1, use_imm=1, imm=0x0 (#1)655: cluster0-socket0-icache0 core-rd-rsp: tag=0xc, req_idx=0, data=0x0062900b (#3)655: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x8000000c, tmask=0001, instr=0x62900b (#3)655: cluster0-socket0-core0-decode: wid=0, PC=0x8000000c, instr=0x62900b, ex=SFU, op=WSPAWN, tmask=0001, wb=0, rd=0, rs1=5, rs2=6, rs3=0, opds=0110 (#3)657: cluster0-socket0-core0-commit: wid=0, PC=0x80000004, ex=ALU, tmask=0001, wb=1, rd=6, sop=1, eop=1, data={0x80000004, 0x80000004, 0x80000004, 0x80000004} (#1)673: cluster0-socket0-core0-issue0 wid=0, PC=0x80000008, ex=ALU, op=ADDI, tmask=0001, wb=1, rd=6, rs1_data={0x0, 0x0, 0x0, 0x80000004}, rs2_data={0x0, 0x0, 0x0, 0x0}, rs3_data={0x0, 0x0, 0x0, 0x0}, use_PC=0, use_imm=1, imm=0x15c (#2)681: cluster0-socket0-core0-commit: wid=0, PC=0x80000008, ex=ALU, tmask=0001, wb=1, rd=6, sop=1, eop=1, data={0x15c, 0x15c, 0x15c, 0x80000160} (#2)697: cluster0-socket0-core0-issue0 wid=0, PC=0x8000000c, ex=SFU, op=WSPAWN, tmask=0001, wb=0, rd=0, rs1_data={0x0, 0x0, 0x0, 0x4}, rs2_data={0x0, 0x0, 0x0, 0x80000160}, rs3_data={0x0, 0x0, 0x0, 0x0} (#3)709: cluster0-socket0-core0-commit: wid=0, PC=0x8000000c, ex=SFU, tmask=0001, wb=0, rd=0, sop=1, eop=1, data={0x0, 0x0, 0x0, 0x0} (#3)711: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000010, tmask=0001 (#4)713: cluster0-socket0-icache0 core-rd-req: addr=0x80000010, tag=0x10, req_idx=0 (#4)713: cluster0-socket0-core0-fetch req: wid=1, PC=0x80000160, tmask=0001 (#4294967296)715: cluster0-socket0-icache0 core-rd-req: addr=0x80000160, tag=0x400000001, req_idx=0 (#4294967296)715: cluster0-socket0-core0-fetch req: wid=2, PC=0x80000160, tmask=0001 (#8589934592)717: cluster0-socket0-icache0 core-rd-req: addr=0x80000160, tag=0x800000002, req_idx=0 (#8589934592)717: cluster0-socket0-core0-fetch req: wid=3, PC=0x80000160, tmask=0001 (#12884901888)719: cluster0-socket0-icache0 core-rd-req: addr=0x80000160, tag=0xc00000003, req_idx=0 (#12884901888)719: cluster0-socket0-icache0 core-rd-rsp: tag=0x10, req_idx=0, data=0xfff00293 (#4)719: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x80000010, tmask=0001, instr=0xfff00293 (#4)719: cluster0-socket0-core0-decode: wid=0, PC=0x80000010, instr=0xfff00293, ex=ALU, op=ADDI, tmask=0001, wb=1, rd=5, rs1=0, rs2=0, rs3=0, opds=1100, use_PC=0, use_imm=1, imm=0xffffffff (#4)721: cluster0-socket0-icache0 mem-rd-req: addr=0x80000140, tag=0x1 (#0)723: MEM Rd Req: addr=0x80000140, tag=0x400000000000, byteen=0xffffffffffffffff723: l3cache mem-rd-req: addr=0x80000140, tag=0x400000000000 (#1099511627776)723: l3cache core-rd-req: addr=0x80000140, tag=0x400000000000, req_idx=0 (#1099511627776)723: cluster0-l2cache mem-rd-req: addr=0x80000140, tag=0x400000000000 (#1099511627776)723: cluster0-l2cache core-rd-req: addr=0x80000140, tag=0x400000000000, req_idx=0 (#1099511627776)723: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000014, tmask=0001 (#5)725: cluster0-socket0-icache0 core-rd-req: addr=0x80000014, tag=0x14, req_idx=0 (#5)731: cluster0-socket0-icache0 core-rd-rsp: tag=0x14, req_idx=0, data=0x0002800b (#5)731: cluster0-socket0-core0-fetch rsp: wid=0, PC=0x80000014, tmask=0001, instr=0x2800b (#5)731: cluster0-socket0-core0-decode: wid=0, PC=0x80000014, instr=0x2800b, ex=SFU, op=TMC, tmask=0001, wb=0, rd=0, rs1=5, rs2=0, rs3=0, opds=0100 (#5)737: cluster0-socket0-core0-issue0 wid=0, PC=0x80000010, ex=ALU, op=ADDI, tmask=0001, wb=1, rd=5, rs1_data={0x0, 0x0, 0x0, 0x0}, rs2_data={0x0, 0x0, 0x0, 0x0}, rs3_data={0x0, 0x0, 0x0, 0x0}, use_PC=0, use_imm=1, imm=0xffffffff (#4)745: cluster0-socket0-core0-commit: wid=0, PC=0x80000010, ex=ALU, tmask=0001, wb=1, rd=5, sop=1, eop=1, data={0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff} (#4)761: cluster0-socket0-core0-issue0 wid=0, PC=0x80000014, ex=SFU, op=TMC, tmask=0001, wb=0, rd=0, rs1_data={0x0, 0x0, 0x0, 0xffffffff}, rs2_data={0x0, 0x0, 0x0, 0x0}, rs3_data={0x0, 0x0, 0x0, 0x0} (#5)763: MEM Rd Rsp: tag=0x400000000000, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313763: l3cache mem-rd-rsp: tag=0x400000000000, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313 (#1099511627776)763: l3cache core-rd-rsp: tag=0x400000000000, req_idx=0, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313 (#1099511627776)763: cluster0-l2cache mem-rd-rsp: tag=0x400000000000, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313 (#1099511627776)763: cluster0-l2cache core-rd-rsp: tag=0x400000000000, req_idx=0, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313 (#1099511627776)765: cluster0-socket0-icache0 mem-rd-rsp: tag=0x1, data=0x00c000ef0002800bfff00293000080670000000bfc9ff0ef0002800bfff0029300008067005202330fc2021300007217026282b301c003134061013300d29313 (#0)773: cluster0-socket0-core0-fetch req: wid=0, PC=0x80000018, tmask=1111 (#6)773: cluster0-socket0-core0-commit: wid=0, PC=0x80000014, ex=SFU, tmask=0001, wb=0, rd=0, sop=1, eop=1, data={0x0, 0x0, 0x0, 0x0} (#5)775: cluster0-socket0-icache0 core-rd-req: addr=0x80000018, tag=0x18, req_idx=0 (#6)775: cluster0-socket0-icache0 core-rd-rsp: tag=0x400000001, req_idx=0, data=0xfff00293 (#4294967296)775: cluster0-socket0-core0-fetch rsp: wid=1, PC=0x80000160, tmask=0001, instr=0xfff00293 (#4294967296)775: cluster0-socket0-core0-decode: wid=1, PC=0x80000160, instr=0xfff00293, ex=ALU, op=ADDI, tmask=0001, wb=1, rd=5, rs1=0, rs2=0, rs3=0, opds=1100, use_PC=0, use_imm=1, imm=0xffffffff (#4294967296)
用它提供的命令尝试转化为.csv文件试试:
./ci/trace_csv.py -trtlsim run.log -otrace_rtlsim.csv
顺利得到.csv文件:
root@ubuntu:/home/dention/vortex/build# ./ci/trace_csv.py -trtlsim run.log -otrace_rtlsim.csv
root@ubuntu:/home/dention/vortex/build# ls
blackbox.rtlsim.cache ci hw Makefile runtime tests trace.vcd
blackbox.simx.cache config.mk kernel run.log sim trace_rtlsim.csv trace.vcd.fst

还是比较直观的,按照PC指令顺序列出每条具体的指令。
对于opae模式来说,指令差不多:
root@ubuntu:/home/dention/vortex/build# TARGET=opaesim ./ci/blackbox.sh --driver=opae --app=demo --debug=1
CONFIGS=-DNUM_CLUSTERS=1 -DNUM_CORES=1 -DNUM_WARPS=4 -DNUM_THREADS=4
running: DEBUG=1 CONFIGS=-DNUM_CLUSTERS=1 -DNUM_CORES=1 -DNUM_WARPS=4 -DNUM_THREADS=4 make -C ./ci/../runtime/opae
/home/dention/vortex/sim/opaesim/opae_sim.cpp:40: warning: "MEMORY_BANKS" redefined40 | #define MEMORY_BANKS PLATFORM_PARAM_LOCAL_MEMORY_BANKS|
In file included from /home/dention/vortex/sim/common/mem.h:23,from /home/dention/vortex/sim/opaesim/opae_sim.cpp:25:
/home/dention/vortex/build/hw/VX_config.h:727: note: this is the location of the previous definition727 | #define MEMORY_BANKS 8|
running: make -C ./ci/../tests/regression/demo run-opae > run.log 2>&1root@ubuntu:/home/dention/vortex/build# ./ci/trace_csv.py -trtlsim run_opae.log -otrace_opae.csv
root@ubuntu:/home/dention/vortex/build# ls
blackbox.opae.cache blackbox.simx.cache config.mk kernel run_opae.log runtime tests trace_opae.vcd trace_rtlsim.vcd
blackbox.rtlsim.cache ci hw Makefile run_rtlsim.log sim trace_opae.csv trace_rtlsim.csv trace.vcd.fst
还剩下一个基于模拟器的simx就不演示了。
总结
不总结了!工具准备好了就开始分析代码吧!
相关文章:
Vortex GPGPU的github流程跑通与功能模块波形探索(二)
文章目录 前言一、环境配置和debugging.md文档1.1 调试 Vortex GPU1.1.1测试 RTL 或模拟器 GPU 驱动的更改1.1.2 SimX 调试1.1.3 RTL 调试1.1.4 FPGA 调试1.1.5 分析 Vortex 跟踪日志 二、跑出波形文件和日志文件总结 前言 昨天另辟蹊径地去探索了子模块的波形仿真,…...
【X线源】微焦点X射线源的基本原理
【X线源】微焦点X射线源的基本原理 1.背景2.原理 1.背景 1895年11月8日,德国物理学家威廉伦琴在研究阴极射线时偶然发现了X射线。当时,他注意到阴极射线管附近的荧光屏发出了光,即使它被纸板遮挡住。经过进一步实验,他意识到这种…...
LeetCode hot100---栈专题(C++语言)
1、有效的括号 (1)题目描述以及输入输出 (1)题目描述: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。(2)输入输出描述: 输入:s "()&…...
STM32-MPU6050+DAM库源码(江协笔记)
目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器࿱…...
Ruby 数组(Array)
Ruby 数组(Array) 引言 Ruby,作为一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。在Ruby中,数组(Array)是一种基本的数据结构,用于存储一系列有序的元素。本文将深入探讨…...
分享几个做题网站------学习网------工具网;
以下是就是做题网站;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台,汇集互联网大厂面试真题,拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库,提供能力测评、面试刷题、笔…...
Spring MVC__入门
目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、helloworld1、开发环境2、创建maven工程3、配置web.xml4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorld7、总结 一、SpringMVC简介 1、什么是MVC MV…...
MATLAB GUI组件全解析:构建交互式应用程序
MATLAB的图形用户界面(GUI)是一个功能强大的工具,它允许开发者创建直观且用户友好的界面。这些界面,也称为应用程序或app,提供了点击控制,使得用户无需学习编程语言或输入命令即可运行应用程序。本文将详细…...
MySQL 实验 2:数据库的创建与管理
MySQL 实验 2:数据库的创建与管理 目录 MySQL 实验 2:数据库的创建与管理一、查看数据库1、语法2、举例 二、创建数据库1、语法2、举例 三、选择数据库1、语法2、举例 四、删除数据库1、语法2、举例 一、查看数据库 1、语法 show databases;2、举例 m…...
LeetCode 2390. 从字符串中移除星号【栈】1347
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
springboot文件上传(阿里云oss)
本地存储 使用uuid是为了避免文件名的重复,防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …...
Linux下Nodejs应用service配置
Linux 的 service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。service 命令本身是一个 shell 脚本,它在…...
设计模式-结构型-常用:代理模式、桥接模式、装饰者模式、适配器模式
代理模式 快速入门 代理模式是指在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 比如这段统计性能的代码: public class UserController {//...省略其他属性和方法...private MetricsCollecto…...
用多了编程工具,还是Editplus3最贴心
编程久了,发现越是复杂的编程工具越是烦人,而不是帮助人。 早期Java届是没有统一的IDE的,有些人习惯用文本编辑器,但苦于缺乏提示,有些人从一些渠道用上了JBuilder,但毛病不少,直到Eclipse化解…...
Angular基础学习(入门 --> 入坑)
目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 (ViewChild) 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …...
吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥?10、…...
Linux防火墙-常用命令
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...
C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric> 遍历算法: for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...
Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...
Flutter笔记--通知
这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
