自己写的一个半自动神威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进行插桩。


登录后回复