cxx11_tensor_random_sycl.cpp (3568B)
1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2016 5 // Mehdi Goli Codeplay Software Ltd. 6 // Ralph Potter Codeplay Software Ltd. 7 // Luke Iwanski Codeplay Software Ltd. 8 // Contact: <eigen@codeplay.com> 9 // 10 // This Source Code Form is subject to the terms of the Mozilla 11 // Public License v. 2.0. If a copy of the MPL was not distributed 12 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 13 14 #define EIGEN_TEST_NO_LONGDOUBLE 15 #define EIGEN_TEST_NO_COMPLEX 16 #define EIGEN_DEFAULT_DENSE_INDEX_TYPE int64_t 17 #define EIGEN_USE_SYCL 18 19 #include "main.h" 20 #include <unsupported/Eigen/CXX11/Tensor> 21 22 template <typename DataType, int DataLayout, typename IndexType> 23 static void test_sycl_random_uniform(const Eigen::SyclDevice& sycl_device) 24 { 25 Tensor<DataType, 2,DataLayout, IndexType> out(72,97); 26 out.setZero(); 27 28 std::size_t out_bytes = out.size() * sizeof(DataType); 29 30 IndexType sizeDim0 = 72; 31 IndexType sizeDim1 = 97; 32 33 array<IndexType, 2> tensorRange = {{sizeDim0, sizeDim1}}; 34 35 DataType* d_out = static_cast<DataType*>(sycl_device.allocate(out_bytes)); 36 TensorMap<Tensor<DataType, 2, DataLayout, IndexType>> gpu_out(d_out, tensorRange); 37 38 gpu_out.device(sycl_device)=gpu_out.random(); 39 sycl_device.memcpyDeviceToHost(out.data(), d_out,out_bytes); 40 for(IndexType i=1; i<sizeDim0; i++) 41 for(IndexType j=1; j<sizeDim1; j++) 42 { 43 VERIFY_IS_NOT_EQUAL(out(i,j), out(i-1,j)); 44 VERIFY_IS_NOT_EQUAL(out(i,j), out(i,j-1)); 45 VERIFY_IS_NOT_EQUAL(out(i,j), out(i-1,j-1)); } 46 47 // For now we just check thes code doesn't crash. 48 // TODO: come up with a valid test of randomness 49 sycl_device.deallocate(d_out); 50 } 51 52 template <typename DataType, int DataLayout, typename IndexType> 53 void test_sycl_random_normal(const Eigen::SyclDevice& sycl_device) 54 { 55 Tensor<DataType, 2,DataLayout,IndexType> out(72,97); 56 out.setZero(); 57 std::size_t out_bytes = out.size() * sizeof(DataType); 58 59 IndexType sizeDim0 = 72; 60 IndexType sizeDim1 = 97; 61 62 array<IndexType, 2> tensorRange = {{sizeDim0, sizeDim1}}; 63 64 DataType* d_out = static_cast<DataType*>(sycl_device.allocate(out_bytes)); 65 TensorMap<Tensor<DataType, 2, DataLayout, IndexType>> gpu_out(d_out, tensorRange); 66 Eigen::internal::NormalRandomGenerator<DataType> gen(true); 67 gpu_out.device(sycl_device)=gpu_out.random(gen); 68 sycl_device.memcpyDeviceToHost(out.data(), d_out,out_bytes); 69 for(IndexType i=1; i<sizeDim0; i++) 70 for(IndexType j=1; j<sizeDim1; j++) 71 { 72 VERIFY_IS_NOT_EQUAL(out(i,j), out(i-1,j)); 73 VERIFY_IS_NOT_EQUAL(out(i,j), out(i,j-1)); 74 VERIFY_IS_NOT_EQUAL(out(i,j), out(i-1,j-1)); 75 76 } 77 78 // For now we just check thes code doesn't crash. 79 // TODO: come up with a valid test of randomness 80 sycl_device.deallocate(d_out); 81 } 82 83 template<typename DataType, typename dev_Selector> void sycl_random_test_per_device(dev_Selector s){ 84 QueueInterface queueInterface(s); 85 auto sycl_device = Eigen::SyclDevice(&queueInterface); 86 test_sycl_random_uniform<DataType, RowMajor, int64_t>(sycl_device); 87 test_sycl_random_uniform<DataType, ColMajor, int64_t>(sycl_device); 88 test_sycl_random_normal<DataType, RowMajor, int64_t>(sycl_device); 89 test_sycl_random_normal<DataType, ColMajor, int64_t>(sycl_device); 90 91 } 92 EIGEN_DECLARE_TEST(cxx11_tensor_random_sycl) 93 { 94 for (const auto& device :Eigen::get_sycl_supported_devices()) { 95 CALL_SUBTEST(sycl_random_test_per_device<float>(device)); 96 #ifdef EIGEN_SYCL_DOUBLE_SUPPORT 97 CALL_SUBTEST(sycl_random_test_per_device<double>(device)); 98 #endif 99 } 100 }