aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc
diff options
context:
space:
mode:
authorGravatar Adrian Kuegel <akuegel@google.com>2018-07-31 05:37:41 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-07-31 05:42:10 -0700
commit2826d123a017bc5f1a2cc7b969e275c5a63c326c (patch)
tree8204b3e1a0103a7a183a28e1976fc68491a8634b /tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc
parent3bec2640dcbd251f4eb2517d9ae7d8909886375d (diff)
Allow Sort to share the buffer with the operand if it is the only user.
The BitonicSort algorithm works in-place, so we can make use of that. On GPU, so far we copied the operand to the output and then performed the algorithm in-place. Now, we may not need to do this anymore if we see that the buffer is shared. Also, we now only need device-to-device copies in case the buffer is not shared, because constants are now also assigned a buffer. PiperOrigin-RevId: 206745686
Diffstat (limited to 'tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc')
-rw-r--r--tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc b/tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc
index 37bc2d2c9d..2ec31a9148 100644
--- a/tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc
+++ b/tensorflow/compiler/xla/service/hlo_dataflow_analysis_test.cc
@@ -2232,6 +2232,48 @@ TEST_F(CanShareOperandBufferWithUserTest, DynamicUpdateSliceCanShare) {
dataflow_analysis_->CanShareOperandBufferWithUser(starts, {}, dus, {}));
}
+TEST_F(CanShareOperandBufferWithUserTest, SortCanShare) {
+ auto builder = HloComputation::Builder(TestName());
+
+ Shape keys_shape = ShapeUtil::MakeShape(F32, {8});
+ auto keys = builder.AddInstruction(
+ HloInstruction::CreateParameter(0, keys_shape, "keys"));
+ auto sort =
+ builder.AddInstruction(HloInstruction::CreateSort(keys_shape, 0, keys));
+
+ BuildModuleAndRunAnalysis(builder.Build());
+
+ EXPECT_TRUE(
+ dataflow_analysis_->CanShareOperandBufferWithUser(keys, {}, sort, {}));
+}
+
+TEST_F(CanShareOperandBufferWithUserTest, SortCanShareWithTupleUser) {
+ auto builder = HloComputation::Builder(TestName());
+
+ Shape keys_shape = ShapeUtil::MakeShape(F32, {8});
+ Shape values_shape = ShapeUtil::MakeShape(F32, {8});
+ auto keys = builder.AddInstruction(
+ HloInstruction::CreateParameter(0, keys_shape, "keys"));
+ auto values = builder.AddInstruction(
+ HloInstruction::CreateParameter(1, values_shape, "values"));
+ auto sort = builder.AddInstruction(HloInstruction::CreateSort(
+ ShapeUtil::MakeTupleShape({keys_shape, values_shape}), 0, keys, values));
+
+ BuildModuleAndRunAnalysis(builder.Build());
+
+ // The buffer for the keys can be shared with the first tuple entry.
+ EXPECT_TRUE(
+ dataflow_analysis_->CanShareOperandBufferWithUser(keys, {}, sort, {0}));
+ // The buffer for the values can be shared with the second tuple entry.
+ EXPECT_TRUE(
+ dataflow_analysis_->CanShareOperandBufferWithUser(values, {}, sort, {1}));
+ // Verify that the buffers are not shared with the "wrong" tuple entry.
+ EXPECT_FALSE(
+ dataflow_analysis_->CanShareOperandBufferWithUser(keys, {}, sort, {1}));
+ EXPECT_FALSE(
+ dataflow_analysis_->CanShareOperandBufferWithUser(values, {}, sort, {0}));
+}
+
TEST_F(CanShareOperandBufferWithUserTest, FusedDotAdd) {
auto builder = HloComputation::Builder(TestName());
Shape data_shape = ShapeUtil::MakeShape(F32, {2, 2});