xref: /aosp_15_r20/external/executorch/kernels/optimized/lib_defs.bzl (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Workerload("@fbsource//tools/build_defs:default_platform_defs.bzl", "DEVSERVER_PLATFORM_REGEX")
2*523fa7a6SAndroid Build Coastguard Workerload("@fbsource//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
3*523fa7a6SAndroid Build Coastguard Workerload("@fbsource//xplat/executorch/backends/xnnpack/third-party:third_party_libs.bzl", "third_party_dep")
4*523fa7a6SAndroid Build Coastguard Workerload("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "runtime")
5*523fa7a6SAndroid Build Coastguard Workerload(
6*523fa7a6SAndroid Build Coastguard Worker    "@fbsource//xplat/executorch/kernels/portable:op_registration_util.bzl",
7*523fa7a6SAndroid Build Coastguard Worker    "get_compiler_optimization_flags",
8*523fa7a6SAndroid Build Coastguard Worker)
9*523fa7a6SAndroid Build Coastguard Worker
10*523fa7a6SAndroid Build Coastguard Worker# Because vec exists as a collection of header files, compile and preprocessor
11*523fa7a6SAndroid Build Coastguard Worker# flags applied to the vec target do not have any effect, since no compilation
12*523fa7a6SAndroid Build Coastguard Worker# actually occurs for the target.
13*523fa7a6SAndroid Build Coastguard Worker#
14*523fa7a6SAndroid Build Coastguard Worker# Targets using the vec library must therefore call the get_vec_*_flags
15*523fa7a6SAndroid Build Coastguard Worker# functions in order to declare the required compiler flags needed in order to
16*523fa7a6SAndroid Build Coastguard Worker# access CPU vector intrinsics.
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Workerdef get_vec_preprocessor_flags():
19*523fa7a6SAndroid Build Coastguard Worker    if not runtime.is_oss:
20*523fa7a6SAndroid Build Coastguard Worker        # various ovr_configs are not available in oss
21*523fa7a6SAndroid Build Coastguard Worker        preprocessor_flags = select({
22*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:linux-x86_64": [
23*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_ARM_VEC256_WITH_SLEEF",
24*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
25*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:iphoneos-arm64": [
26*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_ARM_VEC256_WITH_SLEEF",
27*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
28*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-arm64": [
29*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_ARM_VEC256_WITH_SLEEF",
30*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
31*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:android-arm64": [
32*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_ARM_VEC256_WITH_SLEEF",
33*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
34*523fa7a6SAndroid Build Coastguard Worker            "DEFAULT": [],
35*523fa7a6SAndroid Build Coastguard Worker        })
36*523fa7a6SAndroid Build Coastguard Worker        return preprocessor_flags
37*523fa7a6SAndroid Build Coastguard Worker    return []
38*523fa7a6SAndroid Build Coastguard Worker
39*523fa7a6SAndroid Build Coastguard Workerdef get_vec_deps():
40*523fa7a6SAndroid Build Coastguard Worker    if not runtime.is_oss:
41*523fa7a6SAndroid Build Coastguard Worker        # various ovr_configs are not available in oss
42*523fa7a6SAndroid Build Coastguard Worker        deps = select({
43*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:iphoneos-arm64": [
44*523fa7a6SAndroid Build Coastguard Worker                "fbsource//third-party/sleef:sleef_arm",
45*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
46*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-arm64": [
47*523fa7a6SAndroid Build Coastguard Worker                "fbsource//third-party/sleef:sleef_arm",
48*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
49*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:android-arm64": [
50*523fa7a6SAndroid Build Coastguard Worker                "fbsource//third-party/sleef:sleef_arm",
51*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
52*523fa7a6SAndroid Build Coastguard Worker            "DEFAULT": [],
53*523fa7a6SAndroid Build Coastguard Worker        })
54*523fa7a6SAndroid Build Coastguard Worker        return deps
55*523fa7a6SAndroid Build Coastguard Worker    return []
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Workerdef get_vec_cxx_preprocessor_flags():
58*523fa7a6SAndroid Build Coastguard Worker    preprocessor_flags = [
59*523fa7a6SAndroid Build Coastguard Worker        (
60*523fa7a6SAndroid Build Coastguard Worker            DEVSERVER_PLATFORM_REGEX,
61*523fa7a6SAndroid Build Coastguard Worker            [
62*523fa7a6SAndroid Build Coastguard Worker                "-DCPU_CAPABILITY_AVX2",
63*523fa7a6SAndroid Build Coastguard Worker            ],
64*523fa7a6SAndroid Build Coastguard Worker        ),
65*523fa7a6SAndroid Build Coastguard Worker    ]
66*523fa7a6SAndroid Build Coastguard Worker    return preprocessor_flags
67*523fa7a6SAndroid Build Coastguard Worker
68*523fa7a6SAndroid Build Coastguard Workerdef get_vec_fbcode_preprocessor_flags():
69*523fa7a6SAndroid Build Coastguard Worker    preprocessor_flags = [
70*523fa7a6SAndroid Build Coastguard Worker        "-DCPU_CAPABILITY_AVX2",
71*523fa7a6SAndroid Build Coastguard Worker    ]
72*523fa7a6SAndroid Build Coastguard Worker    return preprocessor_flags
73*523fa7a6SAndroid Build Coastguard Worker
74*523fa7a6SAndroid Build Coastguard Workerdef get_apple_framework_deps_kwargs(is_fbcode):
75*523fa7a6SAndroid Build Coastguard Worker    # various ovr_configs are not available in oss
76*523fa7a6SAndroid Build Coastguard Worker    if not runtime.is_oss and not is_fbcode:
77*523fa7a6SAndroid Build Coastguard Worker        # Jump through few hoops since 'frameworks' is not a valid kwarg
78*523fa7a6SAndroid Build Coastguard Worker        # for some buck rules
79*523fa7a6SAndroid Build Coastguard Worker        frameworks = {'frameworks': select({
80*523fa7a6SAndroid Build Coastguard Worker            "DEFAULT": [],
81*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:iphoneos": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"],
82*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-arm64": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"],
83*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-x86_64": ["$SDKROOT/System/Library/Frameworks/Accelerate.framework"],
84*523fa7a6SAndroid Build Coastguard Worker        })}
85*523fa7a6SAndroid Build Coastguard Worker        return frameworks
86*523fa7a6SAndroid Build Coastguard Worker    return {'fbobjc_frameworks': ["Accelerate"]}
87*523fa7a6SAndroid Build Coastguard Worker
88*523fa7a6SAndroid Build Coastguard Workerdef get_preprocessor_flags():
89*523fa7a6SAndroid Build Coastguard Worker    # various ovr_configs are not available in oss
90*523fa7a6SAndroid Build Coastguard Worker    preprocessor_flags = select({
91*523fa7a6SAndroid Build Coastguard Worker      ":linux-x86_64": [
92*523fa7a6SAndroid Build Coastguard Worker          "-DET_BUILD_WITH_BLAS",
93*523fa7a6SAndroid Build Coastguard Worker      ] if not runtime.is_oss else [],
94*523fa7a6SAndroid Build Coastguard Worker      "DEFAULT": [],
95*523fa7a6SAndroid Build Coastguard Worker    })
96*523fa7a6SAndroid Build Coastguard Worker
97*523fa7a6SAndroid Build Coastguard Worker    if not runtime.is_oss:
98*523fa7a6SAndroid Build Coastguard Worker        # various ovr_configs are not available in oss
99*523fa7a6SAndroid Build Coastguard Worker        additional_preprocessor_flags = select({
100*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:iphoneos": [
101*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_WITH_BLAS",
102*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_FOR_APPLE",
103*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
104*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-arm64": [
105*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_WITH_BLAS",
106*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_FOR_APPLE",
107*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
108*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os:macos-x86_64": [
109*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_WITH_BLAS",
110*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_FOR_APPLE",
111*523fa7a6SAndroid Build Coastguard Worker            ] if not runtime.is_oss else [],
112*523fa7a6SAndroid Build Coastguard Worker            "DEFAULT": [],
113*523fa7a6SAndroid Build Coastguard Worker        })
114*523fa7a6SAndroid Build Coastguard Worker        preprocessor_flags = preprocessor_flags + additional_preprocessor_flags
115*523fa7a6SAndroid Build Coastguard Worker    return preprocessor_flags
116*523fa7a6SAndroid Build Coastguard Worker
117*523fa7a6SAndroid Build Coastguard Worker
118*523fa7a6SAndroid Build Coastguard Worker# Currently, having a dependency on fbsource//third-party/sleef:sleef may cause
119*523fa7a6SAndroid Build Coastguard Worker# duplicate symbol errors when linking fbcode targets in opt mode that also
120*523fa7a6SAndroid Build Coastguard Worker# depend on ATen. This is because ATen accesses sleef via the third-party folder
121*523fa7a6SAndroid Build Coastguard Worker# in caffe2 (caffe2/third-party//sleef:sleef).
122*523fa7a6SAndroid Build Coastguard Worker# TODO(ssjia): Enable -DCPU_CAPABILITY_AVX2 in fbcode, which requires sleef.
123*523fa7a6SAndroid Build Coastguard Workerdef define_libs(is_fbcode=False):
124*523fa7a6SAndroid Build Coastguard Worker    runtime.cxx_library(
125*523fa7a6SAndroid Build Coastguard Worker        name = "libvec",
126*523fa7a6SAndroid Build Coastguard Worker        srcs = [],
127*523fa7a6SAndroid Build Coastguard Worker        exported_headers = native.glob([
128*523fa7a6SAndroid Build Coastguard Worker            "vec/**/*.h",
129*523fa7a6SAndroid Build Coastguard Worker        ]),
130*523fa7a6SAndroid Build Coastguard Worker        header_namespace = "executorch/kernels/optimized",
131*523fa7a6SAndroid Build Coastguard Worker        visibility = [
132*523fa7a6SAndroid Build Coastguard Worker            "//executorch/...",
133*523fa7a6SAndroid Build Coastguard Worker            "@EXECUTORCH_CLIENTS",
134*523fa7a6SAndroid Build Coastguard Worker        ],
135*523fa7a6SAndroid Build Coastguard Worker        cxx_platform_deps = select({
136*523fa7a6SAndroid Build Coastguard Worker            "DEFAULT": [
137*523fa7a6SAndroid Build Coastguard Worker                (
138*523fa7a6SAndroid Build Coastguard Worker                    DEVSERVER_PLATFORM_REGEX,
139*523fa7a6SAndroid Build Coastguard Worker                    [
140*523fa7a6SAndroid Build Coastguard Worker                        "fbsource//third-party/sleef:sleef",
141*523fa7a6SAndroid Build Coastguard Worker                    ],
142*523fa7a6SAndroid Build Coastguard Worker                ),
143*523fa7a6SAndroid Build Coastguard Worker            ],
144*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//cpu:arm64": [
145*523fa7a6SAndroid Build Coastguard Worker                (
146*523fa7a6SAndroid Build Coastguard Worker                    DEVSERVER_PLATFORM_REGEX,
147*523fa7a6SAndroid Build Coastguard Worker                    [
148*523fa7a6SAndroid Build Coastguard Worker                        "fbsource//third-party/sleef:sleef_arm",
149*523fa7a6SAndroid Build Coastguard Worker                    ],
150*523fa7a6SAndroid Build Coastguard Worker                ),
151*523fa7a6SAndroid Build Coastguard Worker            ],
152*523fa7a6SAndroid Build Coastguard Worker        }),
153*523fa7a6SAndroid Build Coastguard Worker        fbandroid_platform_deps = [
154*523fa7a6SAndroid Build Coastguard Worker            (
155*523fa7a6SAndroid Build Coastguard Worker                "^android-arm64.*$",
156*523fa7a6SAndroid Build Coastguard Worker                [
157*523fa7a6SAndroid Build Coastguard Worker                    "fbsource//third-party/sleef:sleef_arm",
158*523fa7a6SAndroid Build Coastguard Worker                ],
159*523fa7a6SAndroid Build Coastguard Worker            ),
160*523fa7a6SAndroid Build Coastguard Worker        ],
161*523fa7a6SAndroid Build Coastguard Worker    )
162*523fa7a6SAndroid Build Coastguard Worker
163*523fa7a6SAndroid Build Coastguard Worker    runtime.cxx_library(
164*523fa7a6SAndroid Build Coastguard Worker        name = "libutils",
165*523fa7a6SAndroid Build Coastguard Worker        srcs = [],
166*523fa7a6SAndroid Build Coastguard Worker        exported_headers = native.glob([
167*523fa7a6SAndroid Build Coastguard Worker            "utils/**/*.h",
168*523fa7a6SAndroid Build Coastguard Worker        ]),
169*523fa7a6SAndroid Build Coastguard Worker        header_namespace = "executorch/kernels/optimized",
170*523fa7a6SAndroid Build Coastguard Worker        visibility = [
171*523fa7a6SAndroid Build Coastguard Worker            "//executorch/...",
172*523fa7a6SAndroid Build Coastguard Worker            "@EXECUTORCH_CLIENTS",
173*523fa7a6SAndroid Build Coastguard Worker        ],
174*523fa7a6SAndroid Build Coastguard Worker        exported_deps = [
175*523fa7a6SAndroid Build Coastguard Worker            # Needed to access the ET_INLINE macro
176*523fa7a6SAndroid Build Coastguard Worker            "//executorch/runtime/platform:compiler",
177*523fa7a6SAndroid Build Coastguard Worker        ],
178*523fa7a6SAndroid Build Coastguard Worker    )
179*523fa7a6SAndroid Build Coastguard Worker
180*523fa7a6SAndroid Build Coastguard Worker    # OSS doesn't have ovr_config//os:linux-x86_64
181*523fa7a6SAndroid Build Coastguard Worker    fb_native.config_setting(
182*523fa7a6SAndroid Build Coastguard Worker        name = "linux-x86_64",
183*523fa7a6SAndroid Build Coastguard Worker        constraint_values = [
184*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//os/constraints:linux",
185*523fa7a6SAndroid Build Coastguard Worker            "ovr_config//cpu/constraints:x86_64",
186*523fa7a6SAndroid Build Coastguard Worker        ],
187*523fa7a6SAndroid Build Coastguard Worker    )
188*523fa7a6SAndroid Build Coastguard Worker
189*523fa7a6SAndroid Build Coastguard Worker    LIBBLAS_DEPS = [third_party_dep("cpuinfo")]
190*523fa7a6SAndroid Build Coastguard Worker
191*523fa7a6SAndroid Build Coastguard Worker    for libblas_name, mkl_dep in [("libblas", "fbsource//third-party/mkl:mkl_lp64_omp"), ("libblas_mkl_noomp", "fbsource//third-party/mkl:mkl")]:
192*523fa7a6SAndroid Build Coastguard Worker        runtime.cxx_library(
193*523fa7a6SAndroid Build Coastguard Worker            name = libblas_name,
194*523fa7a6SAndroid Build Coastguard Worker            srcs = native.glob([
195*523fa7a6SAndroid Build Coastguard Worker                "blas/**/*.cpp",
196*523fa7a6SAndroid Build Coastguard Worker            ]),
197*523fa7a6SAndroid Build Coastguard Worker            exported_headers = native.glob([
198*523fa7a6SAndroid Build Coastguard Worker                "blas/**/*.h",
199*523fa7a6SAndroid Build Coastguard Worker            ]),
200*523fa7a6SAndroid Build Coastguard Worker            compiler_flags = get_compiler_optimization_flags(),
201*523fa7a6SAndroid Build Coastguard Worker            header_namespace = "executorch/kernels/optimized",
202*523fa7a6SAndroid Build Coastguard Worker            visibility = [
203*523fa7a6SAndroid Build Coastguard Worker                "//executorch/...",
204*523fa7a6SAndroid Build Coastguard Worker                "@EXECUTORCH_CLIENTS",
205*523fa7a6SAndroid Build Coastguard Worker            ],
206*523fa7a6SAndroid Build Coastguard Worker            preprocessor_flags = get_preprocessor_flags(),
207*523fa7a6SAndroid Build Coastguard Worker            fbandroid_platform_preprocessor_flags = [
208*523fa7a6SAndroid Build Coastguard Worker                (
209*523fa7a6SAndroid Build Coastguard Worker                    "^android-arm64.*$",
210*523fa7a6SAndroid Build Coastguard Worker                    [
211*523fa7a6SAndroid Build Coastguard Worker                        "-DET_BUILD_WITH_BLAS",
212*523fa7a6SAndroid Build Coastguard Worker                    ],
213*523fa7a6SAndroid Build Coastguard Worker                ),
214*523fa7a6SAndroid Build Coastguard Worker            ],
215*523fa7a6SAndroid Build Coastguard Worker            fbandroid_platform_deps = [
216*523fa7a6SAndroid Build Coastguard Worker                (
217*523fa7a6SAndroid Build Coastguard Worker                    "^android-arm64.*$",
218*523fa7a6SAndroid Build Coastguard Worker                    [
219*523fa7a6SAndroid Build Coastguard Worker                        "fbsource//arvr/third-party/eigen:eigen3_blas",
220*523fa7a6SAndroid Build Coastguard Worker                    ],
221*523fa7a6SAndroid Build Coastguard Worker                ),
222*523fa7a6SAndroid Build Coastguard Worker            ],
223*523fa7a6SAndroid Build Coastguard Worker            fbobjc_compiler_flags = [
224*523fa7a6SAndroid Build Coastguard Worker                "-march=armv8+bf16",
225*523fa7a6SAndroid Build Coastguard Worker            ],
226*523fa7a6SAndroid Build Coastguard Worker            fbobjc_exported_preprocessor_flags = [
227*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_WITH_BLAS",
228*523fa7a6SAndroid Build Coastguard Worker                "-DET_BUILD_FOR_APPLE",
229*523fa7a6SAndroid Build Coastguard Worker            ],
230*523fa7a6SAndroid Build Coastguard Worker            deps = select({
231*523fa7a6SAndroid Build Coastguard Worker                ":linux-x86_64": [mkl_dep] if not runtime.is_oss else [],
232*523fa7a6SAndroid Build Coastguard Worker                "DEFAULT": [],
233*523fa7a6SAndroid Build Coastguard Worker            }) + LIBBLAS_DEPS,
234*523fa7a6SAndroid Build Coastguard Worker            exported_deps = [
235*523fa7a6SAndroid Build Coastguard Worker                "//executorch/extension/parallel:thread_parallel",
236*523fa7a6SAndroid Build Coastguard Worker                "//executorch/kernels/optimized:libutils",
237*523fa7a6SAndroid Build Coastguard Worker                "//executorch/runtime/core/exec_aten:lib",
238*523fa7a6SAndroid Build Coastguard Worker            ],
239*523fa7a6SAndroid Build Coastguard Worker            **get_apple_framework_deps_kwargs(is_fbcode),
240*523fa7a6SAndroid Build Coastguard Worker        )
241