| /* Copyright 2017 The TensorFlow Authors. All Rights Reserved. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==============================================================================*/ |
| |
| #include "tensorflow/core/framework/common_shape_fns.h" |
| #include "tensorflow/core/framework/op.h" |
| |
| namespace tensorflow { |
| |
| REGISTER_OP("_ScopedAllocator") |
| .Output("output: T") |
| .Attr("shapes: list(shape)") |
| .Attr("shape: shape") |
| .Attr("T: type") |
| .Attr("sa_name: string") |
| .Attr("id: int") |
| .Attr("expected_call_count: int") |
| .SetIsStateful() |
| .SetShapeFn(shape_inference::ExplicitShape) |
| .Doc(R"doc( |
| Allocates a mutable tensor that becomes available to appropriately annotated |
| downstream Ops as backing store for their output tensor allocations via the |
| ScopedAllocatorMgr. |
| Returns a reference to this value. |
| |
| This is an experimental op for internal use only. It is possible to use this |
| op in unsafe ways. |
| |
| 'shapes' is a list of the shapes of the tensors that are to be allocated |
| by this ScopedAllocator. |
| 'shape' is the shape of the output of this Op, i.e. the 1D backing tensor |
| from which the individual allocated tensors are aliased. |
| 'sa_name' is the name assigned to the Node, for connectivity specification |
| and debugging. |
| 'id' is a non-negative integer 'scope_id' handled by the ScopedAllocatorMgr. |
| 'expected_call_count' is the number of individual tensors expected to |
| be allocated from the backing tensor. |
| )doc"); |
| |
| REGISTER_OP("_ScopedAllocatorConcat") |
| .Output("output: T") |
| .Input("backing: T") |
| .Input("inputs: N * T") |
| .Attr("shape: shape") |
| .Attr("T: type") |
| .Attr("reshape: bool = false") |
| .Attr("sa_name: string") |
| .Attr("id: int") |
| .Attr("N: int >= 2") |
| .SetIsStateful() |
| .SetShapeFn(shape_inference::ExplicitShape) |
| .Doc(R"doc( |
| Acts like a Concat Op that merges multple tensors into one, however it must |
| only be used in conjunction with a ScopedAllocator which is backing the memory |
| of all of its input tensors so that actually it just outputs a read-only |
| reference to that ScopedAllocator's backing tensor. |
| |
| This is an experimental op for internal use only. It is possible to use this |
| op in unsafe ways. |
| |
| 'backing' is the backing tensor, i.e. the output of an upstream ScopedAllocator. |
| 'inputs' is a list of nominal input tensors, all of which must be aliases |
| to regions of the backing tensor. These will be outputs of upstream nodes |
| that allocate their outputs from the same ScopedAllocator. |
| 'shape' is the shape of the output, which will usually be the same shape as |
| the input backing tensor. |
| 'reshape' is true iff the output shape is to be different from that of |
| the input backing tensor. |
| 'sa_name' is the Node name of the upstream ScopedAllocator. |
| 'id' is the scope_id identifying the upstream ScopedAllocator. |
| 'N' is the number of nominal inputs to be concatenated. |
| )doc"); |
| |
| REGISTER_OP("_ScopedAllocatorSplit") |
| .Output("output: N * T") |
| .Input("concat: T") |
| .Input("split: N * T") |
| .Attr("T: type") |
| .Attr("sa_name: string") |
| .Attr("id: int") |
| .Attr("N: int >= 2") |
| .Attr("shapes: list(shape)") |
| .SetIsStateful() |
| .SetShapeFn(shape_inference::ExplicitShapes) |
| .Doc(R"doc( |
| Acts roughly like a SplitV Op that splits one tensor into multiple tensors |
| but must only be used in conjunction with corresponding ScopedAllocator |
| and ScopedAllocatorConcat instances. In practice it is provided as inputs |
| the backing tensor as first input, which contains the concatenated values, |
| and a list of alias tensors as its other input and it simply outputs that |
| second list. |
| |
| This is an experimental op for internal use only. It is possible to use this |
| op in unsafe ways. |
| |
| 'concat' is the single output produced by an upstream ScopedAllocatorConcat |
| node. This is actually the backing tensor from a ScopedAllocator node |
| upstream of the ScopedAllocatorConcat. |
| 'split' is a list of tensors aliased from the backing tensor. It will |
| become the output of this ScopedAllocatorSplit node. |
| 'type' is the common DataType of all of the input and output tensors. |
| 'sa_name' is the Node name of the upstream ScopedAllocator. |
| 'id' is the scope_id identifying the upstream ScopedAllocator. |
| 'N' is the number of split tensors. |
| 'shapes' is a list of the split tensor shapes. |
| )doc"); |
| |
| } // end namespace tensorflow |