mx-qual 用户手册

mx-qual(Moffett Qualification)是一款基于 SOLA Runtime API 构建的设备质量测试工具,主要用于检测墨芯 SPU 设备的可用性、稳定性及性能等多项关键指标。

前提条件

在主机上安装 SOLA。具体的步骤,请参见《SOLA Toolkit 安装指南》。 安装 SOLA 后,mx-qual 的二进制文件位于/usr/bin 目录下。

命令说明

基本命令

mx-qual 是一个命令行工具,您可通过执行 mx-qual -h 命令查看帮助信息。

$ mx-qual -h
Moffett Quality Inspection Application  v1.5.0
Usage: mx-qual [OPTIONS] SUBCOMMAND

Options:
  -h,--help                   Print this help message and exit
  --version                   Display program version information and exit

Subcommands:
  list                        List all devices detected on the system
  hardware_link               Run hardware link test
  pcie_bandwidth              Run PCIe bandwidth test
  memory_bandwidth            Run memory bandwidth test
  p2p                         Run peer to peer test
  compute                     Run computing power test
  stress                      Run stress test
  memtest                     Run hardware memory test
  eyegraph                    Show pcie eye graph, must be root user to run this cmd

注意mx-qual 以子命令的方式去执行相应的测试,子命令的使用方法可以通过执行 mx-qual <sub_command> -h命令查看。

子命令

list

  • 描述:列出指定的设备信息。

  • 使用方式:

    $ mx-qual list -h
    List all devices detected on the system
    Usage: mx-qual list [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
    
  • 参数说明:

参数 说明
-i 指定设备的索引。如果不指定设备,则列出所有设备信息。
  • 测试命令示例:

     # 列出所有设备
     $ mx-qual list
     # 列出指定设备
     $ mx-qual list -i 0
     $ mx-qual list -i 0 1 2
     $ mx-qual list -i {0,1,2}
    
  • 输出结果示例:

    Device 0: "00S30-00A"
      Device 0: "00S30-00A"
      Serial number:      2024083080112
      PCI Bus ID:         0000:67:00.0
      Runtime version:    3.9.0
      Driver version:     3.9.0
      Firmware version:   1.0.15
    

pcie_bandwidth

  • 描述:运行 PCIe 带宽测试,不指定设备时默认测试所有设备。

  • 使用方式:

    $ mx-qual pcie_bandwidth -h
    Run PCIe bandwidth test
    Usage: mx-qual pcie_bandwidth [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
      -s,--sn TEXT                The device sn you specified.
    
      -d,--data_size UINT:INT in [32 - 100]
                                  The transfer size (MB) you specified. (default 100MB)
    
      -l,--loop INT:INT in [1 - 100]
                                  The number of test loop (default: 1)
    
      -f,--full_duplex            Enable full duplex mode
    
  • 参数说明:

参数 说明
-i 指定设备的索引,不指定设备时默认测试所有设备
-s 指定设备的 SN 号
-d 指定测试的数据大小,单位为 MB,默认为 100MB
-l 指定测试的循环次数,默认为 1 次
-f 默认进行半双工测试,使用-f时可以开启全双工测试

注意-s的优先级比-i高,若同时指定了-i-s,则只测试-s指定的设备。

  • 测试命令示例:

      # 测试所有设备
      $ mx-qual pcie_bandwidth
      # 通过 device id 测试指定设备
      $ mx-qual pcie_bandwidth -i 0
      $ mx-qual pcie_bandwidth -i 0 1 2
      # 通过设备SN号来测试指定设备
      $ mx-qual pcie_bandwidth -s 2023243080096
      $ mx-qual pcie_bandwidth --sn=2023243080096
      # 使用不同的参数测试
      $ mx-qual pcie_bandwidth -i 0 -d 32 -l 10
      $ mx-qual pcie_bandwidth -f -l 10
    
  • 输出结果示例:

    $ mx-qual pcie_bandwidth -i 0
    PCIe Bandwidth Test (half duplex mode)
     Device id: [0]
    
     Host to Device Bandwidth
     Transfer Size: 100.000 MB, Bandwidth: 12.377 GB/s
    
     Device to Host Bandwidth
     Transfer Size: 100.000 MB, Bandwidth: 12.402 GB/s
    
    Test Result = PASS
    

memory_bandwidth

  • 描述:运行设备内存带宽测试。

  • 使用方式:

    $ mx-qual memory_bandwidth -h
    Run memory bandwidth test
    Usage: mx-qual memory_bandwidth [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
      -s,--sn TEXT                The device sn you specified.
    
      -d,--data_size UINT:INT in [32 - 100]
                                  The transfer size (MB) you specified. (default 100MB)
    
      -l,--loop INT:INT in [1 - 100]
                                  The number of test loop (default: 1)
    

注意-s的优先级比-i高,若同时指定了-i-s,则只测试-s指定的设备。

  • 参数说明:

参数 说明
-i 指定设备的索引,不指定设备时默认测试所有设备
-s 指定设备的 SN 号
-d 指定测试的数据大小,单位为 MB,默认为 100MB
-l 指定测试的循环次数,默认为 1 次
  • 测试命令示例:

    # 测试所有设备
    $ mx-qual memory_bandwidth
    # 通过 device id 测试指定设备
    $ mx-qual memory_bandwidth -i 0
    $ mx-qual memory_bandwidth -i 0 1 2
    # 通过 SN 测试指定设备
    $ mx-qual memory_bandwidth -s 2023243080096
    $ mx-qual memory_bandwidth --sn=2023243080096
    # 使用不同参数测试
    $ mx-qual memory_bandwidth -i 0 -d 32 -l 10
    
  • 输出结果示例:

    $ mx-qual memory_bandwidth -i 0
    Memory Bandwidth Test
     Device id: [0]
    
     Memory Read  Bandwidth
     Transfer Size: 100.000 MB, Bandwidth: 61.361 GB/s
    
     Memory Write Bandwidth
     Transfer Size: 100.000 MB, Bandwidth: 61.567 GB/s
    
    Test Result = PASS
    

P2P

  • 描述:运行 peer-to-peer 带宽测试。

  • 使用方式:

    $ mx-qual p2p -h
    Run peer to peer test
    Usage: mx-qual p2p [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -d,--device UINT:INT in [0 - 31] ...
                                  Device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
      -c,--card UINT:INT in [0 - 31] ...
                                  Card index you specified. Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1}
    
  • 参数说明:

参数 说明
-d 可通过该参数指定运行 p2p 测试的设备(device),不指定设备时默认测试所有设备
-c 可通过该参数指定运行 p2p 测试的卡(card)

说明如果不指定设备或卡,则默认测试所有设备。-c的优先级比-d高。

  • 测试命令示例:

      # 按照 device 的维度测试所有 device 之间的 p2p 性能
      $ mx-qual p2p
      # 按照 device 的维度测试指定 device 之间的 p2p 性能
      $ mx-qual p2p -d 0 1 2
      # 按照 card 的维度测试指定 card 之间的 p2p 性能
      $ mx-qual p2p -c 0 1
    
  • 输出结果示例:

    • 以 device 为维度

      $ mx-qual p2p -d 0 1 2
      P2P Connectivity Matrix
          D/D      0      1      2
          0        0      1      1
          1        1      0      1
          2        1      1      0
      
      Unidirectional P2P Bandwidth Matrix (GB/s)
          D/D      0      1      2
          0     0.00  10.78  10.99
          1    10.83   0.00  11.03
          2    10.98  10.97   0.00
      
      Bidirectional P2P Bandwidth Matrix (GB/s)
          D/D      0      1      2
          0     0.00  21.96  21.67
          1    21.96   0.00  21.71
          2    21.67  21.71   0.00
      
      P2P Latency Matrix (ms)
          SPU      0      1      2
          0     0.00   3.11   3.05
          1     3.10   0.00   3.04
          2     3.06   3.06   0.00
      
          CPU      0      1      2
          0     0.00   8.79   8.81
          1     8.73   0.00   8.66
          2     8.74   8.91   0.00
      
      Test Result = PASS
      
    • 以 card 为维度:

      $ mx-qual p2p -c 0 1
      P2P Connectivity Matrix
          C/C      0      1
          0        0      1
          1        1      0
      
      Unidirectional P2P Bandwidth Matrix (GB/s)
          C/C      0      1
          0     0.00  27.55
          1    27.60   0.00
      
      Bidirectional P2P Bandwidth Matrix (GB/s)
          C/C      0      1
          0     0.00  55.15
          1    55.15   0.00
      
      P2P Latency Matrix (ms)
          SPU      0      1
          0     0.00   3.65
          1     3.65   0.00
      
          CPU      0      1
          0     0.00  11.11
          1    11.10   0.00
      
      Test Result = PASS
      

stress

  • 描述:运行压力测试,可以对设备的内存和计算单元进行压测

  • 使用方式:

    $ mx-qual stress -h
    Run stress test
    Usage: mx-qual stress [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
      -t,--time INT:INT in [2 - 100000]
                                  Number of minutes consumed in a single stress test. (default: 2)
                                  The deviation is subject to the influence of the machine.
      -l,--load INT:INT in [0 - 100]
                                  Pressure test load, ranging from 0% to 100% (default: 100%)
    
  • 参数说明:

参数 说明
-i 指定设备的索引,不指定设备时默认测试所有设备。
-t 指定循环测试一次的时间,默认为 2 分钟,单位为分钟。
-l 指定压测负载,范围从 0-100,默认是 100%负载。

说明在运行前的一分钟,系统会进行设备预热,期间不会进行设备状态的监控。待预热完成后,系统将开始每隔一秒监控设备的温度、功率和利用率,确保数据的实时更新。同时,系统会在当前目录下自动生成mx-qual-stress.log文件,以便后续对压测数据进行详细分析。压测任务结束后,系统会输出整个压测过程的综合信息,方便您全面了解压测情况。

  • 测试命令示例:

    # 默认压测2分钟
    $ mx-qual stress
    # 压测60分钟
    $ mx-qual stress -t 60
    # 使用50%的负载压测60分钟
    $ mx-qual stress -t 60 -l 50
    
  • 输出结果示例:

    device  temp.cur  temp.avg  power.cur  power.avg  util.cur  util.avg    
    0       68        68        65         66         99        99        
    1       67        66        65         65         99        100       
    2       69        68        67         66         99        99        
    
    
    ===================================================================================================
    Summary
    ===================================================================================================
    device  temp.min  temp.max  temp.avg  power.min  power.max  power.avg  util.min  util.max  util.avg
    0       66        68        68        65         68         66         99        99        99       
    1       65        67        66        63         67         65         99        100       100      
    2       67        69        68        65         68         66         99        99        99       
    
    Test Result = PASS
    

compute

  • 描述:运行算力测试。

  • 使用方式:

    $ mx-qual compute -h
    Run computing power test
    Usage: mx-qual compute [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
    

说明运行算力测试时,可以通过 -i 参数指定测试的设备。如果不指定设备,则默认对所有设备进行测试 。测试结果将以卡为单位进行展示,并包含在不同稀疏倍率下的性能数据。需要注意的是,具有相同序列号 (SN) 的设备被视为同一张卡。

  • 参数说明:

参数 说明
-i 指定设备的索引。如果不指定设备,则列出所有设备信息。
  • 测试命令示例:

    $ mx-qual compute 
    
  • 输出结果示例:

     INT8
      1x sparsity:
        SN: 2023243080074, actual:   87.64 TOPS, target:   88.47 TOPS, Utilization: 99.06%
        SN: 2023243080096, actual:   87.64 TOPS, target:   88.47 TOPS, Utilization: 99.06%
      2x sparsity:
        SN: 2023243080074, actual:  173.77 TOPS, target:  176.95 TOPS, Utilization: 98.21%
        SN: 2023243080096, actual:  173.62 TOPS, target:  176.95 TOPS, Utilization: 98.12%
      4x sparsity:
        SN: 2023243080074, actual:  347.35 TOPS, target:  353.89 TOPS, Utilization: 98.15%
        SN: 2023243080096, actual:  347.55 TOPS, target:  353.89 TOPS, Utilization: 98.21%
      8x sparsity:
        SN: 2023243080074, actual:  695.91 TOPS, target:  707.79 TOPS, Utilization: 98.32%
        SN: 2023243080096, actual:  695.91 TOPS, target:  707.79 TOPS, Utilization: 98.32%
      16x sparsity:
        SN: 2023243080074, actual: 1377.36 TOPS, target: 1415.58 TOPS, Utilization: 97.30%
        SN: 2023243080096, actual: 1374.20 TOPS, target: 1415.58 TOPS, Utilization: 97.08%
      32x sparsity:
        SN: 2023243080074, actual: 2662.64 TOPS, target: 2831.16 TOPS, Utilization: 94.05%
        SN: 2023243080096, actual: 2662.64 TOPS, target: 2831.16 TOPS, Utilization: 94.05%
    BF16
      1x sparsity:
        SN: 2023243080074, actual:   43.82 TOPS, target:   44.24 TOPS, Utilization: 99.05%
        SN: 2023243080096, actual:   43.82 TOPS, target:   44.24 TOPS, Utilization: 99.05%
      2x sparsity:
        SN: 2023243080074, actual:   86.77 TOPS, target:   88.47 TOPS, Utilization: 98.08%
        SN: 2023243080096, actual:   86.80 TOPS, target:   88.47 TOPS, Utilization: 98.11%
      4x sparsity:
        SN: 2023243080074, actual:  174.13 TOPS, target:  176.95 TOPS, Utilization: 98.41%
        SN: 2023243080096, actual:  174.23 TOPS, target:  176.95 TOPS, Utilization: 98.46%
      8x sparsity:
        SN: 2023243080074, actual:  348.76 TOPS, target:  353.89 TOPS, Utilization: 98.55%
        SN: 2023243080096, actual:  348.76 TOPS, target:  353.89 TOPS, Utilization: 98.55%
      16x sparsity:
        SN: 2023243080074, actual:  698.35 TOPS, target:  707.79 TOPS, Utilization: 98.67%
        SN: 2023243080096, actual:  698.35 TOPS, target:  707.79 TOPS, Utilization: 98.67%
      32x sparsity:
        SN: 2023243080074, actual: 1371.04 TOPS, target: 1415.58 TOPS, Utilization: 96.85%
        SN: 2023243080096, actual: 1374.20 TOPS, target: 1415.58 TOPS, Utilization: 97.08%
       Test Result = PASS
    

memtest

  • 描述:进行硬件内存相关的测试,主要用于测试硬件内存的稳定性和可靠性。

  • 使用方式:

    $ mx-qual memtest -h
    Run hardware memory test
    Usage: mx-qual memtest [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -i,--index UINT:INT in [0 - 31] ...
                                  The device index you specified (default: all). Separate values with spaces.
                                  Or give a list of elements, separated by commas and enclosed in curly brackets e.g. {0,1,2}
      -t,--type UINT:INT in [0 - 10] ...
                                  The memory test type you specified (default: 7)
                                    type 0          [Walking 1 bit]
                                    type 1          [Own address test]
                                    type 2          [Moving inversions, ones&zeros]
                                    type 3          [Moving inversions, 8 bit pat]
                                    type 4          [Moving inversions, random pattern]
                                    type 5          [Block move, 64 moves]
                                    type 6          [Moving inversions, 32 bit pat]
                                    type 7          [Random number sequence]
                                    type 8          [Modulo 20, random pattern]
                                    type 9          [Bit fade test]
                                    type 10         [Memory stress test]
    
      -l,--loop INT:INT in [1 - 100]
                                  The number of test loop (default: 1)
    
  • 参数说明:

参数 说明
-i 指定设备的索引,不指定时默认运行所有设备。
-t 指定测试的类型,类型的取值范围为 0~10。默认是 7,您也可以可以指定多个类型,具体的类型含义请参见 MemTest86 的说明
-l 指定测试的循环次数,默认为 1 次。
  • 测试命令示例:

    $ mx-qual memtest
    $ mx-qual memtest -i 0 -t 0
    
  • 输出结果示例:

    Device[0] running test 4 / 4 ... passed
    Test Result = PASS
    

eyegraph

  • 描述:查看 PCIe 信道的眼图。

  • 使用方式:

    $ mx-qual eyegraph --help
    Show pcie eye graph, must be root user to run this cmd
    Usage: mx-qual eyegraph [OPTIONS]
    
    Options:
      -h,--help                   Print this help message and exit
      -s,--bdf TEXT REQUIRED      BDF(example: 0000:01:00.1) of the pcie switch device you specified
                                  you can find switch device bdf by lspci cmd:
                                  lspci -D | grep PMC | grep Memory | grep 4068
    
      -l,--lane UINT:INT in [0 - 15]
                                  The lane id of eye graph you want to show (default: 0)
    
  • 参数说明:

参数 说明
-s 指定要查看眼图的设备,可以通过如下命令,查看系统中可用设备(BDF 格式):lspci -D | grep PMC | grep Memory | grep 4068
-l 指定要查看的链路的 lane id
  • 测试命令示例:

    注意查看眼图需要 root 权限。

    # 查看系统中可用设备
    $ lspci -D | grep PMC | grep Memory | grep 4068
    0000:01:00.1 Memory controller: PMC-Sierra Inc. Device 4068
    #执行查看眼图命令
    $ sudo mx-qual eyegraph -s 0000:01:00.1 -l 0
    
  • 输出结果示例:

     $ sudo mx-qual eyegraph -s 0000:01:00.1 -l 0
    
    eye graph for logic port 0(0000:01:00.0), lane id is 0
    it is a upstream port
    start fetch eye pixels, total pixels count 6592
    fetch 496 eye pixels,  6096 pixels to be fetched
    fetch 496 eye pixels,  5600 pixels to be fetched
    fetch 496 eye pixels,  5104 pixels to be fetched
    fetch 496 eye pixels,  4608 pixels to be fetched
    fetch 496 eye pixels,  4112 pixels to be fetched
    fetch 496 eye pixels,  3616 pixels to be fetched
    fetch 496 eye pixels,  3120 pixels to be fetched
    fetch 496 eye pixels,  2624 pixels to be fetched
    fetch 496 eye pixels,  2128 pixels to be fetched
    fetch 496 eye pixels,  1632 pixels to be fetched
    fetch 496 eye pixels,  1136 pixels to be fetched
    fetch 496 eye pixels,   640 pixels to be fetched
    fetch 496 eye pixels,   144 pixels to be fetched
    fetch 144 eye pixels,     0 pixels to be fetched
    fetch eye pixel end
           0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6
         T 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
       V
      255  1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5 5 . . 5 5 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      250  1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 4 5 5 5 5 5 . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      245  1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 5 . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      240  1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 4 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      235  1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      230  1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 5 . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      225  1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
      220  1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 5 . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
      215  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
      210  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
      205  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
      200  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
      195  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
      190  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 5 . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
      185  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
      180  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1
      175  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . 5 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1
      170  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1
      165  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1
      160  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
      155  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
      150  1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
      145  1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1 1 1 1
      140  1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
      135  1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
      130  1 1 1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
      125  1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1 1 1
      120  1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
      115  1 1 1 1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
      110  1 1 1 1 1 1 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
      105  1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1 1
      100  1 1 1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1
       95  1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1
       90  1 1 1 1 1 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1
       85  1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1
       80  1 1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
       75  1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
       70  1 1 1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
       65  1 1 1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1
       60  1 1 1 2 2 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1
       55  1 1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1
       50  1 1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1
       45  1 1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1
       40  1 1 1 2 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1
       35  1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 1 1 1 1
       30  1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 1 1 1 1
       25  1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1 1
       20  1 1 2 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 2 2 2 2 1 1 1
       15  1 1 2 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1
       10  1 1 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1
        5  1 1 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 1 1 1
        0  1 1 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1
       -5  1 1 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1
      -10  1 1 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1
      -15  1 1 2 2 2 3 3 4 4 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 2 2 2 2 1 1 1
      -20  1 1 2 2 2 3 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1
      -25  1 1 2 2 2 2 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1 1
      -30  1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 1 1 1 1
      -35  1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 1 1 1 1
      -40  1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1
      -45  1 1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1
      -50  1 1 1 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1
      -55  1 1 1 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1
      -60  1 1 1 2 2 2 2 3 3 3 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1
      -65  1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
      -70  1 1 1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
      -75  1 1 1 1 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1
      -80  1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1
      -85  1 1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1
      -90  1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1
      -95  1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1
     -100  1 1 1 1 1 2 2 2 2 2 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1
     -105  1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
     -110  1 1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
     -115  1 1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1
     -120  1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1
     -125  1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
     -130  1 1 1 1 1 1 1 2 2 2 2 3 3 3 4 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
     -135  1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1
     -140  1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
     -145  1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
     -150  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1
     -155  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 4 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1
     -160  1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1
     -165  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1
     -170  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1
     -175  1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
     -180  1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 . . . . . . . . . . . . . . . . . . . . 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
     -185  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . . . 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
     -190  1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 . . . . . . . . . . . . . . . . 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
     -195  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 . . . . . . . . . . . . . . . 5 5 5 4 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
     -200  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 . . . . . . . . . . . . . 5 5 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
     -205  1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 4 5 5 5 5 . . . . . . . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
     -210  1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4 4 5 5 5 5 5 5 . . . . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -215  1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 . . . . . . . . . 5 5 5 5 4 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -220  1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 5 . . . . . . 5 5 5 5 4 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -225  1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 . . . . 5 5 5 5 5 4 4 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -230  1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5 5 . . 5 5 5 5 5 4 4 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -235  1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5 . 5 5 5 5 5 4 4 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -240  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 4 4 5 5 5 5 5 5 5 4 4 3 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -245  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 5 5 5 5 5 4 3 3 3 3 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -250  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 5 5 4 4 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     -255  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 3 3 3 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1