GitOrigin-RevId: ab7564df14
tags/v1.11.0
| @@ -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) | |||
| @@ -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) | |||
| @@ -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; | |||
| } | |||
| @@ -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() | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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}") | |||
| @@ -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( | |||