1load("@fbsource//xplat/executorch/build:runtime_wrapper.bzl", "is_xplat", "runtime") 2load("@fbsource//xplat/executorch/build:selects.bzl", "selects") 3 4def get_compiler_optimization_flags(): 5 # App size regressons requires this to be baktraced until I have a better solution 6 return [] 7 8def op_target(name, deps = [], android_deps = [], _allow_third_party_deps = False, _aten_mode_deps = []): 9 """Registers an implementation of an operator overload group. 10 11 An operator overload group is a set of operator overloads with a common 12 operator name. That common operator name should be the base name of this 13 target. 14 15 E.g., the "add" operator overload group, named "op_add" in this target, 16 might implement: 17 - add.Tensor 18 - add_.Tensor 19 - add.out 20 - add.Scalar 21 22 If an op target would like to share a header/sources with a different op 23 target (e.g., helpers/utilities), it should declare a separate cxx_library 24 and add it as a dep. 25 26 Args: 27 name: The name of the operator overload group; e.g., 28 "op_add". This directory must contain a source file named 29 "<name>.cpp"; e.g., "op_add.cpp". 30 deps: Optional extra deps to add to the cxx_library(). Note: 31 - op targets may not depend on other op targets, to keep the 32 dependencies manageable. If two op targets would like to share 33 code, define a separate runtime.cxx_library that they both depend 34 on. 35 - op targets may not depend on targets outside of `//executorch`. 36 This library is intended to be portable, open-sourceable, and 37 self-contained. 38 android_deps: Optional extra deps to add to fb_xplat_cxx_library() 39 under fbandroid_platform_deps when building for Android, which may 40 be outside of //executorch. Note that these will be ignored when 41 building for fbcode. 42 _allow_third_party_deps: If True, the op is allowed to depend on 43 third-party deps outside of //executorch. Should only be used by 44 targets under //executorch/kernels/optimized, which can benefit 45 from third-party optimization libraries. 46 _aten_mode_deps: List of deps to add to the cxx_library() when building 47 for ATen mode. 48 """ 49 50 # Note that this doesn't actually define the target, but helps register 51 # it in a table that's used to define the target. 52 return { 53 "android_deps": android_deps, 54 "deps": deps, 55 "name": name, 56 "_allow_third_party_deps": _allow_third_party_deps, 57 "_aten_mode_deps": _aten_mode_deps, 58 } 59 60def _enforce_deps(deps, name, allow_third_party_deps): 61 """Fails if any of the deps are not allowed. 62 63 Args: 64 deps: A list of build target strings. 65 name: The name of the target; e.g., "op_add" 66 name: The name of the target with the provided deps. 67 allow_third_party_deps: If True, allows external deps on third-party 68 targets. 69 """ 70 for dep in deps: 71 if dep.startswith(":op_"): 72 # op targets may not depend on other op targets, to keep the 73 # dependencies manageable. If two op targets would like to share 74 # code, define a separate runtime.cxx_library that they both depend 75 # on. 76 fail("op_target {} may not depend on other op_target {}".format( 77 name, 78 dep, 79 )) 80 if not (dep.startswith("//executorch") or dep.startswith(":")): 81 if allow_third_party_deps and ("/third-party/" in dep): 82 # Allowed exception. 83 pass 84 else: 85 # op targets may not depend on targets outside of 86 # `//executorch`. This library is intended to be portable, 87 # open-sourceable, and self-contained. 88 fail( 89 "op_target {} may not depend on code outside of //executorch: {}".format( 90 name, 91 dep, 92 ), 93 ) 94 95def define_op_library(name, deps, android_deps, aten_target, _allow_third_party_deps = False): 96 """Defines a cxx_library target for the named operator overload group. 97 98 Args: 99 name: The name of the target; e.g., "op_add" 100 deps: List of deps for the target. 101 android_deps: List of fbandroid_platform_deps for the target. 102 aten_target: If True, define a "<name>_aten" target that uses 103 `:kernel_types_aten`, compatible with host PyTorch. If False, define 104 a "<name>" target that uses `:kernel_types`, compatible with the 105 embedded executorch runtime. 106 _allow_third_party_deps: If True, the op is allowed to depend on 107 third-party deps outside of //executorch. Should only be used by 108 targets under //executorch/kernels/optimized, which can benefit 109 from third-party optimization libraries. 110 """ 111 selects.apply(obj = deps, function = native.partial(_enforce_deps, name = name, allow_third_party_deps = _allow_third_party_deps)) 112 113 aten_suffix = "_aten" if aten_target else "" 114 runtime.cxx_library( 115 name = name + aten_suffix, 116 srcs = [ 117 "{}.cpp".format(name), 118 ], 119 visibility = [ 120 "//executorch/kernels/portable/test/...", 121 "//executorch/kernels/quantized/...", 122 "//executorch/kernels/optimized/test/...", 123 "//executorch/kernels/test/...", 124 "@EXECUTORCH_CLIENTS", 125 ], 126 fbandroid_platform_deps = android_deps, 127 # kernels often have helpers with no prototypes just disabling the warning here as the headers 128 # are codegend and linked in later 129 compiler_flags = select({ 130 "DEFAULT": ["-Wno-missing-prototypes"], 131 "ovr_config//os:windows": [], 132 }) + ( 133 # For shared library build, we don't want to expose symbols of 134 # kernel implementation (ex torch::executor::native::tanh_out) 135 # to library users. They should use kernels through registry only. 136 # With visibility=hidden, linker won't expose kernel impl symbols 137 # so it can prune unregistered kernels. 138 # Currently fbcode linkes all dependent libraries through shared 139 # library, and it blocks users like unit tests to use kernel 140 # implementation directly. So we enable this for xplat only. 141 ["-fvisibility=hidden"] if is_xplat() else [] 142 ) + get_compiler_optimization_flags(), 143 deps = [ 144 "//executorch/runtime/kernel:kernel_includes" + aten_suffix, 145 ] + deps, 146 # WARNING: using a deprecated API to avoid being built into a shared 147 # library. In the case of dynamically loading so library we don't want 148 # it to depend on other so libraries because that way we have to 149 # specify library directory path. 150 force_static = True, 151 # link_whole is necessary because the operators register themselves 152 # via static initializers that run at program startup. 153 # @lint-ignore BUCKLINT link_whole 154 link_whole = True, 155 ) 156 157def define_op_target(name, deps, android_deps, is_aten_op, is_et_op = True, _allow_third_party_deps = False, _aten_mode_deps = []): 158 """Possibly defines cxx_library targets for the named operator group. 159 160 Args: 161 name: The base name of the target; e.g., "op_add" 162 deps: List of deps for the targets. 163 android_deps: List of fbandroid_platform_deps for the target. 164 is_aten_op: True if the operator overload group is ATen-compatible. 165 is_et_op: True if the operator overload group is ET-compatible. 166 _allow_third_party_deps: If True, the op is allowed to depend on 167 third-party deps outside of //executorch. Should only be used by 168 targets under //executorch/kernels/optimized. 169 """ 170 171 # If this is a custom op, define a target that builds it with at::Tensor 172 # so that it can be imported into a host PyTorch environment for authoring. 173 if not is_aten_op: 174 define_op_library( 175 name = name, 176 deps = _aten_mode_deps if _aten_mode_deps else deps, 177 android_deps = android_deps, 178 aten_target = True, 179 _allow_third_party_deps = _allow_third_party_deps, 180 ) 181 182 if is_et_op: 183 # When building in ATen mode, ATen-compatible (non-custom) operators will 184 # use the implementations provided by ATen, so we should not build the 185 # versions defined here. 186 define_op_library( 187 name = name, 188 deps = deps, 189 android_deps = android_deps, 190 aten_target = False, 191 _allow_third_party_deps = _allow_third_party_deps, 192 ) 193 194# Operators that are listed in `functions.yaml`, and are thus compatible with 195# the core ATen operators. Every entry here will be backed by a cxx_library 196# target with the given name and deps. 197# 198# Note that a single target (or single .cpp file) can't mix ATen and non-ATen 199# ops, and must be split. They can, however, share common code via a library dep 200# if necessary. 201ATEN_OPS = ( 202 op_target( 203 name = "op_abs", 204 deps = [ 205 "//executorch/kernels/portable/cpu/util:functional_util", 206 ], 207 ), 208 op_target( 209 name = "op_acos", 210 deps = [ 211 "//executorch/kernels/portable/cpu/pattern:pattern", 212 ], 213 ), 214 op_target( 215 name = "op_acosh", 216 deps = [ 217 "//executorch/kernels/portable/cpu/pattern:pattern", 218 ], 219 ), 220 op_target( 221 name = "op_add", 222 deps = [ 223 "//executorch/kernels/portable/cpu/util:broadcast_util", 224 "//executorch/kernels/portable/cpu/util:dtype_util", 225 "//executorch/kernels/portable/cpu/util:elementwise_util", 226 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 227 ":scalar_utils", 228 ], 229 ), 230 op_target( 231 name = "op_addmm", 232 deps = [ 233 "//executorch/kernels/portable/cpu/util:broadcast_util", 234 "//executorch/kernels/portable/cpu/util:dtype_util", 235 "//executorch/kernels/portable/cpu/util:elementwise_util", 236 "//executorch/kernels/portable/cpu/util:matmul_ops_util", 237 ":scalar_utils", 238 ":vec_ops", 239 ], 240 ), 241 op_target( 242 name = "op_alias_copy", 243 ), 244 op_target( 245 name = "op_amax", 246 deps = [ 247 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 248 "//executorch/runtime/core/exec_aten/util:tensor_util", 249 "//executorch/kernels/portable/cpu/util:reduce_util", 250 ], 251 ), 252 op_target( 253 name = "op_amin", 254 deps = [ 255 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 256 "//executorch/runtime/core/exec_aten/util:tensor_util", 257 "//executorch/kernels/portable/cpu/util:index_util", 258 "//executorch/kernels/portable/cpu/util:reduce_util", 259 ], 260 ), 261 op_target( 262 name = "op_any", 263 deps = [ 264 "//executorch/kernels/portable/cpu/util:reduce_util", 265 "//executorch/runtime/core/exec_aten/util:tensor_util", 266 ], 267 ), 268 op_target( 269 name = "op_arange", 270 deps = [ 271 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 272 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 273 "//executorch/runtime/core/exec_aten/util:tensor_util", 274 ":scalar_utils", 275 ], 276 ), 277 op_target( 278 name = "op_argmax", 279 deps = [ 280 "//executorch/kernels/portable/cpu/util:reduce_util", 281 ], 282 ), 283 op_target( 284 name = "op_argmin", 285 deps = [ 286 "//executorch/kernels/portable/cpu/util:reduce_util", 287 ], 288 ), 289 op_target( 290 name = "op_as_strided_copy", 291 deps = [ 292 "//executorch/kernels/portable/cpu/util:copy_ops_util", 293 ], 294 ), 295 op_target( 296 name = "op_asin", 297 deps = [ 298 "//executorch/kernels/portable/cpu/pattern:pattern", 299 ], 300 ), 301 op_target( 302 name = "op_asinh", 303 deps = [ 304 "//executorch/kernels/portable/cpu/pattern:pattern", 305 ], 306 ), 307 op_target( 308 name = "op_atan", 309 deps = [ 310 "//executorch/kernels/portable/cpu/pattern:pattern", 311 ], 312 ), 313 op_target( 314 name = "op_atan2", 315 deps = [ 316 "//executorch/kernels/portable/cpu/util:broadcast_util", 317 "//executorch/kernels/portable/cpu/util:dtype_util", 318 "//executorch/kernels/portable/cpu/util:elementwise_util", 319 ], 320 ), 321 op_target( 322 name = "op_atanh", 323 deps = [ 324 "//executorch/kernels/portable/cpu/pattern:pattern", 325 ], 326 ), 327 op_target( 328 name = "op_avg_pool2d", 329 deps = [ 330 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 331 ], 332 ), 333 op_target( 334 name = "op_bitwise_and", 335 deps = [ 336 ":scalar_utils", 337 "//executorch/kernels/portable/cpu/pattern:bitwise_op", 338 "//executorch/kernels/portable/cpu/util:broadcast_util", 339 "//executorch/kernels/portable/cpu/util:dtype_util", 340 "//executorch/kernels/portable/cpu/util:elementwise_util", 341 ], 342 ), 343 op_target( 344 name = "op_bitwise_not", 345 deps = [ 346 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 347 "//executorch/runtime/core/exec_aten/util:tensor_util", 348 "//executorch/kernels/portable/cpu/util:functional_util", 349 ], 350 ), 351 op_target( 352 name = "op_bitwise_or", 353 deps = [ 354 ":scalar_utils", 355 "//executorch/kernels/portable/cpu/pattern:bitwise_op", 356 "//executorch/kernels/portable/cpu/util:broadcast_util", 357 "//executorch/kernels/portable/cpu/util:dtype_util", 358 "//executorch/kernels/portable/cpu/util:elementwise_util", 359 ], 360 ), 361 op_target( 362 name = "op_bitwise_xor", 363 deps = [ 364 ":scalar_utils", 365 "//executorch/kernels/portable/cpu/pattern:bitwise_op", 366 "//executorch/kernels/portable/cpu/util:broadcast_util", 367 "//executorch/kernels/portable/cpu/util:dtype_util", 368 "//executorch/kernels/portable/cpu/util:elementwise_util", 369 ], 370 ), 371 op_target( 372 name = "op_bmm", 373 deps = [ 374 "//executorch/kernels/portable/cpu/util:matmul_ops_util", 375 ":vec_ops", 376 ], 377 ), 378 op_target( 379 name = "op_cat", 380 deps = [ 381 "//executorch/kernels/portable/cpu/util:copy_ops_util", 382 ], 383 ), 384 op_target( 385 name = "op_cdist_forward", 386 deps = [ 387 "//executorch/kernels/portable/cpu/util:broadcast_util", 388 "//executorch/kernels/portable/cpu/util:distance_util", 389 ], 390 ), 391 op_target( 392 name = "op_ceil", 393 deps = [ 394 "//executorch/kernels/portable/cpu/pattern:pattern", 395 ], 396 ), 397 op_target( 398 name = "op_clamp", 399 deps = [ 400 ":scalar_utils", 401 "//executorch/kernels/portable/cpu/util:broadcast_util", 402 "//executorch/kernels/portable/cpu/util:dtype_util", 403 "//executorch/kernels/portable/cpu/util:elementwise_util", 404 "//executorch/kernels/portable/cpu/util:math_util", 405 ], 406 ), 407 op_target( 408 name = "op_clone", 409 ), 410 op_target( 411 name = "op_constant_pad_nd", 412 deps = [ 413 ":scalar_utils", 414 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 415 ], 416 ), 417 op_target( 418 name = "op_convolution", 419 deps = [ 420 "//executorch/kernels/portable/cpu/util:dtype_util", 421 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 422 ":vec_ops", 423 ], 424 ), 425 op_target( 426 name = "op_convolution_backward", 427 deps = [ 428 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 429 ], 430 ), 431 op_target( 432 name = "op_copy", 433 deps = [ 434 "//executorch/kernels/portable/cpu/util:broadcast_util", 435 "//executorch/kernels/portable/cpu/util:dtype_util", 436 "//executorch/kernels/portable/cpu/util:elementwise_util", 437 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 438 "//executorch/runtime/core/exec_aten/util:tensor_util", 439 ":scalar_utils", 440 ], 441 ), 442 op_target( 443 name = "op_cos", 444 deps = [ 445 "//executorch/kernels/portable/cpu/pattern:pattern", 446 ], 447 ), 448 op_target( 449 name = "op_cosh", 450 deps = [ 451 "//executorch/kernels/portable/cpu/pattern:pattern", 452 ], 453 ), 454 op_target( 455 name = "op_cumsum", 456 deps = [ 457 "//executorch/kernels/portable/cpu/util:dtype_util", 458 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 459 "//executorch/runtime/core/exec_aten/util:tensor_util", 460 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 461 ], 462 ), 463 op_target( 464 name = "op_detach_copy", 465 deps = [ 466 "//executorch/runtime/core/exec_aten/util:tensor_util", 467 ], 468 ), 469 op_target( 470 name = "op_diagonal_copy", 471 deps = [ 472 "//executorch/kernels/portable/cpu/util:copy_ops_util", 473 ], 474 ), 475 op_target( 476 name = "op_div", 477 deps = [ 478 "//executorch/kernels/portable/cpu/util:broadcast_util", 479 "//executorch/kernels/portable/cpu/util:dtype_util", 480 "//executorch/kernels/portable/cpu/util:elementwise_util", 481 "//executorch/kernels/portable/cpu/util:math_util", 482 ":scalar_utils", 483 ], 484 ), 485 op_target( 486 name = "op_embedding", 487 deps = [ 488 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 489 ], 490 ), 491 op_target( 492 name = "op_eq", 493 deps = [ 494 ":scalar_utils", 495 "//executorch/kernels/portable/cpu/pattern:comparison_op", 496 "//executorch/kernels/portable/cpu/util:broadcast_util", 497 "//executorch/kernels/portable/cpu/util:dtype_util", 498 "//executorch/kernels/portable/cpu/util:elementwise_util", 499 ], 500 ), 501 op_target( 502 name = "op_empty", 503 ), 504 op_target( 505 name = "op_erf", 506 deps = [ 507 "//executorch/kernels/portable/cpu/pattern:pattern", 508 ], 509 ), 510 op_target( 511 name = "op_exp", 512 deps = [ 513 "//executorch/kernels/portable/cpu/pattern:pattern", 514 ], 515 ), 516 op_target( 517 name = "op_expand_copy", 518 deps = [ 519 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 520 "//executorch/runtime/core/exec_aten/util:tensor_util", 521 "//executorch/kernels/portable/cpu/util:copy_ops_util", 522 "//executorch/kernels/portable/cpu/util:repeat_util", 523 ":scalar_utils", 524 ], 525 ), 526 op_target( 527 name = "op_expm1", 528 deps = [ 529 "//executorch/kernels/portable/cpu/pattern:pattern", 530 ], 531 ), 532 op_target( 533 name = "op_fill", 534 deps = [ 535 ":scalar_utils", 536 "//executorch/kernels/portable/cpu/util:functional_util", 537 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 538 "//executorch/runtime/core/exec_aten/util:tensor_util", 539 ], 540 ), 541 op_target( 542 name = "op_flip", 543 deps = [ 544 "//executorch/kernels/portable/cpu/util:reduce_util", 545 ], 546 ), 547 op_target( 548 name = "op_floor", 549 deps = [ 550 "//executorch/kernels/portable/cpu/pattern:pattern", 551 ], 552 ), 553 op_target( 554 name = "op_floor_divide", 555 deps = [ 556 "//executorch/kernels/portable/cpu/util:broadcast_util", 557 "//executorch/kernels/portable/cpu/util:dtype_util", 558 "//executorch/kernels/portable/cpu/util:elementwise_util", 559 "//executorch/kernels/portable/cpu/util:math_util", 560 ], 561 ), 562 op_target( 563 name = "op_fmod", 564 deps = [ 565 ":scalar_utils", 566 "//executorch/kernels/portable/cpu/util:broadcast_util", 567 "//executorch/kernels/portable/cpu/util:dtype_util", 568 "//executorch/kernels/portable/cpu/util:elementwise_util", 569 ], 570 ), 571 op_target( 572 name = "op_full", 573 deps = [ 574 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 575 "//executorch/runtime/core/exec_aten/util:tensor_util", 576 ":scalar_utils", 577 ], 578 ), 579 op_target( 580 name = "op_full_like", 581 deps = [ 582 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 583 "//executorch/runtime/core/exec_aten/util:tensor_util", 584 ":scalar_utils", 585 ], 586 ), 587 op_target( 588 name = "op_gather", 589 deps = [ 590 "//executorch/kernels/portable/cpu/util:index_util", 591 ], 592 ), 593 op_target( 594 name = "op_ge", 595 deps = [ 596 ":scalar_utils", 597 "//executorch/kernels/portable/cpu/pattern:comparison_op", 598 "//executorch/kernels/portable/cpu/util:broadcast_util", 599 "//executorch/kernels/portable/cpu/util:dtype_util", 600 "//executorch/kernels/portable/cpu/util:elementwise_util", 601 ], 602 ), 603 op_target( 604 name = "op_gelu", 605 deps = [ 606 ":math_constants", 607 "//executorch/kernels/portable/cpu/util:activation_ops_util", 608 "//executorch/kernels/portable/cpu/util:functional_util", 609 ], 610 ), 611 op_target( 612 name = "op_glu", 613 deps = [ 614 "//executorch/kernels/portable/cpu/util:activation_ops_util", 615 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 616 "//executorch/runtime/core/exec_aten/util:tensor_util", 617 ], 618 ), 619 op_target( 620 name = "op_gt", 621 deps = [ 622 ":scalar_utils", 623 "//executorch/kernels/portable/cpu/pattern:comparison_op", 624 "//executorch/kernels/portable/cpu/util:broadcast_util", 625 "//executorch/kernels/portable/cpu/util:dtype_util", 626 "//executorch/kernels/portable/cpu/util:elementwise_util", 627 ], 628 ), 629 op_target( 630 name = "op_hardtanh", 631 deps = [ 632 "//executorch/kernels/portable/cpu/util:functional_util", 633 "//executorch/kernels/portable/cpu/util:math_util", 634 ":scalar_utils", 635 ], 636 ), 637 op_target( 638 name = "op_index", 639 deps = [ 640 "//executorch/kernels/portable/cpu/util:advanced_index_util", 641 "//executorch/kernels/portable/cpu/util:broadcast_util", 642 ], 643 ), 644 op_target( 645 name = "op_index_put", 646 deps = [ 647 "//executorch/kernels/portable/cpu/util:advanced_index_util", 648 "//executorch/kernels/portable/cpu/util:broadcast_util", 649 ], 650 ), 651 op_target( 652 name = "op_index_select", 653 deps = [ 654 "//executorch/kernels/portable/cpu/util:index_util", 655 ], 656 ), 657 op_target( 658 name = "op_isinf", 659 deps = [ 660 "//executorch/kernels/portable/cpu/pattern:pattern", 661 ], 662 ), 663 op_target( 664 name = "op_isnan", 665 deps = [ 666 "//executorch/kernels/portable/cpu/pattern:pattern", 667 ], 668 ), 669 op_target( 670 name = "op_le", 671 deps = [ 672 ":scalar_utils", 673 "//executorch/kernels/portable/cpu/pattern:comparison_op", 674 "//executorch/kernels/portable/cpu/util:broadcast_util", 675 "//executorch/kernels/portable/cpu/util:dtype_util", 676 "//executorch/kernels/portable/cpu/util:elementwise_util", 677 ], 678 ), 679 op_target( 680 name = "op_leaky_relu", 681 deps = [ 682 "//executorch/kernels/portable/cpu/util:functional_util", 683 ":scalar_utils", 684 ], 685 ), 686 op_target( 687 name = "op_lift_fresh_copy", 688 deps = [ 689 "//executorch/runtime/core/exec_aten/util:tensor_util", 690 ], 691 ), 692 op_target( 693 name = "op_log", 694 deps = [ 695 "//executorch/kernels/portable/cpu/pattern:pattern", 696 ], 697 ), 698 op_target( 699 name = "op_log10", 700 deps = [ 701 "//executorch/kernels/portable/cpu/pattern:pattern", 702 ], 703 ), 704 op_target( 705 name = "op_log1p", 706 deps = [ 707 "//executorch/kernels/portable/cpu/pattern:pattern", 708 ], 709 ), 710 op_target( 711 name = "op_log2", 712 deps = [ 713 "//executorch/kernels/portable/cpu/pattern:pattern", 714 ], 715 ), 716 op_target( 717 name = "op_log_softmax", 718 deps = [ 719 ":vec_ops", 720 "//executorch/kernels/portable/cpu/util:activation_ops_util", 721 "//executorch/kernels/portable/cpu/util:functional_util", 722 "//executorch/kernels/portable/cpu/util:reduce_util", 723 ], 724 ), 725 op_target( 726 name = "op_logical_and", 727 deps = [ 728 ":scalar_utils", 729 "//executorch/kernels/portable/cpu/pattern:logical_op", 730 "//executorch/kernels/portable/cpu/util:broadcast_util", 731 "//executorch/kernels/portable/cpu/util:dtype_util", 732 "//executorch/kernels/portable/cpu/util:elementwise_util", 733 ], 734 ), 735 op_target( 736 name = "op_logical_not", 737 deps = [ 738 "//executorch/runtime/core/exec_aten/util:tensor_util", 739 "//executorch/kernels/portable/cpu/util:functional_util", 740 ], 741 ), 742 op_target( 743 name = "op_logical_or", 744 deps = [ 745 ":scalar_utils", 746 "//executorch/kernels/portable/cpu/pattern:logical_op", 747 "//executorch/kernels/portable/cpu/util:broadcast_util", 748 "//executorch/kernels/portable/cpu/util:dtype_util", 749 "//executorch/kernels/portable/cpu/util:elementwise_util", 750 ], 751 ), 752 op_target( 753 name = "op_logical_xor", 754 deps = [ 755 ":scalar_utils", 756 "//executorch/kernels/portable/cpu/pattern:logical_op", 757 "//executorch/kernels/portable/cpu/util:broadcast_util", 758 "//executorch/kernels/portable/cpu/util:dtype_util", 759 "//executorch/kernels/portable/cpu/util:elementwise_util", 760 ], 761 ), 762 op_target( 763 name = "op_logit", 764 deps = [ 765 "//executorch/kernels/portable/cpu/util:functional_util", 766 ], 767 ), 768 op_target( 769 name = "op_lt", 770 deps = [ 771 ":scalar_utils", 772 "//executorch/kernels/portable/cpu/pattern:comparison_op", 773 "//executorch/kernels/portable/cpu/util:broadcast_util", 774 "//executorch/kernels/portable/cpu/util:dtype_util", 775 "//executorch/kernels/portable/cpu/util:elementwise_util", 776 ], 777 ), 778 op_target( 779 name = "op_masked_fill", 780 deps = [ 781 "//executorch/kernels/portable/cpu/util:broadcast_util", 782 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 783 ":scalar_utils", 784 ], 785 ), 786 op_target( 787 name = "op_masked_scatter", 788 deps = [ 789 "//executorch/kernels/portable/cpu/util:broadcast_util", 790 ], 791 ), 792 op_target( 793 name = "op_masked_select", 794 deps = [ 795 "//executorch/kernels/portable/cpu/util:broadcast_util", 796 ], 797 ), 798 op_target( 799 name = "op_max", 800 deps = [ 801 "//executorch/kernels/portable/cpu/util:reduce_util", 802 ], 803 ), 804 op_target( 805 name = "op_maximum", 806 deps = [ 807 "//executorch/kernels/portable/cpu/util:broadcast_util", 808 "//executorch/kernels/portable/cpu/util:dtype_util", 809 "//executorch/kernels/portable/cpu/util:elementwise_util", 810 "//executorch/kernels/portable/cpu/util:math_util", 811 ":scalar_utils", 812 ], 813 ), 814 op_target( 815 name = "op_max_pool2d_with_indices", 816 deps = [ 817 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 818 ], 819 ), 820 op_target( 821 name = "op_mean", 822 deps = [ 823 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 824 "//executorch/runtime/core/exec_aten/util:tensor_util", 825 "//executorch/kernels/portable/cpu/util:kernel_ops_util", 826 "//executorch/kernels/portable/cpu/util:reduce_util", 827 ], 828 ), 829 op_target( 830 name = "op_min", 831 deps = [ 832 "//executorch/kernels/portable/cpu/util:reduce_util", 833 ], 834 ), 835 op_target( 836 name = "op_minimum", 837 deps = [ 838 "//executorch/kernels/portable/cpu/util:broadcast_util", 839 "//executorch/kernels/portable/cpu/util:dtype_util", 840 "//executorch/kernels/portable/cpu/util:elementwise_util", 841 "//executorch/kernels/portable/cpu/util:math_util", 842 ":scalar_utils", 843 ], 844 ), 845 op_target( 846 name = "op_mm", 847 deps = [ 848 "//executorch/kernels/portable/cpu/util:matmul_ops_util", 849 ":vec_ops", 850 ], 851 ), 852 op_target( 853 name = "op_mul", 854 deps = [ 855 "//executorch/kernels/portable/cpu/util:broadcast_util", 856 "//executorch/kernels/portable/cpu/util:dtype_util", 857 "//executorch/kernels/portable/cpu/util:elementwise_util", 858 ":scalar_utils", 859 ], 860 ), 861 op_target( 862 name = "op_narrow_copy", 863 deps = [ 864 "//executorch/kernels/portable/cpu/util:slice_util", 865 ], 866 ), 867 op_target( 868 name = "op_native_batch_norm", 869 deps = [ 870 ":vec_ops", 871 "//executorch/kernels/portable/cpu/util:normalization_ops_util", 872 ], 873 ), 874 op_target( 875 name = "op_native_group_norm", 876 deps = [ 877 ":vec_ops", 878 "//executorch/kernels/portable/cpu/util:normalization_ops_util", 879 ], 880 ), 881 op_target( 882 name = "op_native_layer_norm", 883 deps = [ 884 ":vec_ops", 885 "//executorch/kernels/portable/cpu/util:normalization_ops_util", 886 ], 887 ), 888 op_target( 889 name = "op_ne", 890 deps = [ 891 ":scalar_utils", 892 "//executorch/kernels/portable/cpu/pattern:comparison_op", 893 "//executorch/kernels/portable/cpu/util:broadcast_util", 894 "//executorch/kernels/portable/cpu/util:dtype_util", 895 "//executorch/kernels/portable/cpu/util:elementwise_util", 896 ], 897 ), 898 op_target( 899 name = "op_neg", 900 deps = [ 901 "//executorch/kernels/portable/cpu/util:functional_util", 902 ], 903 ), 904 op_target( 905 name = "op_nonzero", 906 deps = [ 907 ":scalar_utils", 908 "//executorch/kernels/portable/cpu/util:index_util", 909 ], 910 ), 911 op_target( 912 name = "op_ones", 913 deps = [ 914 "//executorch/runtime/core/exec_aten/util:tensor_util", 915 ], 916 ), 917 op_target( 918 name = "op_pdist_forward", 919 deps = [ 920 "//executorch/kernels/portable/cpu/util:distance_util", 921 ], 922 ), 923 op_target( 924 name = "op_permute_copy", 925 deps = [ 926 "//executorch/kernels/portable/cpu/util:copy_ops_util", 927 ], 928 ), 929 op_target( 930 name = "op_pixel_shuffle", 931 deps = [ 932 "//executorch/kernels/portable/cpu/util:copy_ops_util", 933 ], 934 ), 935 op_target( 936 name = "op_pixel_unshuffle", 937 deps = [ 938 "//executorch/kernels/portable/cpu/util:copy_ops_util", 939 ], 940 ), 941 op_target( 942 name = "op_pow", 943 deps = [ 944 ":scalar_utils", 945 "//executorch/kernels/portable/cpu/util:broadcast_util", 946 "//executorch/kernels/portable/cpu/util:dtype_util", 947 "//executorch/kernels/portable/cpu/util:elementwise_util", 948 ], 949 ), 950 op_target( 951 name = "op_prod", 952 deps = [ 953 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 954 "//executorch/runtime/core/exec_aten/util:tensor_util", 955 "//executorch/kernels/portable/cpu/util:reduce_util", 956 ], 957 ), 958 op_target( 959 name = "op_reciprocal", 960 deps = [ 961 "//executorch/kernels/portable/cpu/pattern:pattern", 962 ], 963 ), 964 op_target( 965 name = "op_reflection_pad1d", 966 deps = [ 967 "//executorch/kernels/portable/cpu/util:padding_util", 968 ], 969 ), 970 op_target( 971 name = "op_reflection_pad2d", 972 deps = [ 973 "//executorch/kernels/portable/cpu/util:padding_util", 974 ], 975 ), 976 op_target( 977 name = "op_reflection_pad3d", 978 deps = [ 979 "//executorch/kernels/portable/cpu/util:padding_util", 980 ], 981 ), 982 op_target( 983 name = "op_relu", 984 deps = [ 985 "//executorch/kernels/portable/cpu/util:functional_util", 986 ], 987 ), 988 op_target( 989 name = "op_remainder", 990 deps = [ 991 ":scalar_utils", 992 "//executorch/kernels/portable/cpu/util:broadcast_util", 993 "//executorch/kernels/portable/cpu/util:dtype_util", 994 "//executorch/kernels/portable/cpu/util:elementwise_util", 995 "//executorch/kernels/portable/cpu/util:math_util", 996 ], 997 ), 998 op_target( 999 name = "op_repeat", 1000 deps = [ 1001 "//executorch/kernels/portable/cpu/util:repeat_util", 1002 ], 1003 ), 1004 op_target( 1005 name = "op_replication_pad1d", 1006 deps = [ 1007 "//executorch/kernels/portable/cpu/util:padding_util", 1008 ], 1009 ), 1010 op_target( 1011 name = "op_replication_pad2d", 1012 deps = [ 1013 "//executorch/kernels/portable/cpu/util:padding_util", 1014 ], 1015 ), 1016 op_target( 1017 name = "op_replication_pad3d", 1018 deps = [ 1019 "//executorch/kernels/portable/cpu/util:padding_util", 1020 ], 1021 ), 1022 op_target( 1023 name = "op_roll", 1024 ), 1025 op_target( 1026 name = "op_round", 1027 deps = [ 1028 "//executorch/kernels/portable/cpu/util:functional_util", 1029 ], 1030 ), 1031 op_target( 1032 name = "op_rsqrt", 1033 deps = [ 1034 "//executorch/kernels/portable/cpu/pattern:pattern", 1035 ], 1036 ), 1037 op_target( 1038 name = "op_rsub", 1039 deps = [ 1040 ":scalar_utils", 1041 "//executorch/kernels/portable/cpu/util:broadcast_util", 1042 "//executorch/kernels/portable/cpu/util:dtype_util", 1043 "//executorch/kernels/portable/cpu/util:elementwise_util", 1044 ], 1045 ), 1046 op_target( 1047 name = "op_scalar_tensor", 1048 deps = [":scalar_utils"], 1049 ), 1050 op_target( 1051 name = "op_scatter", 1052 deps = [ 1053 ":scalar_utils", 1054 "//executorch/kernels/portable/cpu/util:index_util", 1055 ], 1056 ), 1057 op_target( 1058 name = "op_scatter_add", 1059 deps = [ 1060 "//executorch/kernels/portable/cpu/util:index_util", 1061 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 1062 "//executorch/runtime/core/exec_aten/util:tensor_util", 1063 ], 1064 ), 1065 op_target( 1066 name = "op_select_copy", 1067 deps = [ 1068 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1069 "//executorch/kernels/portable/cpu/util:select_copy_util", 1070 ], 1071 ), 1072 op_target( 1073 name = "op_select_scatter", 1074 deps = [ 1075 "//executorch/kernels/portable/cpu/util:index_util", 1076 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 1077 "//executorch/runtime/core/exec_aten/util:tensor_util", 1078 ], 1079 ), 1080 op_target( 1081 name = "op_sigmoid", 1082 deps = [ 1083 "//executorch/kernels/portable/cpu/util:functional_util", 1084 "//executorch/kernels/portable/cpu/util:elementwise_util", 1085 "//executorch/kernels/portable/cpu/util:broadcast_util", 1086 "//executorch/kernels/portable/cpu/util:dtype_util", 1087 ], 1088 ), 1089 op_target( 1090 name = "op_sign", 1091 deps = [ 1092 "//executorch/kernels/portable/cpu/util:functional_util", 1093 ], 1094 ), 1095 op_target( 1096 name = "op_sin", 1097 deps = [ 1098 "//executorch/kernels/portable/cpu/pattern:pattern", 1099 ], 1100 ), 1101 op_target( 1102 name = "op_sinh", 1103 deps = [ 1104 "//executorch/kernels/portable/cpu/pattern:pattern", 1105 ], 1106 ), 1107 op_target( 1108 name = "op_slice_copy", 1109 deps = [ 1110 "//executorch/kernels/portable/cpu/util:slice_util", 1111 ], 1112 ), 1113 op_target( 1114 name = "op_slice_scatter", 1115 deps = [ 1116 "//executorch/kernels/portable/cpu/util:slice_util", 1117 ], 1118 ), 1119 op_target( 1120 name = "op_softmax", 1121 deps = [ 1122 ":vec_ops", 1123 "//executorch/kernels/portable/cpu/util:activation_ops_util", 1124 "//executorch/kernels/portable/cpu/util:functional_util", 1125 "//executorch/kernels/portable/cpu/util:reduce_util", 1126 ], 1127 ), 1128 op_target( 1129 name = "op_split_copy", 1130 deps = [ 1131 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1132 ], 1133 ), 1134 op_target( 1135 name = "op_split_with_sizes_copy", 1136 deps = [ 1137 "//executorch/kernels/portable/cpu/util:broadcast_util", 1138 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1139 ], 1140 ), 1141 op_target( 1142 name = "op_sqrt", 1143 deps = [ 1144 "//executorch/kernels/portable/cpu/pattern:pattern", 1145 ], 1146 ), 1147 op_target( 1148 name = "op_squeeze_copy", 1149 deps = [ 1150 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1151 ], 1152 ), 1153 op_target( 1154 name = "op_stack", 1155 deps = [ 1156 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1157 ], 1158 ), 1159 op_target( 1160 name = "op_sub", 1161 deps = [ 1162 ":scalar_utils", 1163 "//executorch/kernels/portable/cpu/util:broadcast_util", 1164 "//executorch/kernels/portable/cpu/util:dtype_util", 1165 "//executorch/kernels/portable/cpu/util:elementwise_util", 1166 ], 1167 ), 1168 op_target( 1169 name = "op_sum", 1170 deps = [ 1171 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 1172 "//executorch/runtime/core/exec_aten/util:tensor_util", 1173 "//executorch/kernels/portable/cpu/util:reduce_util", 1174 ], 1175 ), 1176 op_target( 1177 name = "op_t_copy", 1178 deps = ["//executorch/kernels/portable/cpu/util:transpose_util"], 1179 ), 1180 op_target( 1181 name = "op_tan", 1182 deps = [ 1183 "//executorch/kernels/portable/cpu/pattern:pattern", 1184 ], 1185 ), 1186 op_target( 1187 name = "op_tanh", 1188 deps = [ 1189 "//executorch/kernels/portable/cpu/pattern:pattern", 1190 ], 1191 ), 1192 op_target( 1193 name = "op_to_copy", 1194 deps = [ 1195 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1196 ], 1197 ), 1198 op_target( 1199 name = "op_topk", 1200 ), 1201 op_target( 1202 name = "op_transpose_copy", 1203 deps = ["//executorch/kernels/portable/cpu/util:transpose_util"], 1204 ), 1205 op_target( 1206 name = "op_tril", 1207 deps = [ 1208 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1209 ], 1210 ), 1211 op_target( 1212 name = "op_trunc", 1213 deps = [ 1214 "//executorch/kernels/portable/cpu/pattern:pattern", 1215 ], 1216 ), 1217 op_target( 1218 name = "op_unbind_copy", 1219 deps = [ 1220 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1221 ], 1222 ), 1223 op_target( 1224 name = "op_unsqueeze_copy", 1225 deps = [ 1226 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1227 ], 1228 ), 1229 op_target( 1230 name = "op_var", 1231 deps = [ 1232 ":scalar_utils", 1233 "//executorch/runtime/core/exec_aten/util:scalar_type_util", 1234 "//executorch/runtime/core/exec_aten/util:tensor_util", 1235 "//executorch/kernels/portable/cpu/util:reduce_util", 1236 ], 1237 ), 1238 op_target( 1239 name = "op_view_copy", 1240 deps = [ 1241 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1242 ], 1243 ), 1244 op_target( 1245 name = "op_where", 1246 deps = [ 1247 "//executorch/kernels/portable/cpu/util:broadcast_util", 1248 "//executorch/kernels/portable/cpu/util:dtype_util", 1249 "//executorch/kernels/portable/cpu/util:elementwise_util", 1250 ], 1251 ), 1252 op_target( 1253 name = "op_zeros", 1254 ), 1255 op_target( 1256 name = "op__to_dim_order_copy", 1257 deps = [ 1258 ":scalar_utils", 1259 "//executorch/kernels/portable/cpu/util:copy_ops_util", 1260 ], 1261 ), 1262) 1263 1264# Operators that are not listed in `functions.yaml` (i.e., operators listed in 1265# `custom_ops.yaml`), which are not compatible with the core ATen operators. 1266# Every entry here will be backed by a cxx_library target with the given name 1267# and deps, as well as a similar `<name>_aten` target that uses at::Tensor and 1268# related types. 1269# 1270# Note that a single target (or single .cpp file) can't mix ATen and non-ATen 1271# ops, and must be split. They can, however, share common code via a library dep 1272# if necessary. 1273CUSTOM_OPS = ( 1274 op_target( 1275 name = "op_allclose", 1276 ), 1277 op_target( 1278 name = "op_linear_scratch_example", 1279 ), 1280) 1281 1282def portable_source_list(): 1283 """All the source file names from //executorch/kernels/portable/cpu/""" 1284 return [op["name"] + ".cpp" for op in ATEN_OPS + CUSTOM_OPS] 1285 1286def portable_header_list(): 1287 """All the header file names from //executorch/kernels/portable/cpu/""" 1288 return ["selective_build.h", "scalar_utils.h", "math_constants.h", "vec_ops.h"] 1289