xref: /aosp_15_r20/external/pytorch/cmake/Codegen.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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