2016-09-19 19:44:13 +08:00
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
2016-09-19 21:09:25 +08:00
// Copyright (C) 2016
// Mehdi Goli Codeplay Software Ltd.
// Ralph Potter Codeplay Software Ltd.
// Luke Iwanski Codeplay Software Ltd.
// Contact: <eigen@codeplay.com>
2016-09-19 19:44:13 +08:00
//
// 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
2016-10-06 05:24:24 +08:00
# define EIGEN_TEST_FUNC cxx11_tensor_device_sycl
2016-09-19 19:44:13 +08:00
# define EIGEN_DEFAULT_DENSE_INDEX_TYPE int
# define EIGEN_USE_SYCL
# include "main.h"
# include <unsupported/Eigen/CXX11/Tensor>
2016-11-19 04:37:13 +08:00
# include <stdint.h>
# include <iostream>
2016-09-19 19:44:13 +08:00
2016-11-19 00:20:42 +08:00
template < typename DataType , int DataLayout >
2016-11-19 04:37:13 +08:00
void test_device_memory ( const Eigen : : SyclDevice & sycl_device ) {
std : : cout < < " Running on : "
< < sycl_device . sycl_queue ( ) . get_device ( ) . template get_info < cl : : sycl : : info : : device : : name > ( )
< < std : : endl ;
2016-11-11 02:45:12 +08:00
int sizeDim1 = 100 ;
array < int , 1 > tensorRange = { { sizeDim1 } } ;
2016-11-19 00:20:42 +08:00
Tensor < DataType , 1 , DataLayout > in ( tensorRange ) ;
Tensor < DataType , 1 , DataLayout > in1 ( tensorRange ) ;
2016-11-19 08:58:09 +08:00
memset ( in1 . data ( ) , 1 , in1 . size ( ) * sizeof ( DataType ) ) ;
DataType * gpu_in_data = static_cast < DataType * > ( sycl_device . allocate ( in . size ( ) * sizeof ( DataType ) ) ) ;
sycl_device . memset ( gpu_in_data , 1 , in . size ( ) * sizeof ( DataType ) ) ;
sycl_device . memcpyDeviceToHost ( in . data ( ) , gpu_in_data , in . size ( ) * sizeof ( DataType ) ) ;
2016-11-18 12:27:54 +08:00
for ( int i = 0 ; i < in . size ( ) ; i + + ) {
2016-11-19 04:37:13 +08:00
VERIFY_IS_EQUAL ( in ( i ) , in1 ( i ) ) ;
2016-11-18 12:27:54 +08:00
}
2016-11-11 02:45:12 +08:00
sycl_device . deallocate ( gpu_in_data ) ;
2016-09-19 19:44:13 +08:00
}
2016-11-18 12:27:54 +08:00
2016-11-19 00:20:42 +08:00
template < typename DataType , int DataLayout >
2016-11-18 12:27:54 +08:00
void test_device_exceptions ( const Eigen : : SyclDevice & sycl_device ) {
2016-11-19 00:34:54 +08:00
VERIFY ( sycl_device . ok ( ) ) ;
2016-11-19 00:20:42 +08:00
int sizeDim1 = 100 ;
array < int , 1 > tensorDims = { { sizeDim1 } } ;
DataType * gpu_data = static_cast < DataType * > ( sycl_device . allocate ( sizeDim1 * sizeof ( DataType ) ) ) ;
2016-11-19 08:58:09 +08:00
sycl_device . memset ( gpu_data , 1 , sizeDim1 * sizeof ( DataType ) ) ;
2016-11-19 00:34:54 +08:00
2016-11-19 08:58:09 +08:00
TensorMap < Tensor < DataType , 1 , DataLayout > > in ( gpu_data , tensorDims ) ;
TensorMap < Tensor < DataType , 1 , DataLayout > > out ( gpu_data , tensorDims ) ;
2016-11-19 00:34:54 +08:00
out . device ( sycl_device ) = in / in . constant ( 0 ) ;
2016-11-19 08:58:09 +08:00
sycl_device . synchronize ( ) ;
2016-11-19 00:34:54 +08:00
VERIFY ( ! sycl_device . ok ( ) ) ;
2016-11-18 12:27:54 +08:00
sycl_device . deallocate ( gpu_data ) ;
}
2016-11-19 08:43:27 +08:00
template < typename DataType > void sycl_device_test_per_device ( const cl : : sycl : : device & d ) {
std : : cout < < " Running on " < < d . template get_info < cl : : sycl : : info : : device : : name > ( ) < < std : : endl ;
QueueInterface queueInterface ( d ) ;
2016-11-19 00:20:42 +08:00
auto sycl_device = Eigen : : SyclDevice ( & queueInterface ) ;
2016-11-19 04:37:13 +08:00
test_device_memory < DataType , RowMajor > ( sycl_device ) ;
test_device_memory < DataType , ColMajor > ( sycl_device ) ;
/// this test throw an exception. enable it if you want to see the exception
//test_device_exceptions<DataType, RowMajor>(sycl_device);
/// this test throw an exception. enable it if you want to see the exception
//test_device_exceptions<DataType, ColMajor>(sycl_device);
2016-11-19 00:20:42 +08:00
}
2016-11-18 12:27:54 +08:00
2016-10-06 05:24:24 +08:00
void test_cxx11_tensor_device_sycl ( ) {
2016-11-19 08:43:27 +08:00
for ( const auto & device : cl : : sycl : : device : : get_devices ( ) ) {
2016-11-24 00:30:41 +08:00
/// get_devices returns all the available opencl devices. Either use device_selector or exclude devices that computecpp does not support (AMD OpenCL for CPU )
auto s = device . template get_info < cl : : sycl : : info : : device : : vendor > ( ) ;
std : : transform ( s . begin ( ) , s . end ( ) , s . begin ( ) , : : tolower ) ;
if ( ! device . is_cpu ( ) | | s . find ( " amd " ) = = std : : string : : npos )
CALL_SUBTEST ( sycl_device_test_per_device < float > ( device ) ) ;
2016-11-19 08:43:27 +08:00
}
2016-09-19 19:44:13 +08:00
}