test_elementwise_dev_api.cc 8.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

#include <gtest/gtest.h>
#include <memory>

W
Wilber 已提交
18
#include "paddle/pten/backends/cpu/cpu_context.h"
19
#include "paddle/pten/kernels/math_kernel.h"
20 21 22 23 24

#include "paddle/pten/api/lib/utils/allocator.h"
#include "paddle/pten/core/dense_tensor.h"
#include "paddle/pten/core/kernel_registry.h"

25 26 27
namespace pten {
namespace tests {

28
namespace framework = paddle::framework;
29
using DDim = pten::framework::DDim;
30

31
TEST(DEV_API, add) {
32
  // 1. create tensor
33
  const auto alloc = std::make_unique<paddle::experimental::DefaultAllocator>(
34
      paddle::platform::CPUPlace());
35
  pten::DenseTensor dense_x(alloc.get(),
36 37 38 39 40
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({3, 10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_x_data = dense_x.mutable_data<float>();

41
  pten::DenseTensor dense_y(alloc.get(),
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_y_data = dense_y.mutable_data<float>();

  float sum[3][10] = {0.0};
  for (size_t i = 0; i < 3; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      dense_x_data[i * 10 + j] = (i * 10 + j) * 1.0;
      sum[i][j] = (i * 10 + j) * 1.0 + j * 2.0;
    }
  }
  for (size_t i = 0; i < 10; ++i) {
    dense_y_data[i] = i * 2.0;
  }
  int axis = 1;

  // 2. test API
W
Wilber 已提交
60 61
  pten::CPUContext dev_ctx;
  auto dense_out = pten::Add<float>(dev_ctx, dense_x, dense_y, axis);
62 63 64 65

  // 3. check result
  ASSERT_EQ(dense_out.dims().size(), 2);
  ASSERT_EQ(dense_out.dims()[0], 3);
Y
YuanRisheng 已提交
66 67
  ASSERT_EQ(dense_out.dtype(), pten::DataType::FLOAT32);
  ASSERT_EQ(dense_out.layout(), pten::DataLayout::NCHW);
68 69 70 71 72 73 74 75 76

  auto expect_result = sum;
  auto actual_result0 = dense_out.data<float>()[0];
  auto actual_result1 = dense_out.data<float>()[1];
  auto actual_result2 = dense_out.data<float>()[10];
  ASSERT_NEAR(expect_result[0][0], actual_result0, 1e-6f);
  ASSERT_NEAR(expect_result[0][1], actual_result1, 1e-6f);
  ASSERT_NEAR(expect_result[1][0], actual_result2, 1e-6f);
}
77 78 79

TEST(DEV_API, subtract) {
  // 1. create tensor
80
  const auto alloc = std::make_unique<paddle::experimental::DefaultAllocator>(
81
      paddle::platform::CPUPlace());
82
  pten::DenseTensor dense_x(alloc.get(),
83 84 85 86 87
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({3, 10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_x_data = dense_x.mutable_data<float>();

88
  pten::DenseTensor dense_y(alloc.get(),
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_y_data = dense_y.mutable_data<float>();

  float sub[3][10] = {0.0};
  for (size_t i = 0; i < 3; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      dense_x_data[i * 10 + j] = (i * 10 + j) * 1.0;
      sub[i][j] = (i * 10 + j) * 1.0 - j * 2.0;
    }
  }
  for (size_t i = 0; i < 10; ++i) {
    dense_y_data[i] = i * 2.0;
  }
  int axis = 1;

  // 2. test API
W
Wilber 已提交
107 108
  pten::CPUContext dev_ctx;
  auto dense_out = pten::Subtract<float>(dev_ctx, dense_x, dense_y, axis);
109 110 111 112

  // 3. check result
  ASSERT_EQ(dense_out.dims().size(), 2);
  ASSERT_EQ(dense_out.dims()[0], 3);
113
  ASSERT_EQ(dense_out.dtype(), pten::DataType::FLOAT32);
114 115 116 117 118 119 120 121 122 123
  ASSERT_EQ(dense_out.meta().layout, pten::DataLayout::NCHW);

  auto expect_result = sub;
  auto actual_result0 = dense_out.data<float>()[0];
  auto actual_result1 = dense_out.data<float>()[1];
  auto actual_result2 = dense_out.data<float>()[10];
  ASSERT_NEAR(expect_result[0][0], actual_result0, 1e-6f);
  ASSERT_NEAR(expect_result[0][1], actual_result1, 1e-6f);
  ASSERT_NEAR(expect_result[1][0], actual_result2, 1e-6f);
}
124 125 126

TEST(DEV_API, divide) {
  // 1. create tensor
127
  const auto alloc = std::make_unique<paddle::experimental::DefaultAllocator>(
128
      paddle::platform::CPUPlace());
129
  pten::DenseTensor dense_x(alloc.get(),
130 131 132 133 134
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({3, 10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_x_data = dense_x.mutable_data<float>();

135
  pten::DenseTensor dense_y(alloc.get(),
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_y_data = dense_y.mutable_data<float>();

  float div[3][10] = {0.0};
  for (size_t i = 0; i < 3; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      dense_x_data[i * 10 + j] = (i * 10 + j) * 1.0;
      div[i][j] = (i * 10 + j) * 1.0 / (j * 2.0 + 1);
    }
  }
  for (size_t i = 0; i < 10; ++i) {
    dense_y_data[i] = i * 2.0 + 1;
  }
  int axis = 1;

  // 2. test API
W
Wilber 已提交
154 155
  pten::CPUContext dev_ctx;
  auto dense_out = pten::Divide<float>(dev_ctx, dense_x, dense_y, axis);
156 157 158 159

  // 3. check result
  ASSERT_EQ(dense_out.dims().size(), 2);
  ASSERT_EQ(dense_out.dims()[0], 3);
Y
YuanRisheng 已提交
160 161
  ASSERT_EQ(dense_out.dtype(), pten::DataType::FLOAT32);
  ASSERT_EQ(dense_out.layout(), pten::DataLayout::NCHW);
162 163 164 165 166 167 168 169 170

  auto expect_result = div;
  auto actual_result0 = dense_out.data<float>()[0];
  auto actual_result1 = dense_out.data<float>()[1];
  auto actual_result2 = dense_out.data<float>()[10];
  ASSERT_NEAR(expect_result[0][0], actual_result0, 1e-6f);
  ASSERT_NEAR(expect_result[0][1], actual_result1, 1e-6f);
  ASSERT_NEAR(expect_result[1][0], actual_result2, 1e-6f);
}
171

Y
YuanRisheng 已提交
172 173
TEST(DEV_API, multiply) {
  // 1. create tensor
174
  const auto alloc = std::make_unique<paddle::experimental::DefaultAllocator>(
Y
YuanRisheng 已提交
175
      paddle::platform::CPUPlace());
176
  pten::DenseTensor dense_x(alloc.get(),
Y
YuanRisheng 已提交
177 178 179 180 181
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({3, 10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_x_data = dense_x.mutable_data<float>();

182
  pten::DenseTensor dense_y(alloc.get(),
Y
YuanRisheng 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
                            pten::DenseTensorMeta(pten::DataType::FLOAT32,
                                                  framework::make_ddim({10}),
                                                  pten::DataLayout::NCHW));
  auto* dense_y_data = dense_y.mutable_data<float>();

  float mul[3][10] = {0.0};
  for (size_t i = 0; i < 3; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      dense_x_data[i * 10 + j] = (i * 10 + j) * 1.0;
      mul[i][j] = (i * 10 + j) * 1.0 * j * 2.0;
    }
  }
  for (size_t i = 0; i < 10; ++i) {
    dense_y_data[i] = i * 2.0;
  }
  int axis = 1;

  // 2. test API
W
Wilber 已提交
201 202
  pten::CPUContext dev_ctx;
  auto dense_out = pten::Multiply<float>(dev_ctx, dense_x, dense_y, axis);
Y
YuanRisheng 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217

  // 3. check result
  ASSERT_EQ(dense_out.dims().size(), 2);
  ASSERT_EQ(dense_out.dims()[0], 3);
  ASSERT_EQ(dense_out.dtype(), pten::DataType::FLOAT32);
  ASSERT_EQ(dense_out.layout(), pten::DataLayout::NCHW);

  auto expect_result = mul;
  auto actual_result0 = dense_out.data<float>()[0];
  auto actual_result1 = dense_out.data<float>()[1];
  auto actual_result2 = dense_out.data<float>()[10];
  ASSERT_NEAR(expect_result[0][0], actual_result0, 1e-6f);
  ASSERT_NEAR(expect_result[0][1], actual_result1, 1e-6f);
  ASSERT_NEAR(expect_result[1][0], actual_result2, 1e-6f);
}
218 219
}  // namespace tests
}  // namespace pten