cxx11_tensor_random_gpu.cu (2355B)
1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #define EIGEN_TEST_NO_LONGDOUBLE 11 #define EIGEN_TEST_NO_COMPLEX 12 13 #define EIGEN_DEFAULT_DENSE_INDEX_TYPE int 14 #define EIGEN_USE_GPU 15 16 #include "main.h" 17 #include <Eigen/CXX11/Tensor> 18 19 #include <Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h> 20 21 void test_gpu_random_uniform() 22 { 23 Tensor<float, 2> out(72,97); 24 out.setZero(); 25 26 std::size_t out_bytes = out.size() * sizeof(float); 27 28 float* d_out; 29 gpuMalloc((void**)(&d_out), out_bytes); 30 31 Eigen::GpuStreamDevice stream; 32 Eigen::GpuDevice gpu_device(&stream); 33 34 Eigen::TensorMap<Eigen::Tensor<float, 2> > gpu_out(d_out, 72,97); 35 36 gpu_out.device(gpu_device) = gpu_out.random(); 37 38 assert(gpuMemcpyAsync(out.data(), d_out, out_bytes, gpuMemcpyDeviceToHost, gpu_device.stream()) == gpuSuccess); 39 assert(gpuStreamSynchronize(gpu_device.stream()) == gpuSuccess); 40 41 // For now we just check this code doesn't crash. 42 // TODO: come up with a valid test of randomness 43 } 44 45 46 void test_gpu_random_normal() 47 { 48 Tensor<float, 2> out(72,97); 49 out.setZero(); 50 51 std::size_t out_bytes = out.size() * sizeof(float); 52 53 float* d_out; 54 gpuMalloc((void**)(&d_out), out_bytes); 55 56 Eigen::GpuStreamDevice stream; 57 Eigen::GpuDevice gpu_device(&stream); 58 59 Eigen::TensorMap<Eigen::Tensor<float, 2> > gpu_out(d_out, 72,97); 60 61 Eigen::internal::NormalRandomGenerator<float> gen(true); 62 gpu_out.device(gpu_device) = gpu_out.random(gen); 63 64 assert(gpuMemcpyAsync(out.data(), d_out, out_bytes, gpuMemcpyDeviceToHost, gpu_device.stream()) == gpuSuccess); 65 assert(gpuStreamSynchronize(gpu_device.stream()) == gpuSuccess); 66 } 67 68 static void test_complex() 69 { 70 Tensor<std::complex<float>, 1> vec(6); 71 vec.setRandom(); 72 73 // Fixme: we should check that the generated numbers follow a uniform 74 // distribution instead. 75 for (int i = 1; i < 6; ++i) { 76 VERIFY_IS_NOT_EQUAL(vec(i), vec(i-1)); 77 } 78 } 79 80 81 EIGEN_DECLARE_TEST(cxx11_tensor_random_gpu) 82 { 83 CALL_SUBTEST(test_gpu_random_uniform()); 84 CALL_SUBTEST(test_gpu_random_normal()); 85 CALL_SUBTEST(test_complex()); 86 }