load("@fbsource//tools/build_defs:default_platform_defs.bzl", "DEVSERVER_PLATFORM_REGEX") load("@fbsource//tools/build_defs:fb_native_wrapper.bzl", "fb_native") load("@fbsource//xplat/executorch/backends/xnnpack/third-party:third_party_libs.bzl", "third_party_dep") load("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "runtime") load( "@fbsource//xplat/executorch/kernels/portable:op_registration_util.bzl", "get_compiler_optimization_flags", ) # Because vec exists as a collection of header files, compile and preprocessor # flags applied to the vec target do not have any effect, since no compilation # actually occurs for the target. # # Targets using the vec library must therefore call the get_vec_*_flags # functions in order to declare the required compiler flags needed in order to # access CPU vector intrinsics. def get_vec_preprocessor_flags(): if not runtime.is_oss: # various ovr_configs are not available in oss preprocessor_flags = select({ "ovr_config//os:linux-x86_64": [ "-DET_BUILD_ARM_VEC256_WITH_SLEEF", ] if not runtime.is_oss else [], "ovr_config//os:iphoneos-arm64": [ "-DET_BUILD_ARM_VEC256_WITH_SLEEF", ] if not runtime.is_oss else [], "ovr_config//os:macos-arm64": [ "-DET_BUILD_ARM_VEC256_WITH_SLEEF", ] if not runtime.is_oss else [], "ovr_config//os:android-arm64": [ "-DET_BUILD_ARM_VEC256_WITH_SLEEF", ] if not runtime.is_oss else [], "DEFAULT": [], }) return preprocessor_flags return [] def get_vec_deps(): if not runtime.is_oss: # various ovr_configs are not available in oss deps = select({ "ovr_config//os:iphoneos-arm64": [ "fbsource//third-party/sleef:sleef_arm", ] if not runtime.is_oss else [], "ovr_config//os:macos-arm64": [ "fbsource//third-party/sleef:sleef_arm", ] if not runtime.is_oss else [], "ovr_config//os:android-arm64": [ "fbsource//third-party/sleef:sleef_arm", ] if not runtime.is_oss else [], "DEFAULT": [], }) return deps return [] def get_vec_cxx_preprocessor_flags(): preprocessor_flags = [ ( DEVSERVER_PLATFORM_REGEX, [ "-DCPU_CAPABILITY_AVX2", ], ), ] return preprocessor_flags def get_vec_fbcode_preprocessor_flags(): preprocessor_flags = [ "-DCPU_CAPABILITY_AVX2", ] return preprocessor_flags def get_apple_framework_deps_kwargs(is_fbcode): # various ovr_configs are not available in oss if not runtime.is_oss and not is_fbcode: # Jump through few hoops since 'frameworks' is not a valid kwarg # for some buck rules frameworks = {'frameworks': select({ "DEFAULT": [], "ovr_config//os:iphoneos": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"], "ovr_config//os:macos-arm64": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"], "ovr_config//os:macos-x86_64": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"], })} return frameworks return {'fbobjc_frameworks': ["Accelerate"]} def get_preprocessor_flags(): # various ovr_configs are not available in oss preprocessor_flags = select({ ":linux-x86_64": [ "-DET_BUILD_WITH_BLAS", ] if not runtime.is_oss else [], "DEFAULT": [], }) if not runtime.is_oss: # various ovr_configs are not available in oss additional_preprocessor_flags = select({ "ovr_config//os:iphoneos": [ "-DET_BUILD_WITH_BLAS", "-DET_BUILD_FOR_APPLE", ] if not runtime.is_oss else [], "ovr_config//os:macos-arm64": [ "-DET_BUILD_WITH_BLAS", "-DET_BUILD_FOR_APPLE", ] if not runtime.is_oss else [], "ovr_config//os:macos-x86_64": [ "-DET_BUILD_WITH_BLAS", "-DET_BUILD_FOR_APPLE", ] if not runtime.is_oss else [], "DEFAULT": [], }) preprocessor_flags = preprocessor_flags + additional_preprocessor_flags return preprocessor_flags # Currently, having a dependency on fbsource//third-party/sleef:sleef may cause # duplicate symbol errors when linking fbcode targets in opt mode that also # depend on ATen. This is because ATen accesses sleef via the third-party folder # in caffe2 (caffe2/third-party//sleef:sleef). # TODO(ssjia): Enable -DCPU_CAPABILITY_AVX2 in fbcode, which requires sleef. def define_libs(is_fbcode=False): runtime.cxx_library( name = "libvec", srcs = [], exported_headers = native.glob([ "vec/**/*.h", ]), header_namespace = "executorch/kernels/optimized", visibility = [ "//executorch/...", "@EXECUTORCH_CLIENTS", ], cxx_platform_deps = select({ "DEFAULT": [ ( DEVSERVER_PLATFORM_REGEX, [ "fbsource//third-party/sleef:sleef", ], ), ], "ovr_config//cpu:arm64": [ ( DEVSERVER_PLATFORM_REGEX, [ "fbsource//third-party/sleef:sleef_arm", ], ), ], }), fbandroid_platform_deps = [ ( "^android-arm64.*$", [ "fbsource//third-party/sleef:sleef_arm", ], ), ], ) runtime.cxx_library( name = "libutils", srcs = [], exported_headers = native.glob([ "utils/**/*.h", ]), header_namespace = "executorch/kernels/optimized", visibility = [ "//executorch/...", "@EXECUTORCH_CLIENTS", ], exported_deps = [ # Needed to access the ET_INLINE macro "//executorch/runtime/platform:compiler", ], ) # OSS doesn't have ovr_config//os:linux-x86_64 fb_native.config_setting( name = "linux-x86_64", constraint_values = [ "ovr_config//os/constraints:linux", "ovr_config//cpu/constraints:x86_64", ], ) LIBBLAS_DEPS = [third_party_dep("cpuinfo")] for libblas_name, mkl_dep in [("libblas", "fbsource//third-party/mkl:mkl_lp64_omp"), ("libblas_mkl_noomp", "fbsource//third-party/mkl:mkl")]: runtime.cxx_library( name = libblas_name, srcs = native.glob([ "blas/**/*.cpp", ]), exported_headers = native.glob([ "blas/**/*.h", ]), compiler_flags = get_compiler_optimization_flags(), header_namespace = "executorch/kernels/optimized", visibility = [ "//executorch/...", "@EXECUTORCH_CLIENTS", ], preprocessor_flags = get_preprocessor_flags(), fbandroid_platform_preprocessor_flags = [ ( "^android-arm64.*$", [ "-DET_BUILD_WITH_BLAS", ], ), ], fbandroid_platform_deps = [ ( "^android-arm64.*$", [ "fbsource//arvr/third-party/eigen:eigen3_blas", ], ), ], fbobjc_compiler_flags = [ "-march=armv8+bf16", ], fbobjc_exported_preprocessor_flags = [ "-DET_BUILD_WITH_BLAS", "-DET_BUILD_FOR_APPLE", ], deps = select({ ":linux-x86_64": [mkl_dep] if not runtime.is_oss else [], "DEFAULT": [], }) + LIBBLAS_DEPS, exported_deps = [ "//executorch/extension/parallel:thread_parallel", "//executorch/kernels/optimized:libutils", "//executorch/runtime/core/exec_aten:lib", ], **get_apple_framework_deps_kwargs(is_fbcode), )