You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

gen_tablegen.py 5.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import argparse
  4. import collections
  5. import textwrap
  6. import os
  7. import hashlib
  8. import struct
  9. import io
  10. from gen_param_defs import member_defs, ParamDef, IndentWriterBase
  11. class ConverterWriter(IndentWriterBase):
  12. _skip_current_param = False
  13. _last_param = None
  14. _current_tparams = None
  15. _packed = None
  16. _const = None
  17. def __call__(self, fout, defs):
  18. super().__call__(fout)
  19. self._write("// %s", self._get_header())
  20. self._write("#ifndef MGB_PARAM")
  21. self._write("#define MGB_PARAM")
  22. self._process(defs)
  23. self._write("#endif // MGB_PARAM")
  24. def _ctype2attr(self, ctype, value):
  25. if ctype == 'uint32_t':
  26. return 'MgbUI32Attr', value
  27. if ctype == 'uint64_t':
  28. return 'MgbUI64Attr', value
  29. if ctype == 'int32_t':
  30. return 'MgbI32Attr', value
  31. if ctype == 'float':
  32. return 'MgbF32Attr', value
  33. if ctype == 'double':
  34. return 'MgbF64Attr', value
  35. if ctype == 'bool':
  36. return 'MgbBoolAttr', value
  37. if ctype == 'DTypeEnum':
  38. self._packed = False
  39. return 'MgbDTypeAttr', 'megdnn::DType::from_enum(megdnn::{})'.format(value)
  40. raise RuntimeError("unknown ctype")
  41. def _on_param_begin(self, p):
  42. self._last_param = p
  43. if p.is_legacy:
  44. self._skip_current_param = True
  45. return
  46. self._packed = True
  47. self._current_tparams = []
  48. self._const = set()
  49. def _on_param_end(self, p):
  50. if self._skip_current_param:
  51. self._skip_current_param = False
  52. return
  53. if self._packed:
  54. self._write("class {0}ParamBase<string accessor> : MgbPackedParamBase<\"{0}\", accessor> {{".format(p.name), indent=1)
  55. else:
  56. self._write("def {0}Param: MgbParamBase<\"{0}\"> {{".format(p.name), indent=1)
  57. self._write("let fields = (ins", indent=1)
  58. self._write(",\n{}".format(self._cur_indent).join(self._current_tparams))
  59. self._write(");", indent=-1)
  60. self._write("}\n", indent=-1)
  61. if self._packed:
  62. self._write("def {0}Param : {0}ParamBase<\"param\">;\n".format(p.name))
  63. self._current_tparams = None
  64. self._packed = None
  65. self._const = None
  66. def _wrapped_with_default_value(self, attr, default):
  67. return 'MgbDefaultValuedAttr<{}, \"{}\">'.format(attr, default)
  68. def _on_member_enum(self, e):
  69. p = self._last_param
  70. # Note: always generate llvm Record def for enum attribute even it was not
  71. # directly used by any operator, or other enum couldn't alias to this enum
  72. td_class = "{}{}".format(p.name, e.name)
  73. fullname = "::megdnn::param::{}".format(p.name)
  74. enum_def = "MgbEnumAttr<\"{}\", \"{}\", [".format(fullname, e.name)
  75. def format(v):
  76. return '\"{}\"'.format(str(v))
  77. enum_def += ','.join(format(i) for i in e.members)
  78. enum_def += "]>"
  79. self._write("def {} : {};".format(td_class, enum_def))
  80. if self._skip_current_param:
  81. return
  82. # wrapped with default value
  83. default_val = "static_cast<{}::{}>({})".format(fullname, e.name, e.default)
  84. wrapped = self._wrapped_with_default_value(td_class, default_val)
  85. self._current_tparams.append("{}:${}".format(wrapped, e.name_field))
  86. def _on_member_enum_alias(self, e):
  87. p = self._last_param
  88. if self._skip_current_param:
  89. return
  90. # write enum attr def
  91. td_class = "{}{}".format(p.name, e.name)
  92. fullname = "::megdnn::param::{}".format(p.name)
  93. base_td_class = "{}{}".format(e.src_class, e.src_name)
  94. enum_def = "MgbEnumAliasAttr<\"{}\", \"{}\", {}>".format(fullname, e.name, base_td_class)
  95. self._write("def {} : {};".format(td_class, enum_def))
  96. # wrapped with default value
  97. default_val = "static_cast<{}::{}>({})".format(fullname, e.name, e.get_default())
  98. wrapped = self._wrapped_with_default_value(td_class, default_val)
  99. self._current_tparams.append("{}:${}".format(wrapped, e.name_field))
  100. def _on_member_field(self, f):
  101. if self._skip_current_param:
  102. return
  103. attr, value = self._ctype2attr(f.dtype.cname, str(f.default))
  104. if str(value) in self._const:
  105. value = '::megdnn::param::{}::{}'.format(self._last_param.name, value)
  106. wrapped = self._wrapped_with_default_value(attr, value)
  107. self._current_tparams.append("{}:${}".format(wrapped, f.name))
  108. def _on_const_field(self, f):
  109. self._const.add(str(f.name))
  110. def main():
  111. parser = argparse.ArgumentParser('generate op param tablegen file')
  112. parser.add_argument('input')
  113. parser.add_argument('output')
  114. args = parser.parse_args()
  115. with open(args.input) as fin:
  116. inputs = fin.read()
  117. exec(inputs, {'pdef': ParamDef, 'Doc': member_defs.Doc})
  118. input_hash = hashlib.sha256()
  119. input_hash.update(inputs.encode(encoding='UTF-8'))
  120. input_hash = input_hash.hexdigest()
  121. writer = ConverterWriter()
  122. with open(args.output, 'w') as fout:
  123. writer.set_input_hash(input_hash)(fout, ParamDef.all_param_defs)
  124. if __name__ == "__main__":
  125. main()

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台