aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/test
diff options
context:
space:
mode:
authorGravatar Eugene Zhulenev <ezhulenev@google.com>2018-08-10 16:53:36 -0700
committerGravatar Eugene Zhulenev <ezhulenev@google.com>2018-08-10 16:53:36 -0700
commitf2209d06e428e0691de71f30fc2db4cb29191cd2 (patch)
tree37d7294a61f80c87389e8e930700a549554afe51 /unsupported/test
parentcfaedb38cd662def3b5684a20965b3bc1b0d6a3f (diff)
Add block evaluationto CwiseUnaryOp and add PreferBlockAccess enum to all evaluators
Diffstat (limited to 'unsupported/test')
-rw-r--r--unsupported/test/cxx11_tensor_block_access.cpp111
-rw-r--r--unsupported/test/cxx11_tensor_executor.cpp31
2 files changed, 142 insertions, 0 deletions
diff --git a/unsupported/test/cxx11_tensor_block_access.cpp b/unsupported/test/cxx11_tensor_block_access.cpp
index 6feeff231..746f62511 100644
--- a/unsupported/test/cxx11_tensor_block_access.cpp
+++ b/unsupported/test/cxx11_tensor_block_access.cpp
@@ -518,6 +518,114 @@ static void test_block_io_squeeze_ones() {
}
template <typename T, int NumDims, int Layout>
+static void test_block_cwise_unary_io_basic() {
+ typedef internal::scalar_square_op<T> UnaryFunctor;
+ typedef internal::TensorBlockCwiseUnaryIO<UnaryFunctor, Index, T, NumDims,
+ Layout>
+ TensorBlockCwiseUnaryIO;
+
+ DSizes<Index, NumDims> block_sizes = RandomDims<NumDims>();
+ DSizes<Index, NumDims> strides(ComputeStrides<Layout, NumDims>(block_sizes));
+
+ const auto total_size = block_sizes.TotalSize();
+
+ // Create a random input tensors.
+ T* input_data = GenerateRandomData<T>(total_size);
+
+ T* output_data = new T[total_size];
+ UnaryFunctor functor;
+ TensorBlockCwiseUnaryIO::Run(functor, block_sizes, strides, output_data,
+ strides, input_data);
+ for (int i = 0; i < total_size; ++i) {
+ VERIFY_IS_EQUAL(output_data[i], functor(input_data[i]));
+ }
+
+ delete[] input_data;
+ delete[] output_data;
+}
+
+template <int Layout>
+static void test_block_cwise_unary_io_squeeze_ones() {
+ typedef internal::scalar_square_op<float> UnaryFunctor;
+ typedef internal::TensorBlockCwiseUnaryIO<UnaryFunctor, Index, float, 5,
+ Layout>
+ TensorBlockCwiseUnaryIO;
+
+ DSizes<Index, 5> block_sizes(1, 2, 1, 3, 1);
+ DSizes<Index, 5> strides(ComputeStrides<Layout, 5>(block_sizes));
+
+ const auto total_size = block_sizes.TotalSize();
+
+ // Create a random input tensors.
+ auto* input_data = GenerateRandomData<float>(total_size);
+
+ auto* output_data = new float[total_size];
+ UnaryFunctor functor;
+ TensorBlockCwiseUnaryIO::Run(functor, block_sizes, strides, output_data,
+ strides, input_data);
+ for (int i = 0; i < total_size; ++i) {
+ VERIFY_IS_EQUAL(output_data[i], functor(input_data[i]));
+ }
+
+ delete[] input_data;
+ delete[] output_data;
+}
+
+template <int Layout>
+static void test_block_cwise_unary_io_zero_strides() {
+ typedef internal::scalar_square_op<float> UnaryFunctor;
+ typedef internal::TensorBlockCwiseUnaryIO<UnaryFunctor, Index, float, 5,
+ Layout>
+ TensorBlockCwiseUnaryIO;
+
+ DSizes<Index, 5> rnd_dims = RandomDims<5>();
+
+ DSizes<Index, 5> input_sizes = rnd_dims;
+ input_sizes[0] = 1;
+ input_sizes[2] = 1;
+ input_sizes[4] = 1;
+
+ DSizes<Index, 5> input_strides(ComputeStrides<Layout, 5>(input_sizes));
+ input_strides[0] = 0;
+ input_strides[2] = 0;
+ input_strides[4] = 0;
+
+ // Generate random data.
+ auto* input_data = GenerateRandomData<float>(input_sizes.TotalSize());
+
+ DSizes<Index, 5> output_sizes = rnd_dims;
+ DSizes<Index, 5> output_strides(ComputeStrides<Layout, 5>(output_sizes));
+
+ const auto output_total_size = output_sizes.TotalSize();
+ auto* output_data = new float[output_total_size];
+
+ UnaryFunctor functor;
+ TensorBlockCwiseUnaryIO::Run(functor, output_sizes, output_strides,
+ output_data, input_strides, input_data);
+ for (int i = 0; i < rnd_dims[0]; ++i) {
+ for (int j = 0; j < rnd_dims[1]; ++j) {
+ for (int k = 0; k < rnd_dims[2]; ++k) {
+ for (int l = 0; l < rnd_dims[3]; ++l) {
+ for (int m = 0; m < rnd_dims[4]; ++m) {
+ Index output_index = i * output_strides[0] + j * output_strides[1] +
+ k * output_strides[2] + l * output_strides[3] +
+ m * output_strides[4];
+ Index input_index = i * input_strides[0] + j * input_strides[1] +
+ k * input_strides[2] + l * input_strides[3] +
+ m * input_strides[4];
+ VERIFY_IS_EQUAL(output_data[output_index],
+ functor(input_data[input_index]));
+ }
+ }
+ }
+ }
+ }
+
+ delete[] input_data;
+ delete[] output_data;
+}
+
+template <typename T, int NumDims, int Layout>
static void test_block_cwise_binary_io_basic() {
typedef internal::scalar_sum_op<T> BinaryFunctor;
typedef internal::TensorBlockCwiseBinaryIO<BinaryFunctor, Index, T, NumDims,
@@ -982,6 +1090,9 @@ EIGEN_DECLARE_TEST(cxx11_tensor_block_access) {
TEST_LAYOUTS_AND_DIMS(Data, test_block_io_copy_using_reordered_dimensions);
TEST_LAYOUTS(test_block_io_zero_stride);
TEST_LAYOUTS(test_block_io_squeeze_ones);
+ TEST_LAYOUTS_AND_DIMS(float, test_block_cwise_unary_io_basic);
+ TEST_LAYOUTS(test_block_cwise_unary_io_squeeze_ones);
+ TEST_LAYOUTS(test_block_cwise_unary_io_zero_strides);
TEST_LAYOUTS_AND_DIMS(float, test_block_cwise_binary_io_basic);
TEST_LAYOUTS(test_block_cwise_binary_io_squeeze_ones);
TEST_LAYOUTS(test_block_cwise_binary_io_zero_strides);
diff --git a/unsupported/test/cxx11_tensor_executor.cpp b/unsupported/test/cxx11_tensor_executor.cpp
index d16ae4d11..1dc18220c 100644
--- a/unsupported/test/cxx11_tensor_executor.cpp
+++ b/unsupported/test/cxx11_tensor_executor.cpp
@@ -31,6 +31,33 @@ static array<Index, NumDims> RandomDims(int min_dim = 1, int max_dim = 20) {
template <typename T, int NumDims, typename Device, bool Vectorizable,
bool Tileable, int Layout>
+static void test_execute_unary_expr(Device d) {
+ static constexpr int Options = 0 | Layout;
+
+ // Pick a large enough tensor size to bypass small tensor block evaluation
+ // optimization.
+ auto dims = RandomDims<NumDims>(50 / NumDims, 100 / NumDims);
+
+ Tensor<T, NumDims, Options, Index> src(dims);
+ Tensor<T, NumDims, Options, Index> dst(dims);
+
+ src.setRandom();
+ const auto expr = src.square();
+
+ using Assign = TensorAssignOp<decltype(dst), const decltype(expr)>;
+ using Executor =
+ internal::TensorExecutor<const Assign, Device, Vectorizable, Tileable>;
+
+ Executor::run(Assign(dst, expr), d);
+
+ for (Index i = 0; i < dst.dimensions().TotalSize(); ++i) {
+ T square = src.coeff(i) * src.coeff(i);
+ VERIFY_IS_EQUAL(square, dst.coeff(i));
+ }
+}
+
+template <typename T, int NumDims, typename Device, bool Vectorizable,
+ bool Tileable, int Layout>
static void test_execute_binary_expr(Device d)
{
static constexpr int Options = 0 | Layout;
@@ -445,6 +472,10 @@ EIGEN_DECLARE_TEST(cxx11_tensor_executor) {
Eigen::ThreadPool tp(num_threads);
Eigen::ThreadPoolDevice tp_device(&tp, num_threads);
+ CALL_SUBTEST_COMBINATIONS(test_execute_unary_expr, float, 3);
+ CALL_SUBTEST_COMBINATIONS(test_execute_unary_expr, float, 4);
+ CALL_SUBTEST_COMBINATIONS(test_execute_unary_expr, float, 5);
+
CALL_SUBTEST_COMBINATIONS(test_execute_binary_expr, float, 3);
CALL_SUBTEST_COMBINATIONS(test_execute_binary_expr, float, 4);
CALL_SUBTEST_COMBINATIONS(test_execute_binary_expr, float, 5);