Files
2026-07-13 13:33:03 +08:00

80 lines
2.8 KiB
Python

import flatbuffers
from CLCache.Cache import Cache
from CLCache.BackendInfo import BackendInfo
def generate_cpp_header(buffer):
cache = Cache.GetRootAs(buffer, 0)
backends_len = cache.BackendsLength()
opencl_tune_map = {}
# 读取 BackendInfo 信息
for i in range(backends_len):
backend_info = cache.Backends(i)
device_name = backend_info.DeviceName().decode("utf-8")
autotuning_map = {}
tunings_len = backend_info.TuningsLength()
for j in range(tunings_len):
tuning = backend_info.Tunings(j)
key = tuning.Key().decode("utf-8")
global_size = list(tuning.GloablSize(j) for j in range(tuning.GloablSizeLength()))
local_size =list(tuning.LocalSize(j) for j in range(tuning.LocalSizeLength()))
if key not in autotuning_map:
autotuning_map[key] = []
autotuning_map[key].append((global_size, local_size))
gemm_len = backend_info.GemmLength()
for j in range(gemm_len):
gemm = backend_info.Gemm(j)
key = 'Xgemm_tune'
gemm_size = list(gemm.GemmSize(j) for j in range(gemm.GemmSizeLength()))
param_info =list(gemm.ParamInfo(j) for j in range(gemm.ParamInfoLength()))
if key not in autotuning_map:
autotuning_map[key] = []
autotuning_map[key].append((gemm_size, param_info))
opencl_tune_map[device_name] = autotuning_map
# 生成 C++ 代码字符串
cpp_code = "const std::map<std::string, std::map<std::string, std::vector<std::pair<std::vector<uint32_t>, std::vector<uint32_t>>>>> OpenCLTuneMap = {\n"
for device, tuning_map in opencl_tune_map.items():
cpp_code += f' {{"{device}", {{\n'
for key, size_pairs in tuning_map.items():
cpp_code += f' {{"{key}", {{\n'
for sizes in size_pairs:
cpp_code += f' {{{{ {", ".join(map(str, sizes[0]))} }}, {{ {", ".join(map(str, sizes[1]))} }}}},\n'
cpp_code += " }},\n"
cpp_code += " }},\n"
cpp_code += "};\n"
return cpp_code
if __name__ == '__main__':
import sys
if len(sys.argv) != 2:
print("Usage: python import_cache.py <cache_file>")
print("Example: python merge_cache.py mnn_cachefile.bin")
sys.exit(1)
with open(sys.argv[1], 'rb') as f:
buffer = f.read()
cpp_header_code = generate_cpp_header(buffer)
# 将结果保存到头文件中
with open('OpenCLTuneMap.hpp', 'w') as header_file:
header_file.write("#include <map>\n#include <string>\n#include <vector>\n\nnamespace MNN { \n")
header_file.write(cpp_header_code)
header_file.write("\n}\n")
print("C++ header file generated.")