1*da0073e9SAndroid Build Coastguard Worker# This ill-named file does a number of things: 2*da0073e9SAndroid Build Coastguard Worker# - Installs Caffe2 header files (this has nothing to do with code generation) 3*da0073e9SAndroid Build Coastguard Worker# - Configures caffe2/core/macros.h 4*da0073e9SAndroid Build Coastguard Worker# - Creates an ATen target for its generated C++ files and adds it 5*da0073e9SAndroid Build Coastguard Worker# as a dependency 6*da0073e9SAndroid Build Coastguard Worker# - Reads build lists defined in build_variables.bzl 7*da0073e9SAndroid Build Coastguard Worker 8*da0073e9SAndroid Build Coastguard Worker################################################################################ 9*da0073e9SAndroid Build Coastguard Worker# Helper functions 10*da0073e9SAndroid Build Coastguard Worker################################################################################ 11*da0073e9SAndroid Build Coastguard Worker 12*da0073e9SAndroid Build Coastguard Workerfunction(filter_list output input) 13*da0073e9SAndroid Build Coastguard Worker unset(result) 14*da0073e9SAndroid Build Coastguard Worker foreach(filename ${${input}}) 15*da0073e9SAndroid Build Coastguard Worker foreach(pattern ${ARGN}) 16*da0073e9SAndroid Build Coastguard Worker if("${filename}" MATCHES "${pattern}") 17*da0073e9SAndroid Build Coastguard Worker list(APPEND result "${filename}") 18*da0073e9SAndroid Build Coastguard Worker endif() 19*da0073e9SAndroid Build Coastguard Worker endforeach() 20*da0073e9SAndroid Build Coastguard Worker endforeach() 21*da0073e9SAndroid Build Coastguard Worker set(${output} ${result} PARENT_SCOPE) 22*da0073e9SAndroid Build Coastguard Workerendfunction() 23*da0073e9SAndroid Build Coastguard Worker 24*da0073e9SAndroid Build Coastguard Workerfunction(filter_list_exclude output input) 25*da0073e9SAndroid Build Coastguard Worker unset(result) 26*da0073e9SAndroid Build Coastguard Worker foreach(filename ${${input}}) 27*da0073e9SAndroid Build Coastguard Worker foreach(pattern ${ARGN}) 28*da0073e9SAndroid Build Coastguard Worker if(NOT "${filename}" MATCHES "${pattern}") 29*da0073e9SAndroid Build Coastguard Worker list(APPEND result "${filename}") 30*da0073e9SAndroid Build Coastguard Worker endif() 31*da0073e9SAndroid Build Coastguard Worker endforeach() 32*da0073e9SAndroid Build Coastguard Worker endforeach() 33*da0073e9SAndroid Build Coastguard Worker set(${output} ${result} PARENT_SCOPE) 34*da0073e9SAndroid Build Coastguard Workerendfunction() 35*da0073e9SAndroid Build Coastguard Worker 36*da0073e9SAndroid Build Coastguard Worker################################################################################ 37*da0073e9SAndroid Build Coastguard Worker 38*da0073e9SAndroid Build Coastguard Worker# ---[ Write the macros file 39*da0073e9SAndroid Build Coastguard Workerconfigure_file( 40*da0073e9SAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/../caffe2/core/macros.h.in 41*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/caffe2/core/macros.h) 42*da0073e9SAndroid Build Coastguard Worker 43*da0073e9SAndroid Build Coastguard Worker# ---[ Installing the header files 44*da0073e9SAndroid Build Coastguard Workerinstall(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../caffe2 45*da0073e9SAndroid Build Coastguard Worker DESTINATION include 46*da0073e9SAndroid Build Coastguard Worker FILES_MATCHING PATTERN "*.h") 47*da0073e9SAndroid Build Coastguard Workerif(NOT INTERN_BUILD_ATEN_OPS) 48*da0073e9SAndroid Build Coastguard Worker install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/core 49*da0073e9SAndroid Build Coastguard Worker DESTINATION include/ATen 50*da0073e9SAndroid Build Coastguard Worker FILES_MATCHING PATTERN "*.h") 51*da0073e9SAndroid Build Coastguard Workerendif() 52*da0073e9SAndroid Build Coastguard Workerinstall(FILES ${CMAKE_BINARY_DIR}/caffe2/core/macros.h 53*da0073e9SAndroid Build Coastguard Worker DESTINATION include/caffe2/core) 54*da0073e9SAndroid Build Coastguard Worker 55*da0073e9SAndroid Build Coastguard Worker# ---[ ATen specific 56*da0073e9SAndroid Build Coastguard Workerif(INTERN_BUILD_ATEN_OPS) 57*da0073e9SAndroid Build Coastguard Worker if(MSVC) 58*da0073e9SAndroid Build Coastguard Worker set(OPT_FLAG "/fp:strict ") 59*da0073e9SAndroid Build Coastguard Worker else(MSVC) 60*da0073e9SAndroid Build Coastguard Worker set(OPT_FLAG "-O3 ") 61*da0073e9SAndroid Build Coastguard Worker if("${CMAKE_BUILD_TYPE}" MATCHES "Debug") 62*da0073e9SAndroid Build Coastguard Worker set(OPT_FLAG " ") 63*da0073e9SAndroid Build Coastguard Worker endif() 64*da0073e9SAndroid Build Coastguard Worker endif(MSVC) 65*da0073e9SAndroid Build Coastguard Worker 66*da0073e9SAndroid Build Coastguard Worker if(NOT MSVC AND NOT "${CMAKE_C_COMPILER_ID}" MATCHES "Clang") 67*da0073e9SAndroid Build Coastguard Worker set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/MapAllocator.cpp PROPERTIES COMPILE_FLAGS "-fno-openmp") 68*da0073e9SAndroid Build Coastguard Worker endif() 69*da0073e9SAndroid Build Coastguard Worker 70*da0073e9SAndroid Build Coastguard Worker file(GLOB_RECURSE all_python "${CMAKE_CURRENT_LIST_DIR}/../torchgen/*.py") 71*da0073e9SAndroid Build Coastguard Worker 72*da0073e9SAndroid Build Coastguard Worker # RowwiseScaled.cu requires sm90a flags 73*da0073e9SAndroid Build Coastguard Worker if(USE_CUDA) 74*da0073e9SAndroid Build Coastguard Worker set(ROWWISE_SCALED_MM_FILE "${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/native/cuda/RowwiseScaledMM.cu") 75*da0073e9SAndroid Build Coastguard Worker 76*da0073e9SAndroid Build Coastguard Worker # Get existing arch flags 77*da0073e9SAndroid Build Coastguard Worker torch_cuda_get_nvcc_gencode_flag(EXISTING_ARCH_FLAGS) 78*da0073e9SAndroid Build Coastguard Worker 79*da0073e9SAndroid Build Coastguard Worker # Check NVCC version and existing arch flags 80*da0073e9SAndroid Build Coastguard Worker if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND 81*da0073e9SAndroid Build Coastguard Worker EXISTING_ARCH_FLAGS MATCHES ".*compute_90.*") 82*da0073e9SAndroid Build Coastguard Worker set_source_files_properties(${ROWWISE_SCALED_MM_FILE} 83*da0073e9SAndroid Build Coastguard Worker PROPERTIES COMPILE_FLAGS "-gencode arch=compute_90a,code=sm_90a") 84*da0073e9SAndroid Build Coastguard Worker endif() 85*da0073e9SAndroid Build Coastguard Worker endif() 86*da0073e9SAndroid Build Coastguard Worker 87*da0073e9SAndroid Build Coastguard Worker set(GEN_ROCM_FLAG) 88*da0073e9SAndroid Build Coastguard Worker if(USE_ROCM) 89*da0073e9SAndroid Build Coastguard Worker set(GEN_ROCM_FLAG --rocm) 90*da0073e9SAndroid Build Coastguard Worker endif() 91*da0073e9SAndroid Build Coastguard Worker 92*da0073e9SAndroid Build Coastguard Worker set(GEN_MPS_FLAG) 93*da0073e9SAndroid Build Coastguard Worker if(USE_MPS) 94*da0073e9SAndroid Build Coastguard Worker set(GEN_MPS_FLAG --mps) 95*da0073e9SAndroid Build Coastguard Worker endif() 96*da0073e9SAndroid Build Coastguard Worker 97*da0073e9SAndroid Build Coastguard Worker set(CUSTOM_BUILD_FLAGS) 98*da0073e9SAndroid Build Coastguard Worker if(INTERN_BUILD_MOBILE) 99*da0073e9SAndroid Build Coastguard Worker if(USE_VULKAN) 100*da0073e9SAndroid Build Coastguard Worker list(APPEND CUSTOM_BUILD_FLAGS --backend_whitelist CPU QuantizedCPU Vulkan) 101*da0073e9SAndroid Build Coastguard Worker else() 102*da0073e9SAndroid Build Coastguard Worker list(APPEND CUSTOM_BUILD_FLAGS --backend_whitelist CPU QuantizedCPU) 103*da0073e9SAndroid Build Coastguard Worker endif() 104*da0073e9SAndroid Build Coastguard Worker endif() 105*da0073e9SAndroid Build Coastguard Worker 106*da0073e9SAndroid Build Coastguard Worker if(SELECTED_OP_LIST) 107*da0073e9SAndroid Build Coastguard Worker if(TRACING_BASED) 108*da0073e9SAndroid Build Coastguard Worker message(STATUS "Running tracing-based selective build given operator list: ${SELECTED_OP_LIST}") 109*da0073e9SAndroid Build Coastguard Worker list(APPEND CUSTOM_BUILD_FLAGS 110*da0073e9SAndroid Build Coastguard Worker --op_selection_yaml_path ${SELECTED_OP_LIST}) 111*da0073e9SAndroid Build Coastguard Worker elseif(NOT STATIC_DISPATCH_BACKEND) 112*da0073e9SAndroid Build Coastguard Worker message(WARNING 113*da0073e9SAndroid Build Coastguard Worker "You have to run tracing-based selective build with dynamic dispatch.\n" 114*da0073e9SAndroid Build Coastguard Worker "Switching to STATIC_DISPATCH_BACKEND=CPU." 115*da0073e9SAndroid Build Coastguard Worker ) 116*da0073e9SAndroid Build Coastguard Worker set(STATIC_DISPATCH_BACKEND CPU) 117*da0073e9SAndroid Build Coastguard Worker endif() 118*da0073e9SAndroid Build Coastguard Worker endif() 119*da0073e9SAndroid Build Coastguard Worker 120*da0073e9SAndroid Build Coastguard Worker if(STATIC_DISPATCH_BACKEND) 121*da0073e9SAndroid Build Coastguard Worker message(STATUS "Custom build with static dispatch backends: ${STATIC_DISPATCH_BACKEND}") 122*da0073e9SAndroid Build Coastguard Worker list(LENGTH STATIC_DISPATCH_BACKEND len) 123*da0073e9SAndroid Build Coastguard Worker list(APPEND CUSTOM_BUILD_FLAGS 124*da0073e9SAndroid Build Coastguard Worker --static_dispatch_backend ${STATIC_DISPATCH_BACKEND}) 125*da0073e9SAndroid Build Coastguard Worker endif() 126*da0073e9SAndroid Build Coastguard Worker 127*da0073e9SAndroid Build Coastguard Worker # Codegen unboxing 128*da0073e9SAndroid Build Coastguard Worker if(USE_LIGHTWEIGHT_DISPATCH) 129*da0073e9SAndroid Build Coastguard Worker file(GLOB_RECURSE all_unboxing_script "${CMAKE_CURRENT_LIST_DIR}/../tools/jit/*.py") 130*da0073e9SAndroid Build Coastguard Worker list(APPEND CUSTOM_BUILD_FLAGS --skip_dispatcher_op_registration) 131*da0073e9SAndroid Build Coastguard Worker set(GEN_UNBOXING_COMMAND 132*da0073e9SAndroid Build Coastguard Worker "${Python_EXECUTABLE}" -m tools.jit.gen_unboxing 133*da0073e9SAndroid Build Coastguard Worker --source-path ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen 134*da0073e9SAndroid Build Coastguard Worker --install_dir ${CMAKE_BINARY_DIR}/aten/src/ATen 135*da0073e9SAndroid Build Coastguard Worker ) 136*da0073e9SAndroid Build Coastguard Worker if(SELECTED_OP_LIST) 137*da0073e9SAndroid Build Coastguard Worker list(APPEND GEN_UNBOXING_COMMAND 138*da0073e9SAndroid Build Coastguard Worker --TEST_ONLY_op_registration_allowlist_yaml_path "${SELECTED_OP_LIST}") 139*da0073e9SAndroid Build Coastguard Worker endif() 140*da0073e9SAndroid Build Coastguard Worker set("GEN_UNBOXING_COMMAND_sources" 141*da0073e9SAndroid Build Coastguard Worker ${GEN_UNBOXING_COMMAND} 142*da0073e9SAndroid Build Coastguard Worker --output-dependencies ${CMAKE_BINARY_DIR}/aten/src/ATen/generated_unboxing_sources.cmake 143*da0073e9SAndroid Build Coastguard Worker ) 144*da0073e9SAndroid Build Coastguard Worker message(STATUS "Generating sources for lightweight dispatch") 145*da0073e9SAndroid Build Coastguard Worker execute_process( 146*da0073e9SAndroid Build Coastguard Worker COMMAND ${GEN_UNBOXING_COMMAND_sources} --dry-run 147*da0073e9SAndroid Build Coastguard Worker RESULT_VARIABLE RETURN_VALUE 148*da0073e9SAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/.. 149*da0073e9SAndroid Build Coastguard Worker ) 150*da0073e9SAndroid Build Coastguard Worker if(NOT RETURN_VALUE EQUAL 0) 151*da0073e9SAndroid Build Coastguard Worker message(FATAL_ERROR "Failed to get generated_unboxing_sources list") 152*da0073e9SAndroid Build Coastguard Worker endif() 153*da0073e9SAndroid Build Coastguard Worker 154*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/generated_unboxing_sources.cmake") 155*da0073e9SAndroid Build Coastguard Worker add_custom_command( 156*da0073e9SAndroid Build Coastguard Worker COMMENT "Generating ATen unboxing sources" 157*da0073e9SAndroid Build Coastguard Worker OUTPUT 158*da0073e9SAndroid Build Coastguard Worker ${generated_unboxing_sources} 159*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/generated_unboxing_sources.cmake 160*da0073e9SAndroid Build Coastguard Worker COMMAND ${GEN_UNBOXING_COMMAND_sources} 161*da0073e9SAndroid Build Coastguard Worker DEPENDS ${all_unboxing_script} ${sources_templates} 162*da0073e9SAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/native/native_functions.yaml 163*da0073e9SAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/native/tags.yaml 164*da0073e9SAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/.. 165*da0073e9SAndroid Build Coastguard Worker ) 166*da0073e9SAndroid Build Coastguard Worker else() # Otherwise do not generate or include sources into build. 167*da0073e9SAndroid Build Coastguard Worker set(generated_unboxing_sources "") 168*da0073e9SAndroid Build Coastguard Worker endif() 169*da0073e9SAndroid Build Coastguard Worker 170*da0073e9SAndroid Build Coastguard Worker set(GEN_PER_OPERATOR_FLAG) 171*da0073e9SAndroid Build Coastguard Worker if(USE_PER_OPERATOR_HEADERS) 172*da0073e9SAndroid Build Coastguard Worker list(APPEND GEN_PER_OPERATOR_FLAG "--per-operator-headers") 173*da0073e9SAndroid Build Coastguard Worker endif() 174*da0073e9SAndroid Build Coastguard Worker 175*da0073e9SAndroid Build Coastguard Worker set(GEN_COMMAND 176*da0073e9SAndroid Build Coastguard Worker "${Python_EXECUTABLE}" -m torchgen.gen 177*da0073e9SAndroid Build Coastguard Worker --source-path ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen 178*da0073e9SAndroid Build Coastguard Worker --install_dir ${CMAKE_BINARY_DIR}/aten/src/ATen 179*da0073e9SAndroid Build Coastguard Worker ${GEN_PER_OPERATOR_FLAG} 180*da0073e9SAndroid Build Coastguard Worker ${GEN_ROCM_FLAG} 181*da0073e9SAndroid Build Coastguard Worker ${GEN_MPS_FLAG} 182*da0073e9SAndroid Build Coastguard Worker ${CUSTOM_BUILD_FLAGS} 183*da0073e9SAndroid Build Coastguard Worker ) 184*da0073e9SAndroid Build Coastguard Worker 185*da0073e9SAndroid Build Coastguard Worker file(GLOB_RECURSE headers_templates "${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/templates/*\.h") 186*da0073e9SAndroid Build Coastguard Worker file(GLOB_RECURSE sources_templates "${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/templates/*\.cpp") 187*da0073e9SAndroid Build Coastguard Worker set(declarations_yaml_templates "") 188*da0073e9SAndroid Build Coastguard Worker 189*da0073e9SAndroid Build Coastguard Worker foreach(gen_type "headers" "sources" "declarations_yaml") 190*da0073e9SAndroid Build Coastguard Worker # The codegen outputs may change dynamically as PyTorch is 191*da0073e9SAndroid Build Coastguard Worker # developed, but add_custom_command only supports dynamic inputs. 192*da0073e9SAndroid Build Coastguard Worker # 193*da0073e9SAndroid Build Coastguard Worker # We work around this by generating a .cmake file which is 194*da0073e9SAndroid Build Coastguard Worker # included below to set the list of output files. If that file 195*da0073e9SAndroid Build Coastguard Worker # ever changes then cmake will be re-run automatically because it 196*da0073e9SAndroid Build Coastguard Worker # was included and so we get fully dynamic outputs. 197*da0073e9SAndroid Build Coastguard Worker 198*da0073e9SAndroid Build Coastguard Worker set("GEN_COMMAND_${gen_type}" 199*da0073e9SAndroid Build Coastguard Worker ${GEN_COMMAND} 200*da0073e9SAndroid Build Coastguard Worker --generate ${gen_type} 201*da0073e9SAndroid Build Coastguard Worker --output-dependencies ${CMAKE_BINARY_DIR}/aten/src/ATen/generated_${gen_type}.cmake 202*da0073e9SAndroid Build Coastguard Worker ) 203*da0073e9SAndroid Build Coastguard Worker 204*da0073e9SAndroid Build Coastguard Worker # Dry run to bootstrap the output variables 205*da0073e9SAndroid Build Coastguard Worker execute_process( 206*da0073e9SAndroid Build Coastguard Worker COMMAND ${GEN_COMMAND_${gen_type}} --dry-run 207*da0073e9SAndroid Build Coastguard Worker RESULT_VARIABLE RETURN_VALUE 208*da0073e9SAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/.. 209*da0073e9SAndroid Build Coastguard Worker ) 210*da0073e9SAndroid Build Coastguard Worker 211*da0073e9SAndroid Build Coastguard Worker if(NOT RETURN_VALUE EQUAL 0) 212*da0073e9SAndroid Build Coastguard Worker message(FATAL_ERROR "Failed to get generated_${gen_type} list") 213*da0073e9SAndroid Build Coastguard Worker endif() 214*da0073e9SAndroid Build Coastguard Worker 215*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/generated_${gen_type}.cmake") 216*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/core_generated_${gen_type}.cmake") 217*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/cpu_vec_generated_${gen_type}.cmake") 218*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/cuda_generated_${gen_type}.cmake") 219*da0073e9SAndroid Build Coastguard Worker include("${CMAKE_BINARY_DIR}/aten/src/ATen/ops_generated_${gen_type}.cmake") 220*da0073e9SAndroid Build Coastguard Worker 221*da0073e9SAndroid Build Coastguard Worker message(STATUS "${gen_type} outputs: ${gen_outputs}") 222*da0073e9SAndroid Build Coastguard Worker 223*da0073e9SAndroid Build Coastguard Worker add_custom_command( 224*da0073e9SAndroid Build Coastguard Worker COMMENT "Generating ATen ${gen_type}" 225*da0073e9SAndroid Build Coastguard Worker OUTPUT 226*da0073e9SAndroid Build Coastguard Worker ${generated_${gen_type}} 227*da0073e9SAndroid Build Coastguard Worker ${cuda_generated_${gen_type}} 228*da0073e9SAndroid Build Coastguard Worker ${core_generated_${gen_type}} 229*da0073e9SAndroid Build Coastguard Worker ${cpu_vec_generated_${gen_type}} 230*da0073e9SAndroid Build Coastguard Worker ${ops_generated_${gen_type}} 231*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/generated_${gen_type}.cmake 232*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/ops_generated_${gen_type}.cmake 233*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/core_generated_${gen_type}.cmake 234*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/cpu_vec_generated_${gen_type}.cmake 235*da0073e9SAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/aten/src/ATen/cuda_generated_${gen_type}.cmake 236*da0073e9SAndroid Build Coastguard Worker COMMAND ${GEN_COMMAND_${gen_type}} 237*da0073e9SAndroid Build Coastguard Worker DEPENDS ${all_python} ${${gen_type}_templates} 238*da0073e9SAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/native/native_functions.yaml 239*da0073e9SAndroid Build Coastguard Worker ${CMAKE_CURRENT_LIST_DIR}/../aten/src/ATen/native/tags.yaml 240*da0073e9SAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/.. 241*da0073e9SAndroid Build Coastguard Worker ) 242*da0073e9SAndroid Build Coastguard Worker endforeach() 243*da0073e9SAndroid Build Coastguard Worker 244*da0073e9SAndroid Build Coastguard Worker # Generated headers used from a CUDA (.cu) file are 245*da0073e9SAndroid Build Coastguard Worker # not tracked correctly in CMake. We make the libATen.so depend explicitly 246*da0073e9SAndroid Build Coastguard Worker # on building the generated ATen files to workaround. 247*da0073e9SAndroid Build Coastguard Worker add_custom_target(ATEN_CPU_FILES_GEN_TARGET DEPENDS 248*da0073e9SAndroid Build Coastguard Worker ${generated_headers} ${core_generated_headers} ${cpu_vec_generated_headers} ${ops_generated_headers} 249*da0073e9SAndroid Build Coastguard Worker ${generated_sources} ${core_generated_sources} ${cpu_vec_generated_sources} ${ops_generated_sources} 250*da0073e9SAndroid Build Coastguard Worker ${generated_declarations_yaml} ${generated_unboxing_sources}) 251*da0073e9SAndroid Build Coastguard Worker add_custom_target(ATEN_CUDA_FILES_GEN_TARGET DEPENDS 252*da0073e9SAndroid Build Coastguard Worker ${cuda_generated_headers} ${cuda_generated_sources}) 253*da0073e9SAndroid Build Coastguard Worker add_library(ATEN_CPU_FILES_GEN_LIB INTERFACE) 254*da0073e9SAndroid Build Coastguard Worker add_library(ATEN_CUDA_FILES_GEN_LIB INTERFACE) 255*da0073e9SAndroid Build Coastguard Worker add_dependencies(ATEN_CPU_FILES_GEN_LIB ATEN_CPU_FILES_GEN_TARGET) 256*da0073e9SAndroid Build Coastguard Worker add_dependencies(ATEN_CUDA_FILES_GEN_LIB ATEN_CUDA_FILES_GEN_TARGET) 257*da0073e9SAndroid Build Coastguard Worker 258*da0073e9SAndroid Build Coastguard Worker if(USE_PER_OPERATOR_HEADERS) 259*da0073e9SAndroid Build Coastguard Worker target_compile_definitions(ATEN_CPU_FILES_GEN_LIB INTERFACE AT_PER_OPERATOR_HEADERS) 260*da0073e9SAndroid Build Coastguard Worker target_compile_definitions(ATEN_CUDA_FILES_GEN_LIB INTERFACE AT_PER_OPERATOR_HEADERS) 261*da0073e9SAndroid Build Coastguard Worker endif() 262*da0073e9SAndroid Build Coastguard Worker 263*da0073e9SAndroid Build Coastguard Worker # Handle source files that need to be compiled multiple times for 264*da0073e9SAndroid Build Coastguard Worker # different vectorization options 265*da0073e9SAndroid Build Coastguard Worker file(GLOB cpu_kernel_cpp_in "${PROJECT_SOURCE_DIR}/aten/src/ATen/native/cpu/*.cpp" "${PROJECT_SOURCE_DIR}/aten/src/ATen/native/quantized/cpu/kernels/*.cpp") 266*da0073e9SAndroid Build Coastguard Worker 267*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_NAMES "DEFAULT") 268*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG}") 269*da0073e9SAndroid Build Coastguard Worker 270*da0073e9SAndroid Build Coastguard Worker if(CXX_AVX512_FOUND) 271*da0073e9SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_AVX512_CPU_DEFINITION") 272*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_NAMES "AVX512") 273*da0073e9SAndroid Build Coastguard Worker if(MSVC) 274*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG}/arch:AVX512") 275*da0073e9SAndroid Build Coastguard Worker else(MSVC) 276*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG} -mavx512f -mavx512bw -mavx512vl -mavx512dq -mfma") 277*da0073e9SAndroid Build Coastguard Worker endif(MSVC) 278*da0073e9SAndroid Build Coastguard Worker endif(CXX_AVX512_FOUND) 279*da0073e9SAndroid Build Coastguard Worker 280*da0073e9SAndroid Build Coastguard Worker if(CXX_AVX2_FOUND) 281*da0073e9SAndroid Build Coastguard Worker set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_AVX2_CPU_DEFINITION") 282*da0073e9SAndroid Build Coastguard Worker 283*da0073e9SAndroid Build Coastguard Worker # Some versions of GCC pessimistically split unaligned load and store 284*da0073e9SAndroid Build Coastguard Worker # instructions when using the default tuning. This is a bad choice on 285*da0073e9SAndroid Build Coastguard Worker # new Intel and AMD processors so we disable it when compiling with AVX2. 286*da0073e9SAndroid Build Coastguard Worker # See https://stackoverflow.com/questions/52626726/why-doesnt-gcc-resolve-mm256-loadu-pd-as-single-vmovupd#tab-top 287*da0073e9SAndroid Build Coastguard Worker check_cxx_compiler_flag("-mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store" COMPILER_SUPPORTS_NO_AVX256_SPLIT) 288*da0073e9SAndroid Build Coastguard Worker if(COMPILER_SUPPORTS_NO_AVX256_SPLIT) 289*da0073e9SAndroid Build Coastguard Worker set(CPU_NO_AVX256_SPLIT_FLAGS "-mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store") 290*da0073e9SAndroid Build Coastguard Worker endif(COMPILER_SUPPORTS_NO_AVX256_SPLIT) 291*da0073e9SAndroid Build Coastguard Worker 292*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_NAMES "AVX2") 293*da0073e9SAndroid Build Coastguard Worker if(DEFINED ENV{ATEN_AVX512_256}) 294*da0073e9SAndroid Build Coastguard Worker if($ENV{ATEN_AVX512_256} MATCHES "TRUE") 295*da0073e9SAndroid Build Coastguard Worker if(CXX_AVX512_FOUND) 296*da0073e9SAndroid Build Coastguard Worker message("-- ATen AVX2 kernels will use 32 ymm registers") 297*da0073e9SAndroid Build Coastguard Worker if(MSVC) 298*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG}/arch:AVX512") 299*da0073e9SAndroid Build Coastguard Worker else(MSVC) 300*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG} -march=native ${CPU_NO_AVX256_SPLIT_FLAGS}") 301*da0073e9SAndroid Build Coastguard Worker endif(MSVC) 302*da0073e9SAndroid Build Coastguard Worker endif(CXX_AVX512_FOUND) 303*da0073e9SAndroid Build Coastguard Worker endif() 304*da0073e9SAndroid Build Coastguard Worker else() 305*da0073e9SAndroid Build Coastguard Worker if(MSVC) 306*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG}/arch:AVX2") 307*da0073e9SAndroid Build Coastguard Worker else(MSVC) 308*da0073e9SAndroid Build Coastguard Worker list(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG} -mavx2 -mfma -mf16c ${CPU_NO_AVX256_SPLIT_FLAGS}") 309*da0073e9SAndroid Build Coastguard Worker endif(MSVC) 310*da0073e9SAndroid Build Coastguard Worker endif() 311*da0073e9SAndroid Build Coastguard Worker endif(CXX_AVX2_FOUND) 312*da0073e9SAndroid Build Coastguard Worker 313*da0073e9SAndroid Build Coastguard Worker if(CXX_VSX_FOUND) 314*da0073e9SAndroid Build Coastguard Worker SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_VSX_CPU_DEFINITION") 315*da0073e9SAndroid Build Coastguard Worker LIST(APPEND CPU_CAPABILITY_NAMES "VSX") 316*da0073e9SAndroid Build Coastguard Worker LIST(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG} ${CXX_VSX_FLAGS}") 317*da0073e9SAndroid Build Coastguard Worker endif(CXX_VSX_FOUND) 318*da0073e9SAndroid Build Coastguard Worker 319*da0073e9SAndroid Build Coastguard Worker if(CXX_ZVECTOR_FOUND) 320*da0073e9SAndroid Build Coastguard Worker SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_ZVECTOR_CPU_DEFINITION") 321*da0073e9SAndroid Build Coastguard Worker LIST(APPEND CPU_CAPABILITY_NAMES "ZVECTOR") 322*da0073e9SAndroid Build Coastguard Worker LIST(APPEND CPU_CAPABILITY_FLAGS "${OPT_FLAG} ${CXX_ZVECTOR_FLAGS}") 323*da0073e9SAndroid Build Coastguard Worker endif(CXX_ZVECTOR_FOUND) 324*da0073e9SAndroid Build Coastguard Worker 325*da0073e9SAndroid Build Coastguard Worker list(LENGTH CPU_CAPABILITY_NAMES NUM_CPU_CAPABILITY_NAMES) 326*da0073e9SAndroid Build Coastguard Worker math(EXPR NUM_CPU_CAPABILITY_NAMES "${NUM_CPU_CAPABILITY_NAMES}-1") 327*da0073e9SAndroid Build Coastguard Worker 328*da0073e9SAndroid Build Coastguard Worker # The sources list might get reordered later based on the capabilites. 329*da0073e9SAndroid Build Coastguard Worker # See NOTE [ Linking AVX and non-AVX files ] 330*da0073e9SAndroid Build Coastguard Worker foreach(i RANGE ${NUM_CPU_CAPABILITY_NAMES}) 331*da0073e9SAndroid Build Coastguard Worker function(process_vec NAME) 332*da0073e9SAndroid Build Coastguard Worker list(GET CPU_CAPABILITY_NAMES ${i} CPU_CAPABILITY) 333*da0073e9SAndroid Build Coastguard Worker set(NEW_IMPL ${CMAKE_BINARY_DIR}/aten/src/ATen/${NAME}.${CPU_CAPABILITY}.cpp) 334*da0073e9SAndroid Build Coastguard Worker configure_file("${PROJECT_SOURCE_DIR}/cmake/IncludeSource.cpp.in" ${NEW_IMPL}) 335*da0073e9SAndroid Build Coastguard Worker set(cpu_kernel_cpp ${NEW_IMPL} ${cpu_kernel_cpp} PARENT_SCOPE) # Create list of copies 336*da0073e9SAndroid Build Coastguard Worker list(GET CPU_CAPABILITY_FLAGS ${i} FLAGS) 337*da0073e9SAndroid Build Coastguard Worker if(MSVC) 338*da0073e9SAndroid Build Coastguard Worker set(EXTRA_FLAGS "/DCPU_CAPABILITY=${CPU_CAPABILITY} /DCPU_CAPABILITY_${CPU_CAPABILITY}") 339*da0073e9SAndroid Build Coastguard Worker else(MSVC) 340*da0073e9SAndroid Build Coastguard Worker set(EXTRA_FLAGS "-DCPU_CAPABILITY=${CPU_CAPABILITY} -DCPU_CAPABILITY_${CPU_CAPABILITY}") 341*da0073e9SAndroid Build Coastguard Worker endif(MSVC) 342*da0073e9SAndroid Build Coastguard Worker # Disable certain warnings for GCC-9.X 343*da0073e9SAndroid Build Coastguard Worker if(CMAKE_COMPILER_IS_GNUCXX) 344*da0073e9SAndroid Build Coastguard Worker if(("${NAME}" STREQUAL "native/cpu/GridSamplerKernel.cpp") AND ("${CPU_CAPABILITY}" STREQUAL "DEFAULT")) 345*da0073e9SAndroid Build Coastguard Worker # See https://github.com/pytorch/pytorch/issues/38855 346*da0073e9SAndroid Build Coastguard Worker set(EXTRA_FLAGS "${EXTRA_FLAGS} -Wno-uninitialized") 347*da0073e9SAndroid Build Coastguard Worker endif() 348*da0073e9SAndroid Build Coastguard Worker if("${NAME}" STREQUAL "native/quantized/cpu/kernels/QuantizedOpKernels.cpp") 349*da0073e9SAndroid Build Coastguard Worker # See https://github.com/pytorch/pytorch/issues/38854 350*da0073e9SAndroid Build Coastguard Worker set(EXTRA_FLAGS "${EXTRA_FLAGS} -Wno-deprecated-copy") 351*da0073e9SAndroid Build Coastguard Worker endif() 352*da0073e9SAndroid Build Coastguard Worker endif() 353*da0073e9SAndroid Build Coastguard Worker set_source_files_properties(${NEW_IMPL} PROPERTIES COMPILE_FLAGS "${FLAGS} ${EXTRA_FLAGS}") 354*da0073e9SAndroid Build Coastguard Worker endfunction() 355*da0073e9SAndroid Build Coastguard Worker foreach(IMPL ${cpu_kernel_cpp_in}) 356*da0073e9SAndroid Build Coastguard Worker file(RELATIVE_PATH NAME "${PROJECT_SOURCE_DIR}/aten/src/ATen/" "${IMPL}") 357*da0073e9SAndroid Build Coastguard Worker process_vec("${NAME}") 358*da0073e9SAndroid Build Coastguard Worker endforeach() 359*da0073e9SAndroid Build Coastguard Worker foreach(IMPL ${cpu_vec_generated_sources}) 360*da0073e9SAndroid Build Coastguard Worker file(RELATIVE_PATH NAME "${CMAKE_BINARY_DIR}/aten/src/ATen/" "${IMPL}") 361*da0073e9SAndroid Build Coastguard Worker process_vec("${NAME}") 362*da0073e9SAndroid Build Coastguard Worker endforeach() 363*da0073e9SAndroid Build Coastguard Worker endforeach() 364*da0073e9SAndroid Build Coastguard Worker list(APPEND ATen_CPU_SRCS ${cpu_kernel_cpp}) 365*da0073e9SAndroid Build Coastguard Workerendif() 366*da0073e9SAndroid Build Coastguard Worker 367*da0073e9SAndroid Build Coastguard Workerfunction(append_filelist name outputvar) 368*da0073e9SAndroid Build Coastguard Worker set(_rootdir "${Torch_SOURCE_DIR}/") 369*da0073e9SAndroid Build Coastguard Worker # configure_file adds its input to the list of CMAKE_RERUN dependencies 370*da0073e9SAndroid Build Coastguard Worker configure_file( 371*da0073e9SAndroid Build Coastguard Worker ${PROJECT_SOURCE_DIR}/build_variables.bzl 372*da0073e9SAndroid Build Coastguard Worker ${PROJECT_BINARY_DIR}/caffe2/build_variables.bzl) 373*da0073e9SAndroid Build Coastguard Worker execute_process( 374*da0073e9SAndroid Build Coastguard Worker COMMAND "${Python_EXECUTABLE}" -c 375*da0073e9SAndroid Build Coastguard Worker "exec(open('${PROJECT_SOURCE_DIR}/build_variables.bzl').read());print(';'.join(['${_rootdir}' + x for x in ${name}]))" 376*da0073e9SAndroid Build Coastguard Worker WORKING_DIRECTORY "${_rootdir}" 377*da0073e9SAndroid Build Coastguard Worker RESULT_VARIABLE _retval 378*da0073e9SAndroid Build Coastguard Worker OUTPUT_VARIABLE _tempvar) 379*da0073e9SAndroid Build Coastguard Worker if(NOT _retval EQUAL 0) 380*da0073e9SAndroid Build Coastguard Worker message(FATAL_ERROR "Failed to fetch filelist ${name} from build_variables.bzl") 381*da0073e9SAndroid Build Coastguard Worker endif() 382*da0073e9SAndroid Build Coastguard Worker string(REPLACE "\n" "" _tempvar "${_tempvar}") 383*da0073e9SAndroid Build Coastguard Worker list(APPEND ${outputvar} ${_tempvar}) 384*da0073e9SAndroid Build Coastguard Worker set(${outputvar} "${${outputvar}}" PARENT_SCOPE) 385*da0073e9SAndroid Build Coastguard Workerendfunction() 386*da0073e9SAndroid Build Coastguard Worker 387*da0073e9SAndroid Build Coastguard Workerset(NUM_CPU_CAPABILITY_NAMES ${NUM_CPU_CAPABILITY_NAMES} PARENT_SCOPE) 388*da0073e9SAndroid Build Coastguard Workerset(CPU_CAPABILITY_FLAGS ${CPU_CAPABILITY_FLAGS} PARENT_SCOPE) 389