Poplar and PopLibs
DynamicSlice.hpp
Go to the documentation of this file.
1// Copyright (c) 2017 Graphcore Ltd. All rights reserved.
8#ifndef popops_DynamicSlice_hpp
9#define popops_DynamicSlice_hpp
10#include <poplar/Graph.hpp>
11#include <poplar/Program.hpp>
12#include <poputil/DebugInfo.hpp>
13#include <string>
14#include <vector>
15
16namespace poplar {
17class Tensor;
18}
19
20namespace popops {
21
22class SlicePlanInternal;
27class SlicePlan {
28public:
29 SlicePlan();
30 ~SlicePlan();
31 SlicePlan(const SlicePlan &other);
32 SlicePlan(SlicePlan &&other);
33 SlicePlan &operator=(const SlicePlan &other);
34 SlicePlan &operator=(SlicePlan &&other);
35
36 friend std::ostream &operator<<(std::ostream &o, const SlicePlan &p);
37 friend bool operator<(const SlicePlan &a, const SlicePlan &b) noexcept;
38 friend bool operator==(const SlicePlan &a, const SlicePlan &b) noexcept;
39 friend poplar::ProfileValue poputil::toProfileValue<>(const SlicePlan &p);
40
41 // Implementation
42 SlicePlan(std::unique_ptr<SlicePlanInternal> internal);
43 SlicePlanInternal &getImpl() const { return *internal; }
44
45private:
46 std::unique_ptr<SlicePlanInternal> internal;
47};
48bool operator<(const SlicePlan &a, const SlicePlan &b) noexcept;
49bool operator==(const SlicePlan &a, const SlicePlan &b) noexcept;
50bool operator!=(const SlicePlan &a, const SlicePlan &b) noexcept;
51
69 poplar::Graph &graph, const poplar::Type &type,
70 const std::vector<size_t> &shape, const std::vector<size_t> &dims,
71 const std::vector<size_t> &sizes, std::size_t minGrainSize = 0,
72 const poplar::DebugContext &debugContext = {});
73
91 const std::vector<size_t> &shape,
92 const std::vector<size_t> &dims,
93 const std::vector<size_t> &sizes, const SlicePlan &plan,
94 const poplar::OptionFlags &options,
95 const poplar::DebugContext &debugContext = {});
96
123 poplar::Graph &graph, const poplar::Type &type, const std::size_t groupSize,
124 const std::vector<std::size_t> &shape, const std::vector<std::size_t> &dims,
125 const std::vector<std::size_t> &sizes, const SlicePlan &plan,
126 const poplar::OptionFlags &options,
127 const poplar::DebugContext &debugContext = {});
128
151 const std::vector<size_t> &dims,
152 const std::vector<size_t> &sizes,
153 std::size_t numIndices,
154 const poplar::DebugContext &debugContext = {});
155
178 const std::vector<std::size_t> &shape,
179 const std::vector<std::size_t> &dims,
180 const std::vector<std::size_t> &sizes,
181 std::size_t numIndices, const SlicePlan &plan,
182 const poplar::OptionFlags &options,
183 const poplar::DebugContext &debugContext = {});
184
216 poplar::Graph &graph, const poplar::Type &type, const std::size_t groupSize,
217 const std::vector<std::size_t> &shape, const std::vector<std::size_t> &dims,
218 const std::vector<std::size_t> &sizes, const std::size_t numIndices,
219 const SlicePlan &plan, const poplar::OptionFlags &options,
220 const poplar::DebugContext &debugContext = {});
221
239createIndicesTensor(poplar::Graph &graph, const std::vector<std::size_t> &dims,
240 std::size_t numIndices, const SlicePlan &plan,
241 const poplar::OptionFlags &options,
242 const poplar::DebugContext &debugContext = {});
243
273createGroupedIndicesTensor(poplar::Graph &graph, const std::size_t groupSize,
274 const std::vector<std::size_t> &dims,
275 const std::size_t numIndices, const SlicePlan &plan,
276 const poplar::OptionFlags & /* options */,
277 const poplar::DebugContext &debugContext = {});
278
298 const std::vector<std::size_t> &dims,
299 const std::vector<std::size_t> &numSlices,
300 const poplar::DebugContext &debugContext = {});
301
328 const poplar::Tensor &offset,
329 const std::vector<std::size_t> &dims,
330 const std::vector<std::size_t> &sizes,
332 const poplar::DebugContext &debugContext = {});
333
355 const poplar::Tensor &t,
356 const poplar::Tensor &offset,
357 const std::vector<std::size_t> &dims,
358 const std::vector<std::size_t> &sizes,
360 const poplar::DebugContext &debugContext = {});
361
372poplar::Graph::TileToTensorMapping
374 const std::vector<std::size_t> &dims,
375 const std::vector<std::size_t> &sizes);
376
398 const poplar::Tensor &s, const poplar::Tensor &offset,
399 const std::vector<std::size_t> &dims,
400 const std::vector<std::size_t> &sizes,
402 const poplar::DebugContext &debugContext = {});
403
425 const poplar::Tensor &offsets,
426 const std::vector<std::size_t> &dims,
427 const std::vector<std::size_t> &sizes,
429 const SlicePlan &plan,
430 const poplar::OptionFlags &options,
431 const poplar::DebugContext &debugContext = {});
432
460 const poplar::Tensor &offsets,
461 const std::vector<std::size_t> &dims,
462 const std::vector<std::size_t> &sizes,
464 const SlicePlan &plan,
465 const poplar::OptionFlags &options,
466 const poplar::DebugContext &debugContext = {});
467
481 poplar::ArrayRef<unsigned> offsets, std::size_t dim,
483 const poplar::DebugContext &debugContext = {});
484
500 const poplar::Tensor &s, const poplar::Tensor &offsets,
501 const std::vector<std::size_t> &dims,
502 const std::vector<std::size_t> &sizes,
503 poplar::program::Sequence &prog, const SlicePlan &plan,
504 const poplar::OptionFlags &options,
505 const poplar::DebugContext &debugContext = {});
506
523 const poplar::Tensor &s, const poplar::Tensor &offsets,
524 const std::vector<std::size_t> &dims,
525 const std::vector<std::size_t> &sizes,
526 poplar::program::Sequence &prog, const SlicePlan &plan,
527 const poplar::OptionFlags &options,
528 const poplar::DebugContext &debugContext = {});
529
550 const poplar::Tensor &s, const poplar::Tensor &offsets,
551 const poplar::Tensor &scale,
552 const std::vector<std::size_t> &dims,
553 const std::vector<std::size_t> &sizes,
554 poplar::program::Sequence &prog, const SlicePlan &plan,
555 const poplar::OptionFlags &options,
556 const poplar::DebugContext &debugContext = {});
557
580 poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s,
581 const poplar::Tensor &offsets, const poplar::Tensor &scale,
582 const std::vector<std::size_t> &dims, const std::vector<std::size_t> &sizes,
583 poplar::program::Sequence &prog, const SlicePlan &plan,
584 const poplar::OptionFlags &options,
585 const poplar::DebugContext &debugContext = {});
586
604 const poplar::Tensor &s, poplar::ArrayRef<unsigned> offsets,
605 const poplar::Tensor &scale, std::size_t dim,
607 const poplar::DebugContext &debugContext = {});
608
628 const poplar::Tensor &s, const poplar::Tensor &offsets,
629 const std::vector<std::size_t> &dims,
630 const std::vector<std::size_t> &sizes,
631 poplar::program::Sequence &prog, const SlicePlan &plan,
632 const poplar::OptionFlags &options,
633 const poplar::DebugContext &debugContext = {});
634
654 poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s,
655 const poplar::Tensor &offsets, const std::vector<std::size_t> &dims,
656 const std::vector<std::size_t> &sizes, poplar::program::Sequence &prog,
657 const SlicePlan &plan, const poplar::OptionFlags &options,
658 const poplar::DebugContext &debugContext = {});
659
660namespace embedding {
661
742SlicePlan plan(const poplar::Graph &graph, const poplar::Type &dataType,
743 const std::size_t numEntries, const std::size_t outputSize,
744 const std::vector<std::size_t> &numLookups,
745 const poplar::OptionFlags &options);
746
749SlicePlan plan(const poplar::Graph &graph, const poplar::Type &dataType,
750 const std::size_t groupSize, const std::size_t numEntries,
751 const std::size_t outputSize,
752 const std::vector<std::size_t> &numLookups,
753 const poplar::OptionFlags &options);
754
755} // end namespace embedding
756
757} // end namespace popops
758#endif // popops_DynamicSlice_hpp
Poplibs generic debug info structure.
DebugContext gathers the common external parameters of the context of an operation.
Definition: DebugContext.hpp:221
This class represents a graph program to be executed on the IPU.
Definition: Graph.hpp:52
A set of option/value string flags to be used in various APIs.
Definition: OptionFlags.hpp:24
ProfileValue represents a read-only JSON-like tree of values that are used to store the output of the...
Definition: ProfileValue.hpp:39
A reference to a subset of tensor elements.
Definition: Tensor.hpp:38
Class representing device data types.
Definition: Type.hpp:42
Program that executes a sequence of programs.
Definition: Program.hpp:77
An object representing a plan that describes how to implement a slice or update.
Definition: DynamicSlice.hpp:27
Poplar classes and functions.
Definition: ArrayRef.hpp:14
Common functions, such as elementwise and reductions.
Definition: AllTrue.hpp:15
poplar::Tensor createGroupedIndicesTensor(poplar::Graph &graph, const std::size_t groupSize, const std::vector< std::size_t > &dims, const std::size_t numIndices, const SlicePlan &plan, const poplar::OptionFlags &, const poplar::DebugContext &debugContext={})
Create and map a tensor with a group dimension to contain indices for slicing or updating a tensor ef...
poplar::Graph::TileToTensorMapping getSliceMapping(poplar::Graph &graph, const poplar::Tensor &t, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes)
Get the tile mapping for a slice of a tensor.
void groupedMultiUpdateMax(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Find maximum over multiple slices in a tensor with a group dimension.
void multiUpdateAdd(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const poplar::Tensor &scale, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Accumulate multiple slices in a tensor.
poplar::Tensor createSliceableTensor(poplar::Graph &graph, const poplar::Type &type, const std::vector< size_t > &shape, const std::vector< size_t > &dims, const std::vector< size_t > &sizes, std::size_t minGrainSize=0, const poplar::DebugContext &debugContext={})
Create and map a tensor to be sliced/updated efficiently.
void groupedMultiUpdateAdd(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const poplar::Tensor &scale, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Accumulate multiple slices in a tensor where the first dimension of the tensors t,...
poplar::Tensor createIndicesTensor(poplar::Graph &graph, const std::vector< std::size_t > &dims, std::size_t numIndices, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Create and map a tensor to contain indices for slicing or updating a tensor efficiently.
poplar::Tensor createGroupedSliceTensor(poplar::Graph &graph, const poplar::Type &type, const std::size_t groupSize, const std::vector< std::size_t > &shape, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, const std::size_t numIndices, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Create and map a tensor with a group dimension that is used as a result of slicing,...
void groupedMultiUpdate(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Update multiple slices in a tensor with a group dimension.
void multiUpdateMax(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Find maximum over multiple slices in a tensor.
poplar::Tensor dynamicSlice(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &offset, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={})
Slice a tensor based on offsets specified by a tensor.
void dynamicSliceWithOutput(poplar::Graph &graph, const poplar::Tensor &output, const poplar::Tensor &t, const poplar::Tensor &offset, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={})
Slice a tensor based on offsets specified by a tensor.
poplar::Tensor multiSlice(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Take multiple slices from a base tensor.
poplar::Tensor createSliceableTensorFromSlice(poplar::Graph &graph, const poplar::Tensor &s, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &numSlices, const poplar::DebugContext &debugContext={})
Create and map a tensor to be sliced/updated.
poplar::Tensor createGroupedSliceableTensor(poplar::Graph &graph, const poplar::Type &type, const std::size_t groupSize, const std::vector< std::size_t > &shape, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Create and map a tensor with a group dimension to be sliced/updated efficiently.
poplar::Tensor createSliceTensor(poplar::Graph &graph, const poplar::Tensor &t, const std::vector< size_t > &dims, const std::vector< size_t > &sizes, std::size_t numIndices, const poplar::DebugContext &debugContext={})
Create and map a tensor that is used as a result of slicing, or as an input to an update.
poplar::Tensor groupedMultiSlice(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Take multiple slices from a base tensor where the base tensor and the offsets tensor have the group d...
void dynamicUpdate(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offset, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={})
Update a subtensor at offsets read from a tensor.
void multiUpdate(poplar::Graph &graph, const poplar::Tensor &t, const poplar::Tensor &s, const poplar::Tensor &offsets, const std::vector< std::size_t > &dims, const std::vector< std::size_t > &sizes, poplar::program::Sequence &prog, const SlicePlan &plan, const poplar::OptionFlags &options, const poplar::DebugContext &debugContext={})
Update multiple slices in a tensor.