Linux Audio

Check our new training course

Loading...
v6.13.7
  1#!/usr/bin/env python3
  2# SPDX-License-Identifier: GPL-2.0
  3#
  4# Copyright (C) xFusion Digital Technologies Co., Ltd., 2023
  5#
  6# Author: Wang Jinchao <wangjinchao@xfusion.com>
  7#
  8"""
  9A tool for comparing tcrypt speed test logs.
 10
 11Please note that for such a comparison, stability depends
 12on whether we allow frequency to float or pin the frequency.
 13
 14Both support tests for operations within one second and
 15cycles of operation.
 16For example, use it in the bash script below.
 17
 18```bash
 19#!/bin/bash
 20
 21# log file prefix
 22seq_num=0
 23
 24# When sec=0, it will perform cycle tests;
 25# otherwise, it indicates the duration of a single test
 26sec=0
 27num_mb=8
 28mode=211
 29
 30# base speed test
 31lsmod | grep pcrypt && modprobe -r pcrypt
 32dmesg -C
 33modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 34modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 35dmesg > ${seq_num}_base_dmesg.log
 36
 37# new speed test
 38lsmod | grep pcrypt && modprobe -r pcrypt
 39dmesg -C
 40modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 41modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 42dmesg > ${seq_num}_new_dmesg.log
 43lsmod | grep pcrypt && modprobe -r pcrypt
 44
 45tools/crypto/tcrypt/tcrypt_speed_compare.py \
 46    ${seq_num}_base_dmesg.log \
 47    ${seq_num}_new_dmesg.log  \
 48        >${seq_num}_compare.log
 49grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log
 50```
 51"""
 52
 53import sys
 54import re
 55
 56
 57def 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 "", ""
 66
 67
 68def 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)),
 77        }
 78        return res
 79
 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)),
 86        }
 87        return res
 88
 89    return None
 90
 91
 92def 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
111
112
113def 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"],
124                }
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"]
131
132                merged[alg][op].append(merged_item)
133    return merged
134
135
136def 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)
177
178
179def main(base_log, new_log):
180    base = parse(base_log)
181    new = parse(new_log)
182    merged = merge(base, new)
183    format(merged)
184
185
186if __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])
v6.9.4
  1#!/usr/bin/env python3
  2# SPDX-License-Identifier: GPL-2.0
  3#
  4# Copyright (C) xFusion Digital Technologies Co., Ltd., 2023
  5#
  6# Author: Wang Jinchao <wangjinchao@xfusion.com>
  7#
  8"""
  9A tool for comparing tcrypt speed test logs.
 10
 11Please note that for such a comparison, stability depends
 12on whether we allow frequency to float or pin the frequency.
 13
 14Both support tests for operations within one second and
 15cycles of operation.
 16For example, use it in the bash script below.
 17
 18```bash
 19#!/bin/bash
 20
 21# log file prefix
 22seq_num=0
 23
 24# When sec=0, it will perform cycle tests;
 25# otherwise, it indicates the duration of a single test
 26sec=0
 27num_mb=8
 28mode=211
 29
 30# base speed test
 31lsmod | grep pcrypt && modprobe -r pcrypt
 32dmesg -C
 33modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 34modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 35dmesg > ${seq_num}_base_dmesg.log
 36
 37# new speed test
 38lsmod | grep pcrypt && modprobe -r pcrypt
 39dmesg -C
 40modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 41modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 42dmesg > ${seq_num}_new_dmesg.log
 43lsmod | grep pcrypt && modprobe -r pcrypt
 44
 45tools/crypto/tcrypt/tcrypt_speed_compare.py \
 46    ${seq_num}_base_dmesg.log \
 47    ${seq_num}_new_dmesg.log  \
 48        >${seq_num}_compare.log
 49grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log
 50```
 51"""
 52
 53import sys
 54import re
 55
 56
 57def 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 "", ""
 66
 67
 68def 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)),
 77        }
 78        return res
 79
 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)),
 86        }
 87        return res
 88
 89    return None
 90
 91
 92def 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
111
112
113def 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"],
124                }
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"]
131
132                merged[alg][op].append(merged_item)
133    return merged
134
135
136def 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)
177
178
179def main(base_log, new_log):
180    base = parse(base_log)
181    new = parse(new_log)
182    merged = merge(base, new)
183    format(merged)
184
185
186if __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])