| if(INTERN_BUILD_MOBILE) | |
| list(APPEND Caffe2_CPU_SRCS | |
| "${CMAKE_CURRENT_SOURCE_DIR}/embedding_lookup_idx.cc" | |
| ) | |
| set(Caffe2_CPU_SRCS ${Caffe2_CPU_SRCS} PARENT_SCOPE) | |
| return() | |
| endif() | |
| # ---[ CPU files. | |
| file(GLOB common_srcs *.cc) | |
| file(GLOB avx_srcs *_avx.cc) | |
| file(GLOB avx2_srcs *_avx2.cc) | |
| file(GLOB avx512_srcs *_avx512.cc) | |
| # exclude avx, avx2, and avx512 srcs from common_srcs | |
| exclude(common_srcs "${common_srcs}" ${avx_srcs}) | |
| exclude(common_srcs "${common_srcs}" ${avx2_srcs}) | |
| exclude(common_srcs "${common_srcs}" ${avx512_srcs}) | |
| # We will always build common srcs. | |
| set(Caffe2_CPU_SRCS ${Caffe2_CPU_SRCS} ${common_srcs}) | |
| # We will only build the perf kernel files if the compiler supports avx2 | |
| # extensions. | |
| if(CXX_AVX2_FOUND) | |
| add_library(Caffe2_perfkernels_avx STATIC ${avx_srcs}) | |
| add_library(Caffe2_perfkernels_avx2 STATIC ${avx2_srcs}) | |
| add_dependencies(Caffe2_perfkernels_avx Caffe2_PROTO) | |
| add_dependencies(Caffe2_perfkernels_avx2 Caffe2_PROTO) | |
| target_link_libraries(Caffe2_perfkernels_avx PRIVATE c10) | |
| target_link_libraries(Caffe2_perfkernels_avx2 PRIVATE c10) | |
| install(TARGETS Caffe2_perfkernels_avx Caffe2_perfkernels_avx2 | |
| ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") | |
| if(MSVC AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | |
| target_compile_options(Caffe2_perfkernels_avx | |
| PRIVATE "/arch:AVX" | |
| PRIVATE "/D__F16C__") | |
| target_compile_options(Caffe2_perfkernels_avx2 | |
| PRIVATE "/arch:AVX2" | |
| PRIVATE "/D__FMA__" | |
| PRIVATE "/D__F16C__") | |
| else() | |
| target_compile_options(Caffe2_perfkernels_avx | |
| PRIVATE "-mavx" | |
| PRIVATE "-mf16c") | |
| target_compile_options(Caffe2_perfkernels_avx2 | |
| PRIVATE "-mavx2" | |
| PRIVATE "-mfma" | |
| PRIVATE "-mavx" | |
| PRIVATE "-mf16c") | |
| endif() | |
| caffe2_interface_library( | |
| Caffe2_perfkernels_avx Caffe2_perfkernels_avx_interface) | |
| caffe2_interface_library( | |
| Caffe2_perfkernels_avx2 Caffe2_perfkernels_avx2_interface) | |
| list(APPEND | |
| Caffe2_DEPENDENCY_WHOLE_LINK_LIBS | |
| "Caffe2_perfkernels_avx_interface") | |
| list(APPEND | |
| Caffe2_DEPENDENCY_WHOLE_LINK_LIBS | |
| "Caffe2_perfkernels_avx2_interface") | |
| if(CAFFE2_COMPILER_SUPPORTS_AVX512_EXTENSIONS) | |
| add_library(Caffe2_perfkernels_avx512 STATIC ${avx512_srcs}) | |
| add_dependencies(Caffe2_perfkernels_avx512 Caffe2_PROTO) | |
| target_link_libraries(Caffe2_perfkernels_avx512 PRIVATE c10) | |
| install(TARGETS Caffe2_perfkernels_avx512 | |
| ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") | |
| if(MSVC AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | |
| target_compile_options(Caffe2_perfkernels_avx512 | |
| PRIVATE "/D__AVX512F__" | |
| PRIVATE "/D__AVX512DQ__" | |
| PRIVATE "/D__AVX512VL__" | |
| PRIVATE "/arch:AVX2" | |
| PRIVATE "/D__FMA__" | |
| PRIVATE "/D__F16C__") | |
| else() | |
| target_compile_options(Caffe2_perfkernels_avx512 | |
| PRIVATE "-mavx512f" | |
| PRIVATE "-mavx512dq" | |
| PRIVATE "-mavx512vl" | |
| PRIVATE "-mavx2" | |
| PRIVATE "-mfma" | |
| PRIVATE "-mavx" | |
| PRIVATE "-mf16c") | |
| endif() | |
| caffe2_interface_library( | |
| Caffe2_perfkernels_avx512 Caffe2_perfkernels_avx512_interface) | |
| list(APPEND | |
| Caffe2_DEPENDENCY_WHOLE_LINK_LIBS | |
| "Caffe2_perfkernels_avx512_interface") | |
| endif() | |
| endif() | |
| # TODO(jiayq): currently, we only implement the very base files for the | |
| # perfkernels. This is because to implement avx and avx2 files, we actually | |
| # need to set up different compilation units and this is a bit more involving | |
| # in terms of CMakefile changes. This is a stop-gap solution until we get a | |
| # more proper implementation. | |
| set(Caffe2_CPU_SRCS ${Caffe2_CPU_SRCS} PARENT_SCOPE) | |
| set(Caffe2_DEPENDENCY_WHOLE_LINK_LIBS | |
| ${Caffe2_DEPENDENCY_WHOLE_LINK_LIBS} | |
| PARENT_SCOPE) |