drm/ast: Only warn about unsupported TX chips on Gen4 and later
[drm/drm-misc.git] / tools / crypto / tcrypt / tcrypt_speed_compare.py
blobf3f5783cdc066bf00d7578ad2a444211945bcfe7
1 #!/usr/bin/env python3
2 # SPDX-License-Identifier: GPL-2.0
4 # Copyright (C) xFusion Digital Technologies Co., Ltd., 2023
6 # Author: Wang Jinchao <wangjinchao@xfusion.com>
8 """
9 A tool for comparing tcrypt speed test logs.
11 Please note that for such a comparison, stability depends
12 on whether we allow frequency to float or pin the frequency.
14 Both support tests for operations within one second and
15 cycles of operation.
16 For example, use it in the bash script below.
18 ```bash
19 #!/bin/bash
21 # log file prefix
22 seq_num=0
24 # When sec=0, it will perform cycle tests;
25 # otherwise, it indicates the duration of a single test
26 sec=0
27 num_mb=8
28 mode=211
30 # base speed test
31 lsmod | grep pcrypt && modprobe -r pcrypt
32 dmesg -C
33 modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
34 modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
35 dmesg > ${seq_num}_base_dmesg.log
37 # new speed test
38 lsmod | grep pcrypt && modprobe -r pcrypt
39 dmesg -C
40 modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
41 modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
42 dmesg > ${seq_num}_new_dmesg.log
43 lsmod | grep pcrypt && modprobe -r pcrypt
45 tools/crypto/tcrypt/tcrypt_speed_compare.py \
46 ${seq_num}_base_dmesg.log \
47 ${seq_num}_new_dmesg.log \
48 >${seq_num}_compare.log
49 grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log
50 ```
51 """
53 import sys
54 import re
57 def parse_title(line):
58 pattern = r'tcrypt: testing speed of (.*?) (encryption|decryption)'
59 match = re.search(pattern, line)
60 if match:
61 alg = match.group(1)
62 op = match.group(2)
63 return alg, op
64 else:
65 return "", ""
68 def parse_item(line):
69 pattern_operations = r'\((\d+) bit key, (\d+) byte blocks\): (\d+) operations'
70 pattern_cycles = r'\((\d+) bit key, (\d+) byte blocks\): 1 operation in (\d+) cycles'
71 match = re.search(pattern_operations, line)
72 if match:
73 res = {
74 "bit_key": int(match.group(1)),
75 "byte_blocks": int(match.group(2)),
76 "operations": int(match.group(3)),
78 return res
80 match = re.search(pattern_cycles, line)
81 if match:
82 res = {
83 "bit_key": int(match.group(1)),
84 "byte_blocks": int(match.group(2)),
85 "cycles": int(match.group(3)),
87 return res
89 return None
92 def parse(filepath):
93 result = {}
94 alg, op = "", ""
95 with open(filepath, 'r') as file:
96 for line in file:
97 if not line:
98 continue
99 _alg, _op = parse_title(line)
100 if _alg:
101 alg, op = _alg, _op
102 if alg not in result:
103 result[alg] = {}
104 if op not in result[alg]:
105 result[alg][op] = []
106 continue
107 parsed_result = parse_item(line)
108 if parsed_result:
109 result[alg][op].append(parsed_result)
110 return result
113 def merge(base, new):
114 merged = {}
115 for alg in base.keys():
116 merged[alg] = {}
117 for op in base[alg].keys():
118 if op not in merged[alg]:
119 merged[alg][op] = []
120 for index in range(len(base[alg][op])):
121 merged_item = {
122 "bit_key": base[alg][op][index]["bit_key"],
123 "byte_blocks": base[alg][op][index]["byte_blocks"],
125 if "operations" in base[alg][op][index].keys():
126 merged_item["base_ops"] = base[alg][op][index]["operations"]
127 merged_item["new_ops"] = new[alg][op][index]["operations"]
128 else:
129 merged_item["base_cycles"] = base[alg][op][index]["cycles"]
130 merged_item["new_cycles"] = new[alg][op][index]["cycles"]
132 merged[alg][op].append(merged_item)
133 return merged
136 def format(merged):
137 for alg in merged.keys():
138 for op in merged[alg].keys():
139 base_sum = 0
140 new_sum = 0
141 differ_sum = 0
142 differ_cnt = 0
143 print()
144 hlen = 80
145 print("="*hlen)
146 print(f"{alg}")
147 print(f"{' '*(len(alg)//3) + op}")
148 print("-"*hlen)
149 key = ""
150 if "base_ops" in merged[alg][op][0]:
151 key = "ops"
152 print(f"bit key | byte blocks | base ops | new ops | differ(%)")
153 else:
154 key = "cycles"
155 print(f"bit key | byte blocks | base cycles | new cycles | differ(%)")
156 for index in range(len(merged[alg][op])):
157 item = merged[alg][op][index]
158 base_cnt = item[f"base_{key}"]
159 new_cnt = item[f"new_{key}"]
160 base_sum += base_cnt
161 new_sum += new_cnt
162 differ = round((new_cnt - base_cnt)*100/base_cnt, 2)
163 differ_sum += differ
164 differ_cnt += 1
165 bit_key = item["bit_key"]
166 byte_blocks = item["byte_blocks"]
167 print(
168 f"{bit_key:<7} | {byte_blocks:<11} | {base_cnt:<11} | {new_cnt:<11} | {differ:<8}")
169 average_speed_up = "{:.2f}".format(differ_sum/differ_cnt)
170 ops_total_speed_up = "{:.2f}".format(
171 (base_sum - new_sum) * 100 / base_sum)
172 print('-'*hlen)
173 print(f"average differ(%s) | total_differ(%)")
174 print('-'*hlen)
175 print(f"{average_speed_up:<21} | {ops_total_speed_up:<10}")
176 print('='*hlen)
179 def main(base_log, new_log):
180 base = parse(base_log)
181 new = parse(new_log)
182 merged = merge(base, new)
183 format(merged)
186 if __name__ == "__main__":
187 if len(sys.argv) != 3:
188 print(f"usage: {sys.argv[0]} base_log new_log")
189 exit(-1)
190 main(sys.argv[1], sys.argv[2])