tensor_util_test.cu 9.1 KB
Newer Older
Y
Yang Yu 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2016 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. */

Y
Yi Wang 已提交
15
#include "paddle/fluid/framework/tensor_util.h"
16
#include "gtest/gtest.h"
17
#include "paddle/fluid/operators/isfinite_op.h"
Y
Yi Wang 已提交
18 19
#include "paddle/fluid/platform/device_context.h"
#include "paddle/fluid/platform/place.h"
Y
Yang Yu 已提交
20 21 22 23 24 25 26 27 28

namespace paddle {
namespace framework {

static __global__ void FillNAN(float* buf) {
  buf[0] = 0.0;
  buf[1] = 0.1;
  buf[2] = NAN;
}
29

Y
Yang Yu 已提交
30
static __global__ void FillInf(float* buf) {
31 32 33
  buf[0] = INFINITY;
  buf[1] = 0.1;
  buf[2] = 0.2;
Y
Yang Yu 已提交
34 35
}

36 37 38 39 40 41 42 43 44 45 46 47
static __global__ void FillNAN(platform::float16* buf) {
  buf[0] = 0.0;
  buf[1] = 0.1;
  buf[2].x = 0x7fff;
}

static __global__ void FillInf(platform::float16* buf) {
  buf[0] = 0.0;
  buf[1].x = 0x7c00;
  buf[2] = 0.5;
}

48 49 50 51 52 53 54 55 56 57 58 59
static __global__ void FillFinite(float* buf) {
  buf[0] = 0.0;
  buf[1] = 0.1;
  buf[2] = 0.2;
}

static __global__ void FillFinite(platform::float16* buf) {
  buf[0] = 0.0;
  buf[1] = 0.1;
  buf[2] = 0.2;
}

Y
Yi Wang 已提交
60
TEST(TensorContainsNAN, GPU) {
61 62
  paddle::platform::CUDAPlace gpu(0);
  auto& pool = paddle::platform::DeviceContextPool::Instance();
Y
Yang Yu 已提交
63
  auto* cuda_ctx = pool.GetByPlace(gpu);
64 65 66
  {
    Tensor tensor;
    float* buf = tensor.mutable_data<float>({3}, gpu);
67 68 69
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
70
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
71
#endif
72 73 74 75 76
    cuda_ctx->Wait();
    ASSERT_TRUE(TensorContainsNAN(tensor));
  }
  {
    Tensor tensor;
A
Abhinav Arora 已提交
77 78
    paddle::platform::float16* buf =
        tensor.mutable_data<paddle::platform::float16>({3}, gpu);
79 80 81
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
82
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
83
#endif
84 85 86
    cuda_ctx->Wait();
    ASSERT_TRUE(TensorContainsNAN(tensor));
  }
Y
Yang Yu 已提交
87 88
}

Y
Yi Wang 已提交
89
TEST(TensorContainsInf, GPU) {
90 91
  paddle::platform::CUDAPlace gpu(0);
  auto& pool = paddle::platform::DeviceContextPool::Instance();
Y
Yang Yu 已提交
92
  auto* cuda_ctx = pool.GetByPlace(gpu);
93 94 95
  {
    Tensor tensor;
    float* buf = tensor.mutable_data<float>({3}, gpu);
96 97 98
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
99
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
100
#endif
101 102 103 104 105
    cuda_ctx->Wait();
    ASSERT_TRUE(TensorContainsInf(tensor));
  }
  {
    Tensor tensor;
A
Abhinav Arora 已提交
106 107
    paddle::platform::float16* buf =
        tensor.mutable_data<paddle::platform::float16>({3}, gpu);
108 109 110
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
111
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
112
#endif
113 114 115
    cuda_ctx->Wait();
    ASSERT_TRUE(TensorContainsInf(tensor));
  }
Y
Yang Yu 已提交
116 117
}

118 119 120 121 122 123 124 125 126
TEST(TensorIsfinite, GPU) {
  paddle::platform::CUDAPlace gpu(0);
  using paddle::platform::float16;
  auto& pool = paddle::platform::DeviceContextPool::Instance();
  auto* cuda_ctx = pool.GetByPlace(gpu);
  // contains inf
  {
    Tensor tensor;
    float* buf = tensor.mutable_data<float>({3}, gpu);
127 128 129
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
130
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
131
#endif
132 133 134 135 136 137
    cuda_ctx->Wait();
    EXPECT_TRUE(!TensorIsfinite(tensor));
  }
  {
    Tensor tensor;
    float16* buf = tensor.mutable_data<float16>({3}, gpu);
138 139 140
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
141
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
142
#endif
143 144 145 146 147 148 149 150
    cuda_ctx->Wait();
    EXPECT_TRUE(!TensorIsfinite(tensor));
  }

  // contains nan
  {
    Tensor tensor;
    float* buf = tensor.mutable_data<float>({3}, gpu);
151 152 153
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
154
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
155
#endif
156 157 158 159 160 161
    cuda_ctx->Wait();
    EXPECT_TRUE(!TensorIsfinite(tensor));
  }
  {
    Tensor tensor;
    float16* buf = tensor.mutable_data<float16>({3}, gpu);
162 163 164
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
165
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
166
#endif
167 168 169 170 171 172 173 174
    cuda_ctx->Wait();
    EXPECT_TRUE(!TensorIsfinite(tensor));
  }

  // all element are finite
  {
    Tensor tensor;
    float* buf = tensor.mutable_data<float>({3}, gpu);
175
#ifdef PADDLE_WITH_HIP
176 177
    hipLaunchKernelGGL(
        FillFinite, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
178
#else
179
    FillFinite<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
180
#endif
181 182 183 184 185 186
    cuda_ctx->Wait();
    EXPECT_TRUE(TensorIsfinite(tensor));
  }
  {
    Tensor tensor;
    float16* buf = tensor.mutable_data<float16>({3}, gpu);
187
#ifdef PADDLE_WITH_HIP
188 189
    hipLaunchKernelGGL(
        FillFinite, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
190
#else
191
    FillFinite<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
192
#endif
193 194 195 196 197 198 199 200 201 202 203 204
    cuda_ctx->Wait();
    EXPECT_TRUE(TensorIsfinite(tensor));
  }
}

TEST(TensorContainsInf, GPUWithoutWait) {
  paddle::platform::CUDAPlace gpu(0);
  auto& pool = paddle::platform::DeviceContextPool::Instance();
  auto* cuda_ctx = pool.GetByPlace(gpu);
  {
    Tensor tensor, out;
    float* buf = tensor.mutable_data<float>({3}, gpu);
205 206 207
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
208
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
209
#endif
210 211 212 213 214 215 216 217 218 219 220 221
    cuda_ctx->Wait();
    TensorContainsInf(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    ASSERT_EQ(tmp.data<bool>()[0], true);
  }
  {
    Tensor tensor, out;
    paddle::platform::float16* buf =
        tensor.mutable_data<paddle::platform::float16>({3}, gpu);
222 223 224
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
225
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
226
#endif
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
    cuda_ctx->Wait();
    TensorContainsInf(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    ASSERT_EQ(tmp.data<bool>()[0], true);
  }
}

TEST(TensorContainsNAN, GPUWithoutWait) {
  paddle::platform::CUDAPlace gpu(0);
  auto& pool = paddle::platform::DeviceContextPool::Instance();
  auto* cuda_ctx = pool.GetByPlace(gpu);
  {
    Tensor tensor, out;
    float* buf = tensor.mutable_data<float>({3}, gpu);
244 245 246
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
247
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
248
#endif
249 250 251 252 253 254 255 256 257 258 259 260
    cuda_ctx->Wait();
    TensorContainsNAN(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    ASSERT_EQ(tmp.data<bool>()[0], true);
  }
  {
    Tensor tensor, out;
    paddle::platform::float16* buf =
        tensor.mutable_data<paddle::platform::float16>({3}, gpu);
261 262 263
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
264
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
265
#endif
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
    cuda_ctx->Wait();
    TensorContainsNAN(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    ASSERT_EQ(tmp.data<bool>()[0], true);
  }
}

TEST(TensorIsfinite, GPUWithoutWait) {
  paddle::platform::CUDAPlace gpu(0);
  auto& pool = paddle::platform::DeviceContextPool::Instance();
  auto* cuda_ctx = pool.GetByPlace(gpu);
  {
    Tensor tensor, out;
    float* buf = tensor.mutable_data<float>({3}, gpu);
283 284 285
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillInf, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
286
    FillInf<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
287
#endif
288 289 290 291 292 293 294 295 296 297 298
    cuda_ctx->Wait();
    TensorIsfinite(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    EXPECT_EQ(tmp.data<bool>()[0], false);
  }
  {
    Tensor tensor, out;
    float* buf = tensor.mutable_data<float>({3}, gpu);
299 300 301
#ifdef PADDLE_WITH_HIP
    hipLaunchKernelGGL(FillNAN, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
#else
302
    FillNAN<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
303
#endif
304 305 306 307 308 309 310 311 312 313 314
    cuda_ctx->Wait();
    TensorIsfinite(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    EXPECT_EQ(tmp.data<bool>()[0], false);
  }
  {
    Tensor tensor, out;
    float* buf = tensor.mutable_data<float>({3}, gpu);
315
#ifdef PADDLE_WITH_HIP
316 317
    hipLaunchKernelGGL(
        FillFinite, dim3(1), dim3(1), 0, cuda_ctx->stream(), buf);
318
#else
319
    FillFinite<<<1, 1, 0, cuda_ctx->stream()>>>(buf);
320
#endif
321 322 323 324 325 326 327 328 329 330
    cuda_ctx->Wait();
    TensorIsfinite(tensor, &out);
    platform::CPUPlace cpu;
    Tensor tmp;
    TensorCopy(out, cpu, *cuda_ctx, &tmp);
    cuda_ctx->Wait();
    EXPECT_EQ(tmp.data<bool>()[0], true);
  }
}

Y
Yang Yu 已提交
331 332
}  // namespace framework
}  // namespace paddle