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