自己写的一个半自动神威26010的性能采样和调试工具库
-
使用SW3 IO寄存器手册中的内容获取动态数据。
使用GNU libbfd和GNU libiberty获取调试信息。下载:
在此链接 下载.
编译:
make tests
会生成4个测试文件: test_pf_serial, test_db_serial, test_pf_mpi, test_db_mpi. 可以在计算节点上进行测试.
运行:
下面是用于控制这个库的环境变量:
ENABLED_PROC: 逗号分隔的进程号列表或者"ALL"以在所有进程下启用, 默认0号进程启用. ENABLE_PROF: 在此变量定义且不为"FALSE"时启用采样. OUT_PATTERN: 采样输出文件的文件名格式, 是printf的格式串, mpi下需要一个%d使不同进程输出到不同文件. VERBOSE: 在此变量定义且不为"FALSE"启用verbose模式.
cgsp至少应为1, 因为需要在从核获取一些运行信息.
额外的内存使用接近二进制文件大小*2, 用于使用libbfd解析调试信息.
例如:VERBOSE=1 ENABLED_PROC=ALL ENABLE_PROF=1 bsub -I -cgsp 1 -b -n 4 -share_size 128 ./test_pf_mpi
功能
调试工具可以用于定位从核DMA和SDLB错误以及死循环现场,
bsignal -s 30 <JobId> #可以使作业打印PC bsignal -s 31 <JobId> #可以使作业尝试打印PC和对应行号
采样工具可以采样从核PC在每个地址出现的次数并对应到行号, 输出到OUT_PATTERN指定的文件或者pc_hits*.txt.
由于IO接口限制, 目前来看4条指令的PC可能会汇集在一起, 例如:0x4ff0410940: 7803022 test_stub_cpe.c: 5: func1 0x4ff0410944: 0 test_stub_cpe.c: 5: func1 0x4ff0410948: 0 test_stub_cpe.c: 5: func1 0x4ff041094c: 0 test_stub_cpe.c: 5: func1 0x4ff0410950: 3901847 test_stub_cpe.c: 5: func1 0x4ff0410954: 0 test_stub_cpe.c: 5: func1 0x4ff0410958: 0 test_stub_cpe.c: 5: func1 0x4ff041095c: 0 test_stub_cpe.c: 5: func1 0x4ff0410960: 11707315 test_stub_cpe.c: 5: func1 0x4ff0410964: 0 test_stub_cpe.c: 5: func1 0x4ff0410968: 0 test_stub_cpe.c: 5: func1 0x4ff041096c: 0 test_stub_cpe.c: 5: func1 0x4ff0410970: 11706904 test_stub_cpe.c: 5: func1 0x4ff0410974: 0 test_stub_cpe.c: 5: func1 0x4ff0410978: 0 test_stub_cpe.c: 5: func1 0x4ff041097c: 0 test_stub_cpe.c: 5: func1 0x4ff0410980: 3901244 test_stub_cpe.c: 5: func1 0x4ff0410984: 0 test_stub_cpe.c: 5: func1 0x4ff0410988: 0 test_stub_cpe.c: 5: func1 0x4ff041098c: 0 test_stub_cpe.c: 5: func1 0x4ff0410990: 3904345 test_stub_cpe.c: 7: func2 0x4ff0410994: 0 test_stub_cpe.c: 7: func2 0x4ff0410998: 0 test_stub_cpe.c: 8: func2 0x4ff041099c: 0 test_stub_cpe.c: 7: func2 0x4ff04109a0: 0 test_stub_cpe.c: 9: func2 0x4ff04109a4: 0 test_stub_cpe.c: 8: func2 0x4ff04109a8: 0 test_stub_cpe.c: 8: func2 0x4ff04109ac: 0 test_stub_cpe.c: 9: func2 0x4ff04109b0: 0 test_stub_cpe.c: 9: func2 0x4ff04109b4: 0 test_stub_cpe.c: 9: func2 0x4ff04109b8: 0 test_stub_cpe.c: 9: func2 0x4ff04109bc: 0 test_stub_cpe.c: 9: func2 0x4ff04109c0: 7803191 test_stub_cpe.c: 9: func2
链接:
参照mpi.flag, serial.flag以链接到其他程序.
限制:
对athread_init, athread_join, athread_spawn进行了wrap, 可能影响这些函数的性能.
MPI版本对MPI_Init和MPI_Finalize进行了wrap, 可以用于c/c++, 但是程序必须有MPI_Finalize.
串行版本由于对main函数进行wrap, main函数必须是int main(int argc, char **argv), c++没有测试.
-
应该挺实用的,可以考虑加入正式的线程库里~
-
@xiaoq
我在改一个新的版本,要结合性能计数器,外加用python做后处理和可视化。
以及,从核有没有优雅的办法wrap函数?
另外我想定制一版编译器对dma进行插桩。