2015-07-08 08:40:49 +08:00
|
|
|
// This file is part of Eigen, a lightweight C++ template library
|
|
|
|
// for linear algebra.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
|
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the Mozilla
|
|
|
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
|
|
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
#define EIGEN_TEST_NO_LONGDOUBLE
|
|
|
|
#define EIGEN_TEST_NO_COMPLEX
|
2018-07-17 20:46:15 +08:00
|
|
|
|
2015-07-08 08:40:49 +08:00
|
|
|
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE int
|
|
|
|
#define EIGEN_USE_GPU
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
#include <Eigen/CXX11/Tensor>
|
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
#include <Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h>
|
2016-05-12 01:05:56 +08:00
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
void test_gpu_random_uniform()
|
2016-05-12 01:05:56 +08:00
|
|
|
{
|
|
|
|
Tensor<float, 2> out(72,97);
|
|
|
|
out.setZero();
|
|
|
|
|
|
|
|
std::size_t out_bytes = out.size() * sizeof(float);
|
|
|
|
|
|
|
|
float* d_out;
|
2018-06-21 04:44:58 +08:00
|
|
|
gpuMalloc((void**)(&d_out), out_bytes);
|
2016-05-12 01:05:56 +08:00
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
Eigen::GpuStreamDevice stream;
|
2016-05-12 01:05:56 +08:00
|
|
|
Eigen::GpuDevice gpu_device(&stream);
|
|
|
|
|
|
|
|
Eigen::TensorMap<Eigen::Tensor<float, 2> > gpu_out(d_out, 72,97);
|
|
|
|
|
|
|
|
gpu_out.device(gpu_device) = gpu_out.random();
|
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
assert(gpuMemcpyAsync(out.data(), d_out, out_bytes, gpuMemcpyDeviceToHost, gpu_device.stream()) == gpuSuccess);
|
|
|
|
assert(gpuStreamSynchronize(gpu_device.stream()) == gpuSuccess);
|
2016-05-12 01:05:56 +08:00
|
|
|
|
2018-06-07 20:43:02 +08:00
|
|
|
// For now we just check this code doesn't crash.
|
2016-05-12 01:05:56 +08:00
|
|
|
// TODO: come up with a valid test of randomness
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
void test_gpu_random_normal()
|
2016-05-12 01:05:56 +08:00
|
|
|
{
|
|
|
|
Tensor<float, 2> out(72,97);
|
|
|
|
out.setZero();
|
|
|
|
|
|
|
|
std::size_t out_bytes = out.size() * sizeof(float);
|
|
|
|
|
|
|
|
float* d_out;
|
2018-06-21 04:44:58 +08:00
|
|
|
gpuMalloc((void**)(&d_out), out_bytes);
|
2016-05-12 01:05:56 +08:00
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
Eigen::GpuStreamDevice stream;
|
2016-05-12 01:05:56 +08:00
|
|
|
Eigen::GpuDevice gpu_device(&stream);
|
|
|
|
|
|
|
|
Eigen::TensorMap<Eigen::Tensor<float, 2> > gpu_out(d_out, 72,97);
|
|
|
|
|
|
|
|
Eigen::internal::NormalRandomGenerator<float> gen(true);
|
|
|
|
gpu_out.device(gpu_device) = gpu_out.random(gen);
|
|
|
|
|
2018-06-21 04:44:58 +08:00
|
|
|
assert(gpuMemcpyAsync(out.data(), d_out, out_bytes, gpuMemcpyDeviceToHost, gpu_device.stream()) == gpuSuccess);
|
|
|
|
assert(gpuStreamSynchronize(gpu_device.stream()) == gpuSuccess);
|
2016-05-12 01:05:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_complex()
|
2015-07-08 08:40:49 +08:00
|
|
|
{
|
|
|
|
Tensor<std::complex<float>, 1> vec(6);
|
|
|
|
vec.setRandom();
|
|
|
|
|
|
|
|
// Fixme: we should check that the generated numbers follow a uniform
|
|
|
|
// distribution instead.
|
|
|
|
for (int i = 1; i < 6; ++i) {
|
|
|
|
VERIFY_IS_NOT_EQUAL(vec(i), vec(i-1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-07-18 02:16:48 +08:00
|
|
|
EIGEN_DECLARE_TEST(cxx11_tensor_random_gpu)
|
2015-07-08 08:40:49 +08:00
|
|
|
{
|
2018-06-21 04:44:58 +08:00
|
|
|
CALL_SUBTEST(test_gpu_random_uniform());
|
|
|
|
CALL_SUBTEST(test_gpu_random_normal());
|
2016-05-12 01:05:56 +08:00
|
|
|
CALL_SUBTEST(test_complex());
|
2015-07-08 08:40:49 +08:00
|
|
|
}
|