1bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
3bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerLicensed under the Apache License, Version 2.0 (the "License");
4bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFloweryou may not use this file except in compliance with the License.
5bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerYou may obtain a copy of the License at
6bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
7bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    http://www.apache.org/licenses/LICENSE-2.0
8bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
9bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerUnless required by applicable law or agreed to in writing, software
10bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerdistributed under the License is distributed on an "AS IS" BASIS,
11bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerSee the License for the specific language governing permissions and
13bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerlimitations under the License.
14bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower==============================================================================*/
15bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
16bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include <initializer_list>
17bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/common_runtime/kernel_benchmark_testlib.h"
18bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/framework/bfloat16.h"
19bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/framework/tensor.h"
20bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/framework/tensor_testutil.h"
21bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/framework/types.pb.h"
22bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/graph/node_builder.h"
23bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/lib/strings/stringprintf.h"
24bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/platform/test.h"
25bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#include "tensorflow/core/platform/test_benchmark.h"
26bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
27bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowernamespace tensorflow {
28bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
29bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerstatic Graph* MakeGraph(int split_dim, int num_split,
30bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                        std::initializer_list<int64> chunk_size) {
31bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  Graph* g = new Graph(OpRegistry::Global());
32bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  TensorShape in_shape(chunk_size);
33bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  in_shape.set_dim(split_dim, in_shape.dim_size(split_dim) * num_split);
34bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  Tensor in(DataTypeToEnum<float>::value, in_shape);
35bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  in.flat<float>().setRandom();
36bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  Tensor split_dim_tensor = test::AsScalar<int32>(split_dim);
37bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  Node* split;
38bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  TF_CHECK_OK(NodeBuilder(g->NewName("split"), "Split")
39bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                  .Input(test::graph::Constant(g, split_dim_tensor))
40bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                  .Input(test::graph::Constant(g, in))
41bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                  .Attr("num_split", num_split)
42bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                  .Finalize(g, &split));
43bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  return g;
44bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower}
45bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
46bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#define BM_SPLIT_1D(num_split, chunk_size)                                  \
47bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  static void BM_Split_1d_##num_split##_##chunk_size(int iters) {           \
48bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::StopTiming();                                                  \
49bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::ItemsProcessed(static_cast<int64>(iters) * num_split *         \
50bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                            chunk_size);                                    \
51bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    auto label =                                                            \
52bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower        strings::Printf("1-D %d chunks of %d each", num_split, chunk_size); \
53bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::SetLabel(label);                                               \
54bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::UseRealTime();                                                 \
55bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    auto g = MakeGraph(/* split_dim = */ 0, num_split, {chunk_size});       \
56bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::StartTiming();                                                 \
57bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    test::Benchmark("cpu", g).Run(iters);                                   \
58bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  }                                                                         \
59bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  BENCHMARK(BM_Split_1d_##num_split##_##chunk_size);
60bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
61bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower#define BM_SPLIT_2D(split_dim, num_split, chunk_size0, chunk_size1)          \
62bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  static void                                                                \
63bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower      BM_Split_2d_##split_dim##_##num_split##_##chunk_size0##_##chunk_size1( \
64bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower          int iters) {                                                       \
65bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::StopTiming();                                                   \
66bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::ItemsProcessed(static_cast<int64>(iters) * num_split *          \
67bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                            chunk_size0 * chunk_size1);                      \
68bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    auto label =                                                             \
69bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower        strings::Printf("2-D %d chunks in dim %d of (%d * %d) each",         \
70bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower                        num_split, split_dim, chunk_size0, chunk_size1);     \
71bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::SetLabel(label);                                                \
72bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::UseRealTime();                                                  \
73bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    auto g = MakeGraph(split_dim, num_split, {chunk_size0, chunk_size1});    \
74bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    testing::StartTiming();                                                  \
75bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower    test::Benchmark("cpu", g).Run(iters);                                    \
76bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  }                                                                          \
77bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower  BENCHMARK(                                                                 \
78bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower      BM_Split_2d_##split_dim##_##num_split##_##chunk_size0##_##chunk_size1);
79bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
80bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(5, 1);
81bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(262144, 1);
82bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(1, 100000);
83bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(5, 100000);
84bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(10, 4194304);
85bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(2, 4194304);
86bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(100, 1024);
87bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_1D(32768, 1024);
88bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
89bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 1024, 1, 10);
90bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 1024, 10, 10);
91bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 512, 1024, 256);
92bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 20, 100000, 5);
93bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 2, 3, 524288);
94bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(0, 100, 4096, 512);
95bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
96bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 1024, 1, 10);
97bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 1024, 10, 10);
98bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 512, 1024, 256);
99bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 20, 100000, 5);
100bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 2, 3, 524288);
101bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlowerBM_SPLIT_2D(1, 100, 4096, 512);
102bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower
103bb80ae7f57260f35358eb777ba1511fa23f13609A. Unique TensorFlower}  // namespace tensorflow
104