From 33e174613987cfc6c83576dc0fe8086c7a5d1b1f Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Wed, 9 Oct 2019 12:45:31 -0700 Subject: Block evaluation for TensorChipping + fixed bugs in TensorPadding and TensorSlicing --- unsupported/test/cxx11_tensor_block_eval.cpp | 84 +++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) (limited to 'unsupported/test/cxx11_tensor_block_eval.cpp') diff --git a/unsupported/test/cxx11_tensor_block_eval.cpp b/unsupported/test/cxx11_tensor_block_eval.cpp index 1dc0a9e2c..e11092af3 100644 --- a/unsupported/test/cxx11_tensor_block_eval.cpp +++ b/unsupported/test/cxx11_tensor_block_eval.cpp @@ -82,14 +82,14 @@ static TensorBlockParams SkewedInnerBlock( index -= idx * strides[i]; offsets[i] = idx; } - offsets[0] = index; + if (NumDims > 0) offsets[0] = index; } else { for (int i = 0; i < NumDims - 1; ++i) { const Index idx = index / strides[i]; index -= idx * strides[i]; offsets[i] = idx; } - offsets[NumDims - 1] = index; + if (NumDims > 0) offsets[NumDims - 1] = index; } auto desc = TensorBlockDescriptor(block.first_coeff_index(), sizes); @@ -333,6 +333,42 @@ static void test_eval_tensor_padding() { [&padded_dims]() { return SkewedInnerBlock(padded_dims); }); } +template +static void test_eval_tensor_chipping() { + DSizes dims = RandomDims(10, 20); + Tensor input(dims); + input.setRandom(); + + Index chip_dim = internal::random(0, NumDims - 1); + Index chip_offset = internal::random(0, dims[chip_dim] - 2); + + DSizes chipped_dims; + for (Index i = 0; i < chip_dim; ++i) { + chipped_dims[i] = dims[i]; + } + for (Index i = chip_dim + 1; i < NumDims; ++i) { + chipped_dims[i - 1] = dims[i]; + } + + // Block buffer forwarding. + VerifyBlockEvaluator( + input.chip(chip_offset, chip_dim), + [&chipped_dims]() { return FixedSizeBlock(chipped_dims); }); + + VerifyBlockEvaluator( + input.chip(chip_offset, chip_dim), + [&chipped_dims]() { return RandomBlock(chipped_dims, 1, 10); }); + + // Block expression assignment. + VerifyBlockEvaluator( + input.square().chip(chip_offset, chip_dim), + [&chipped_dims]() { return FixedSizeBlock(chipped_dims); }); + + VerifyBlockEvaluator( + input.square().chip(chip_offset, chip_dim), + [&chipped_dims]() { return RandomBlock(chipped_dims, 1, 10); }); +} + template static void test_eval_tensor_reshape_with_bcast() { Index dim = internal::random(1, 100); @@ -384,8 +420,8 @@ static void test_eval_tensor_forced_eval() { // as an assignment to TensorSliceOp (writing a block is is identical to // assigning one tensor to a slice of another tensor). -template +template static void VerifyBlockAssignment(Tensor& tensor, Expression expr, GenBlockParams gen_block) { using Device = DefaultDevice; @@ -395,17 +431,17 @@ static void VerifyBlockAssignment(Tensor& tensor, auto eval = TensorEvaluator(expr, d); // Generate a random block, or choose a block that fits in full expression. - TensorBlockParams block_params = gen_block(); + TensorBlockParams block_params = gen_block(); // Generate random data of the selected block size. - Tensor block(block_params.desc.dimensions()); + Tensor block(block_params.desc.dimensions()); block.setRandom(); // ************************************************************************ // // (1) Assignment from a block. // Construct a materialize block from a random generated block tensor. - internal::TensorMaterializedBlock blk( + internal::TensorMaterializedBlock blk( internal::TensorBlockKind::kView, block.data(), block.dimensions()); // Reset all underlying tensor values to zero. @@ -478,6 +514,37 @@ static void test_assign_to_tensor_reshape() { [&shuffled]() { return FixedSizeBlock(shuffled); }); } +template +static void test_assign_to_tensor_chipping() { + DSizes dims = RandomDims(10, 20); + Tensor tensor(dims); + + Index chip_dim = internal::random(0, NumDims - 1); + Index chip_offset = internal::random(0, dims[chip_dim] - 2); + + DSizes < Index, NumDims - 1 > chipped_dims; + for (Index i = 0; i < chip_dim; ++i) { + chipped_dims[i] = dims[i]; + } + for (Index i = chip_dim + 1; i < NumDims; ++i) { + chipped_dims[i - 1] = dims[i]; + } + + TensorMap> map(tensor.data(), dims); + + VerifyBlockAssignment( + tensor, map.chip(chip_offset, chip_dim), + [&chipped_dims]() { return RandomBlock(chipped_dims, 1, 10); }); + + VerifyBlockAssignment( + tensor, map.chip(chip_offset, chip_dim), + [&chipped_dims]() { return SkewedInnerBlock(chipped_dims); }); + + VerifyBlockAssignment( + tensor, map.chip(chip_offset, chip_dim), + [&chipped_dims]() { return FixedSizeBlock(chipped_dims); }); +} + // -------------------------------------------------------------------------- // #define CALL_SUBTESTS_DIMS_LAYOUTS(NAME) \ @@ -503,12 +570,15 @@ EIGEN_DECLARE_TEST(cxx11_tensor_block_eval) { CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_broadcast); CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_reshape); CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_cast); + CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_select); CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_padding); + CALL_SUBTESTS_DIMS_LAYOUTS(test_eval_tensor_chipping); CALL_SUBTESTS_LAYOUTS(test_eval_tensor_reshape_with_bcast); CALL_SUBTESTS_LAYOUTS(test_eval_tensor_forced_eval); CALL_SUBTESTS_DIMS_LAYOUTS(test_assign_to_tensor); CALL_SUBTESTS_DIMS_LAYOUTS(test_assign_to_tensor_reshape); + CALL_SUBTESTS_DIMS_LAYOUTS(test_assign_to_tensor_chipping); // clang-format on } -- cgit v1.2.3