Home | History | Annotate | Download | only in framework
      1 /* Copyright 2016 The TensorFlow Authors. All Rights Reserved.
      2 
      3 Licensed under the Apache License, Version 2.0 (the "License");
      4 you may not use this file except in compliance with the License.
      5 You may obtain a copy of the License at
      6 
      7     http://www.apache.org/licenses/LICENSE-2.0
      8 
      9 Unless required by applicable law or agreed to in writing, software
     10 distributed under the License is distributed on an "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 See the License for the specific language governing permissions and
     13 limitations under the License.
     14 ==============================================================================*/
     15 
     16 #ifndef TENSORFLOW_FRAMEWORK_SELECTIVE_REGISTRATION_H_
     17 #define TENSORFLOW_FRAMEWORK_SELECTIVE_REGISTRATION_H_
     18 
     19 #include <string.h>
     20 
     21 #ifdef SELECTIVE_REGISTRATION
     22 
     23 // Experimental selective registration support to reduce binary size.
     24 //
     25 // To use selective registration, when building:
     26 // 1. define SELECTIVE_REGISTRATION, e.g. in gcc by passing
     27 //    -DSELECTIVE_REGISTRATION to compilation.
     28 // 2. Provide ops_to_register.h. This file is not included in the repo and must
     29 //    be placed by the user or a tool where the compiler can find it.  It must
     30 //    define the constants and functions used in the macros below. The
     31 //    functions should be defined as valid constexpr functions, so that they are
     32 //    evaluated at compile time: this is needed to make symbols referenced by
     33 //    un-registered objects unused, and therefore allow the linker to strip them
     34 //    out.  See python/tools/print_selective_registration_header.py for a tool
     35 //    that can be used to generate ops_to_register.h.
     36 //
     37 // ops_to_register.h should define macros for:
     38 //   // Ops for which this is false will not be registered.
     39 //   SHOULD_REGISTER_OP(op)
     40 //   // If this is false, then no gradient ops are registered.
     41 //   SHOULD_REGISTER_OP_GRADIENT
     42 //   // Op kernel classes where this is false won't be registered.
     43 //   SHOULD_REGISTER_OP_KERNEL(clz)
     44 // The macros should be defined using constexprs.
     45 
     46 #include "ops_to_register.h"
     47 
     48 #if (!defined(SHOULD_REGISTER_OP) || !defined(SHOULD_REGISTER_OP_GRADIENT) || \
     49      !defined(SHOULD_REGISTER_OP_KERNEL))
     50 static_assert(false, "ops_to_register.h must define SHOULD_REGISTER macros");
     51 #endif
     52 #else
     53 #define SHOULD_REGISTER_OP(op) true
     54 #define SHOULD_REGISTER_OP_GRADIENT true
     55 #define SHOULD_REGISTER_OP_KERNEL(clz) true
     56 #endif
     57 
     58 #endif  // TENSORFLOW_FRAMEWORK_SELECTIVE_REGISTRATION_H_
     59