|
- #!/usr/bin/env python3
- # coding: utf-8
- # Copyright 2020 Huawei Technologies Co., Ltd
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
-
- """save gpu param"""
- import os
- import fcntl
- import hashlib
- import akg.tvm
- from akg.global_configs import get_cuda_meta_path
-
-
- @akg.tvm.register_func
- def dump_cuda_meta(code, ptx, thread_info):
- """
- Function for dumping cuda meta.
-
- Args:
- code: gpu code.
- ptx: ptx code.
- thread_info: thread info, written to json file.
- """
- # kernel name
- kernel_name = code.split("_kernel")[0].split(" ")[-1]
-
- # sha256 of ptx
- sha256 = hashlib.sha256()
- sha256.update(ptx.encode("utf-8"))
- hash_str = sha256.hexdigest()
-
- # thread info
- thread_info_dict = {
- "blockIdx.x": "1",
- "blockIdx.y": "1",
- "blockIdx.z": "1",
- "threadIdx.x": "1",
- "threadIdx.y": "1",
- "threadIdx.z": "1"
- }
- for thread_tag in thread_info_dict.keys():
- if thread_tag in thread_info:
- if isinstance(thread_info[thread_tag], int):
- thread_info_dict[thread_tag] = str(thread_info[thread_tag])
- elif isinstance(thread_info[thread_tag], akg.tvm.expr.IntImm):
- thread_info_dict[thread_tag] = str(thread_info[thread_tag].value)
-
- meta_path = get_cuda_meta_path()
- cuda_path = os.path.realpath(meta_path)
- if not os.path.isdir(cuda_path):
- os.makedirs(cuda_path)
-
- # save ptx file to cuda meta
- ptx_file = os.path.realpath(meta_path + kernel_name + ".ptx")
- if os.path.exists(ptx_file):
- os.remove(ptx_file)
- with open(ptx_file, "at") as f:
- fcntl.flock(f.fileno(), fcntl.LOCK_EX)
- f.seek(0, 2)
- if f.tell() == 0:
- f.write(ptx)
-
- # modify the file permisson to 400
- os.chmod(ptx_file, 0o400)
-
- # save json file to cuda meta
- json_file = os.path.realpath(meta_path + kernel_name + ".json")
- if os.path.exists(json_file):
- os.remove(json_file)
- with os.fdopen(os.open(json_file, os.O_WRONLY | os.O_CREAT, 0o400), 'w') as fo:
- fo.write("{\n")
- fo.write('"kernelName" : ' + '"' + kernel_name + "_kernel0" + '",\n')
- fo.write('"blockIdx.x" : ' + thread_info_dict["blockIdx.x"] + ',\n')
- fo.write('"blockIdx.y" : ' + thread_info_dict["blockIdx.y"] + ',\n')
- fo.write('"blockIdx.z" : ' + thread_info_dict["blockIdx.z"] + ',\n')
- fo.write('"threadIdx.x" : ' + thread_info_dict["threadIdx.x"] + ',\n')
- fo.write('"threadIdx.y" : ' + thread_info_dict["threadIdx.y"] + ',\n')
- fo.write('"threadIdx.z" : ' + thread_info_dict["threadIdx.z"] + ',\n')
- fo.write('"sha256" : ' + '"' + hash_str + '"\n')
- fo.write("}\n")
|