Browse Source

build(tablegen): pregen opdef tablegen targets

GitOrigin-RevId: ab7564df14
HuaHua404-patch-1
Megvii Engine Team 3 years ago
parent
commit
013bb14fd0
12 changed files with 28978 additions and 33 deletions
  1. +2
    -2
      imperative/CMakeLists.txt
  2. +87
    -20
      imperative/tablegen/CMakeLists.txt
  3. +19
    -8
      imperative/tablegen/autogen.cpp
  4. +16
    -0
      imperative/tablegen/checkhash.cmake
  5. +34
    -0
      imperative/tablegen/generated/enum_macro.h
  6. +7
    -0
      imperative/tablegen/generated/hash.txt
  7. +6917
    -0
      imperative/tablegen/generated/opdef.cpp.inl
  8. +18249
    -0
      imperative/tablegen/generated/opdef.cpy.inl
  9. +1789
    -0
      imperative/tablegen/generated/opdef.h.inl
  10. +1843
    -0
      imperative/tablegen/generated/opdef.py.inl
  11. +12
    -0
      imperative/tablegen/genhash.cmake
  12. +3
    -3
      imperative/test/CMakeLists.txt

+ 2
- 2
imperative/CMakeLists.txt View File

@@ -66,8 +66,8 @@ target_link_libraries(${MODULE_NAME} PRIVATE nlohmann_json::nlohmann_json)
target_include_directories(
${MODULE_NAME}
PUBLIC src/include
PRIVATE ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${MGB_OPDEF_OUT_DIR}
${CPP_REDIS_INCLUDES})
PRIVATE ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${CPP_REDIS_INCLUDES})
target_link_libraries(${MODULE_NAME} PRIVATE mgb_opdef_inc)
target_compile_definitions(${MODULE_NAME} PRIVATE MODULE_NAME=${MODULE_NAME})
target_compile_options(${MODULE_NAME} PRIVATE -Wno-unused-parameter)
if(CXX_SUPPORT_WCLASS_MEMACCESS)


+ 87
- 20
imperative/tablegen/CMakeLists.txt View File

@@ -1,21 +1,88 @@
# mgb tablegen executable
set(TABLE_TARGET mgb-mlir-autogen)
file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.h
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_executable(${TABLE_TARGET} ${SRCS})
target_include_directories(${TABLE_TARGET} PRIVATE ${MLIR_LLVM_INCLUDE_DIR})
target_link_libraries(${TABLE_TARGET} PRIVATE LLVMTableGen MLIRTableGen LLVMSupport)
set(MGB_TABLEGEN_EXE ${TABLE_TARGET})
set(MGB_OPDEF_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/generated)
set(MGB_OPDEF_OPS_SRC ${CMAKE_SOURCE_DIR}/src/core/include/megbrain/ir/ops.td)
set(MGB_OPDEF_PARAMS_SRC ${CMAKE_SOURCE_DIR}/dnn/scripts/opr_param_defs.py)

# generate megbrain opdef c header and python bindings
set(LLVM_TARGET_DEFINITIONS ${MGE_IR_DIR}/ops.td)
tablegen(MGB opdef.h.inl ${MGE_IR_INCLUDE_DIRS} "--gen-cpp-header")
tablegen(MGB opdef.cpp.inl ${MGE_IR_INCLUDE_DIRS} "--gen-cpp-body")
tablegen(MGB opdef.py.inl ${MGE_IR_INCLUDE_DIRS} "--gen-python-binding")
tablegen(MGB opdef.cpy.inl ${MGE_IR_INCLUDE_DIRS} "--gen-python-c-extension")
tablegen(MGB enum_macro.h ${MGE_IR_INCLUDE_DIRS} "--gen-enum-list-macro")
add_custom_target(mgb_opdef ALL DEPENDS opdef.h.inl opdef.cpp.inl opdef.py.inl
opdef.cpy.inl enum_macro.h param_defs_tblgen)
set(MGB_OPDEF_OUT_DIR
${CMAKE_CURRENT_BINARY_DIR}
PARENT_SCOPE)
# we set CMAKE_CONFIGURE_DEPENDS so that when source files or hash.txt was modified,
# cmake configure would be triggered to update ${MD5_MISMATCH}
execute_process(
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/checkhash.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
ERROR_QUIET
RESULT_VARIABLE MD5_MISMATCH)

if(${MD5_MISMATCH})
# mgb tablegen executable
set(TABLE_TARGET mgb-mlir-autogen)
file(GLOB_RECURSE SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.h
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_executable(${TABLE_TARGET} ${SRCS})
target_include_directories(${TABLE_TARGET} PRIVATE ${MLIR_LLVM_INCLUDE_DIR})
target_link_libraries(${TABLE_TARGET} PRIVATE LLVMTableGen MLIRTableGen LLVMSupport)
set(MGB_TABLEGEN_EXE ${TABLE_TARGET})

# generate megbrain opdef c header and python bindings basically same as
# third_party/llvm-project/llvm/cmake/modules/TableGen.cmake but change output folder
# and add extra dependency
set(LLVM_SOURCE_DIR ${CMAKE_SOURCE_DIR}/third_party/llvm-project/llvm)
set(LLVM_BINARY_DIR ${CMAKE_BINARY_DIR}/third_party/llvm-project/llvm)
set(MLIR_SOURCE_DIR ${CMAKE_SOURCE_DIR}/third_party/llvm-project/mlir)
set(MLIR_BINARY_DIR ${CMAKE_BINARY_DIR}/third_party/llvm-project/mlir)
set(MGB_TABLEGEN_INCLUDES
-I${LLVM_SOURCE_DIR}/include
-I${LLVM_BINARY_DIR}/include
-I${MLIR_SOURCE_DIR}/include
-I${MLIR_BINARY_DIR}/include
-I${CMAKE_SOURCE_DIR}/src/core/include/megbrain/ir
-I${CMAKE_BINARY_DIR}/src/core/include/megbrain/ir)
set(MGB_TABLEGEN_FLAGS --write-if-changed)
set(MGB_TABLEGEN_TARGETS)

function(tablegen_opdef target output)
add_custom_target(
mgb_opdef_${target}
COMMAND
${MGB_TABLEGEN_EXE} ${MGB_TABLEGEN_INCLUDES} --gen-${target}
${MGB_OPDEF_OPS_SRC} ${MGB_TABLEGEN_FLAGS} -o ${MGB_OPDEF_OUT_DIR}/${output}
DEPENDS param_defs_tblgen)
set(MGB_TABLEGEN_TARGETS
${MGB_TABLEGEN_TARGETS} mgb_opdef_${target}
PARENT_SCOPE)
endfunction()

tablegen_opdef(cpp-header opdef.h.inl)
tablegen_opdef(cpp-body opdef.cpp.inl)
tablegen_opdef(python-binding opdef.py.inl)
tablegen_opdef(python-c-extension opdef.cpy.inl)
tablegen_opdef(enum-list-macro enum_macro.h)

add_custom_target(
mgb_opdef_genhash
${CMAKE_COMMAND} -P genhash.cmake
DEPENDS ${MGB_TABLEGEN_TARGETS}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_custom_target(mgb_opdef DEPENDS ${MGB_TABLEGEN_TARGETS} mgb_opdef_genhash)
else()
# add extra dependencies for auto reconfiguration
set_property(
DIRECTORY
APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS
${MGB_OPDEF_OPS_SRC}
${MGB_OPDEF_PARAMS_SRC}
generated/opdef.h.inl
generated/opdef.cpp.inl
generated/opdef.py.inl
generated/opdef.cpy.inl
generated/enum_macro
generated/hash.txt)
# additional check for safety
add_custom_target(
mgb_opdef_checkhash
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/checkhash.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_custom_target(mgb_opdef DEPENDS mgb_opdef_checkhash)
endif()

add_library(mgb_opdef_inc INTERFACE)
target_include_directories(mgb_opdef_inc INTERFACE ${MGB_OPDEF_OUT_DIR})
add_dependencies(mgb_opdef_inc mgb_opdef)

+ 19
- 8
imperative/tablegen/autogen.cpp View File

@@ -3,8 +3,9 @@
#include "./targets/pybind11.h"
#include "./targets/python_c_extension.h"

using llvm::raw_ostream;
using llvm::RecordKeeper;
namespace {

using namespace mlir::tblgen;

enum ActionType { None, CppHeader, CppBody, Pybind, CPython, EnumListMacro };

@@ -24,25 +25,35 @@ llvm::cl::opt<ActionType> action(
EnumListMacro, "gen-enum-list-macro",
"Generate enum param list macro")));

using namespace mlir::tblgen;
template <llvm::TableGenMainFn* MainFn>
llvm::TableGenMainFn* WrapMain() {
return [](llvm::raw_ostream& os, llvm::RecordKeeper& records) -> bool {
os << "// clang-format off\n";
auto ret = MainFn(os, records);
os << "// clang-format on\n";
return ret;
};
}

} // namespace

int main(int argc, char** argv) {
llvm::InitLLVM y(argc, argv);
llvm::cl::ParseCommandLineOptions(argc, argv);
if (action == ActionType::CppHeader) {
return TableGenMain(argv[0], &gen_op_def_c_header);
return TableGenMain(argv[0], WrapMain<&gen_op_def_c_header>());
}
if (action == ActionType::CppBody) {
return TableGenMain(argv[0], &gen_op_def_c_body);
return TableGenMain(argv[0], WrapMain<&gen_op_def_c_body>());
}
if (action == ActionType::Pybind) {
return TableGenMain(argv[0], &gen_op_def_pybind11);
return TableGenMain(argv[0], WrapMain<&gen_op_def_pybind11>());
}
if (action == ActionType::CPython) {
return TableGenMain(argv[0], &gen_op_def_python_c_extension);
return TableGenMain(argv[0], WrapMain<&gen_op_def_python_c_extension>());
}
if (action == ActionType::EnumListMacro) {
return TableGenMain(argv[0], &gen_enum_param_list_macro);
return TableGenMain(argv[0], WrapMain<&gen_enum_param_list_macro>());
}
return -1;
}

+ 16
- 0
imperative/tablegen/checkhash.cmake View File

@@ -0,0 +1,16 @@
set(SOURCES
../../dnn/scripts/opr_param_defs.py
../../src/core/include/megbrain/ir/ops.td
generated/opdef.h.inl
generated/opdef.cpp.inl
generated/opdef.py.inl
generated/opdef.cpy.inl
generated/enum_macro.h)
execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum ${SOURCES}
OUTPUT_VARIABLE GENERATED_HASH_CONTENT)

file(READ generated/hash.txt HASH_CONTENT)

if(NOT "${GENERATED_HASH_CONTENT}" STREQUAL "${HASH_CONTENT}")
message(FATAL_ERROR "File ops.td was changed, please rerun cmake configure")
endif()

+ 34
- 0
imperative/tablegen/generated/enum_macro.h View File

@@ -0,0 +1,34 @@
// clang-format off
#define FOR_EACH_ENUM_PARAM(cb) \
cb(::megdnn::param::PoolingV0::Mode); \
cb(::megdnn::param::Convolution::Format); \
cb(::megdnn::param::Argsort::Order); \
cb(::megdnn::param::ConvBiasV0::NonlineMode); \
cb(::megdnn::param::ConvolutionV0::Mode); \
cb(::megdnn::param::ConvolutionV0::Sparse); \
cb(::megdnn::param::ConvolutionV1::ComputeMode); \
cb(::megdnn::param::BN::ParamDim); \
cb(::megdnn::param::BN::FwdMode); \
cb(::megdnn::param::MatrixMulV1::ComputeMode); \
cb(::megdnn::param::MatrixMul::Format); \
cb(::megdnn::param::CollectiveComm::Mode); \
cb(::megdnn::param::Convolution3D::Mode); \
cb(::megdnn::param::Convolution3D::Sparse); \
cb(::megdnn::param::Convolution3D::DataType); \
cb(::megdnn::param::Convolution3D::Format); \
cb(::megdnn::param::ConvolutionV0::Format); \
cb(::megdnn::param::CvtColor::Mode); \
cb(::megdnn::param::Elemwise::Mode); \
cb(::megdnn::param::ElemwiseMultiType::Mode); \
cb(::megdnn::param::Padding::PaddingMode); \
cb(::megdnn::param::RNNCell::NonlineMode); \
cb(::megdnn::param::ROIAlignV0::Mode); \
cb(::megdnn::param::ROIPooling::Mode); \
cb(::megdnn::param::Reduce::Mode); \
cb(::megdnn::param::Reduce::DataType); \
cb(::megdnn::param::WarpPerspectiveV1::InterpolationMode); \
cb(::megdnn::param::WarpPerspectiveV1::BorderMode); \
cb(::megdnn::param::TopK::Mode);
#define FOR_EACH_BIT_COMBINED_ENUM_PARAM(cb) \
cb(::megdnn::param::ExecutionPolicy::Strategy);
// clang-format on

+ 7
- 0
imperative/tablegen/generated/hash.txt View File

@@ -0,0 +1,7 @@
0df57b38e71a4d1882ed6c24f3a26b57 ../../dnn/scripts/opr_param_defs.py
759bfbf27fd3f0dd6b6edf06377e1d6b ../../src/core/include/megbrain/ir/ops.td
c613316001b5f0294ede198f5563f041 generated/opdef.h.inl
a1f7f13c909f9d4c173277f4ed28fb61 generated/opdef.cpp.inl
cf48f9ca352fabaeb6c846c11c6b1662 generated/opdef.py.inl
12365b938f564e5b3639d309f7c83414 generated/opdef.cpy.inl
71e1462bf4d882e2615c3c632cb671cc generated/enum_macro.h

+ 6917
- 0
imperative/tablegen/generated/opdef.cpp.inl
File diff suppressed because it is too large
View File


+ 18249
- 0
imperative/tablegen/generated/opdef.cpy.inl
File diff suppressed because it is too large
View File


+ 1789
- 0
imperative/tablegen/generated/opdef.h.inl
File diff suppressed because it is too large
View File


+ 1843
- 0
imperative/tablegen/generated/opdef.py.inl
File diff suppressed because it is too large
View File


+ 12
- 0
imperative/tablegen/genhash.cmake View File

@@ -0,0 +1,12 @@
set(SOURCES
../../dnn/scripts/opr_param_defs.py
../../src/core/include/megbrain/ir/ops.td
generated/opdef.h.inl
generated/opdef.cpp.inl
generated/opdef.py.inl
generated/opdef.cpy.inl
generated/enum_macro.h)
execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum ${SOURCES}
OUTPUT_VARIABLE HASH_CONTENT)
message(STATUS "Generating hash.txt for opdefs")
file(WRITE generated/hash.txt "${HASH_CONTENT}")

+ 3
- 3
imperative/test/CMakeLists.txt View File

@@ -12,9 +12,9 @@ endif()
# TODO: turn python binding into a static/object library
add_executable(imperative_test ${SOURCES} ${SRCS})
add_dependencies(imperative_test mgb_opdef)
target_include_directories(
imperative_test PRIVATE ${MGB_TEST_DIR}/include ../src/include ${MGB_OPDEF_OUT_DIR}
${CPP_REDIS_INCLUDES})
target_include_directories(imperative_test PRIVATE ${MGB_TEST_DIR}/include
../src/include ${CPP_REDIS_INCLUDES})
target_link_libraries(imperative_test mgb_opdef_inc)

# Python binding
target_include_directories(


Loading…
Cancel
Save