mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
[SYCL-2020 Support] Enabling Intel DPCPP Compiler support to Eigen
This commit is contained in:
committed by
Antonio Sánchez
parent
bae119bb7e
commit
b523120687
@@ -122,6 +122,7 @@ ei_add_test(special_packetmath "-DEIGEN_FAST_MATH=1")
|
||||
|
||||
if(EIGEN_TEST_SYCL)
|
||||
set(EIGEN_SYCL ON)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
# Forward CMake options as preprocessor definitions
|
||||
if(EIGEN_SYCL_USE_DEFAULT_SELECTOR)
|
||||
add_definitions(-DEIGEN_SYCL_USE_DEFAULT_SELECTOR=${EIGEN_SYCL_USE_DEFAULT_SELECTOR})
|
||||
@@ -172,10 +173,7 @@ if(EIGEN_TEST_SYCL)
|
||||
add_definitions(-DEIGEN_SYCL_DISABLE_ARM_GPU_CACHE_OPTIMISATION=${EIGEN_SYCL_DISABLE_ARM_GPU_CACHE_OPTIMISATION})
|
||||
endif()
|
||||
|
||||
if(EIGEN_SYCL_TRISYCL)
|
||||
# triSYCL now requires c++17.
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
else()
|
||||
if(EIGEN_SYCL_ComputeCpp)
|
||||
if(MSVC)
|
||||
list(APPEND COMPUTECPP_USER_FLAGS -DWIN32)
|
||||
else()
|
||||
@@ -193,7 +191,7 @@ if(EIGEN_TEST_SYCL)
|
||||
-no-serial-memop
|
||||
-Xclang
|
||||
-cl-mad-enable)
|
||||
endif()
|
||||
endif(EIGEN_SYCL_ComputeCpp)
|
||||
|
||||
ei_add_test(cxx11_tensor_sycl)
|
||||
ei_add_test(cxx11_tensor_image_op_sycl)
|
||||
@@ -409,4 +407,3 @@ if (EIGEN_TEST_HIP)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
|
||||
@@ -27,17 +27,64 @@ using Eigen::TensorMap;
|
||||
|
||||
// Functions used to compare the TensorMap implementation on the device with
|
||||
// the equivalent on the host
|
||||
namespace cl {
|
||||
namespace sycl {
|
||||
template <typename T> T abs(T x) { return cl::sycl::fabs(x); }
|
||||
namespace SYCL {
|
||||
template <typename T> T abs(T x) {
|
||||
return cl::sycl::abs(x);
|
||||
}
|
||||
|
||||
template <> float abs(float x) {
|
||||
return cl::sycl::fabs(x);
|
||||
}
|
||||
|
||||
template <> double abs(double x) {
|
||||
return cl::sycl::fabs(x);
|
||||
}
|
||||
|
||||
template <typename T> T square(T x) { return x * x; }
|
||||
template <typename T> T cube(T x) { return x * x * x; }
|
||||
template <typename T> T inverse(T x) { return T(1) / x; }
|
||||
template <typename T> T cwiseMax(T x, T y) { return cl::sycl::max(x, y); }
|
||||
template <typename T> T cwiseMin(T x, T y) { return cl::sycl::min(x, y); }
|
||||
template <typename T> T cwiseMax(T x, T y) {
|
||||
return cl::sycl::max(x, y);
|
||||
}
|
||||
template <typename T> T cwiseMin(T x, T y) {
|
||||
return cl::sycl::min(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define DECLARE_UNARY_STRUCT_NON_SYCL(FUNC) \
|
||||
struct op_##FUNC { \
|
||||
template <typename T> \
|
||||
auto operator()(const T& x) { \
|
||||
return SYCL::FUNC(x); \
|
||||
} \
|
||||
template <typename T> \
|
||||
auto operator()(const TensorMap<T>& x) { \
|
||||
return x.FUNC(); \
|
||||
} \
|
||||
};
|
||||
|
||||
DECLARE_UNARY_STRUCT_NON_SYCL(abs)
|
||||
DECLARE_UNARY_STRUCT_NON_SYCL(square)
|
||||
DECLARE_UNARY_STRUCT_NON_SYCL(cube)
|
||||
DECLARE_UNARY_STRUCT_NON_SYCL(inverse)
|
||||
|
||||
#define DECLARE_BINARY_STRUCT_NON_SYCL(FUNC) \
|
||||
struct op_##FUNC { \
|
||||
template <typename T1, typename T2> \
|
||||
auto operator()(const T1& x, const T2& y){ \
|
||||
return SYCL::FUNC(x, y); \
|
||||
} \
|
||||
template <typename T1, typename T2> \
|
||||
auto operator()(const TensorMap<T1>& x, const TensorMap<T2>& y) { \
|
||||
return x.FUNC(y); \
|
||||
} \
|
||||
};
|
||||
|
||||
DECLARE_BINARY_STRUCT_NON_SYCL(cwiseMax)
|
||||
DECLARE_BINARY_STRUCT_NON_SYCL(cwiseMin)
|
||||
|
||||
|
||||
struct EqualAssignment {
|
||||
template <typename Lhs, typename Rhs>
|
||||
void operator()(Lhs& lhs, const Rhs& rhs) { lhs = rhs; }
|
||||
@@ -119,12 +166,9 @@ void test_unary_builtins_for_scalar(const Eigen::SyclDevice& sycl_device,
|
||||
} \
|
||||
};
|
||||
|
||||
DECLARE_UNARY_STRUCT(abs)
|
||||
|
||||
DECLARE_UNARY_STRUCT(sqrt)
|
||||
DECLARE_UNARY_STRUCT(rsqrt)
|
||||
DECLARE_UNARY_STRUCT(square)
|
||||
DECLARE_UNARY_STRUCT(cube)
|
||||
DECLARE_UNARY_STRUCT(inverse)
|
||||
DECLARE_UNARY_STRUCT(tanh)
|
||||
DECLARE_UNARY_STRUCT(exp)
|
||||
DECLARE_UNARY_STRUCT(expm1)
|
||||
@@ -288,8 +332,6 @@ void test_binary_builtins_fixed_arg2(const Eigen::SyclDevice& sycl_device,
|
||||
} \
|
||||
};
|
||||
|
||||
DECLARE_BINARY_STRUCT(cwiseMax)
|
||||
DECLARE_BINARY_STRUCT(cwiseMin)
|
||||
|
||||
#define DECLARE_BINARY_STRUCT_OP(NAME, OPERATOR) \
|
||||
struct op_##NAME { \
|
||||
|
||||
@@ -23,6 +23,13 @@
|
||||
#include <stdint.h>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef SYCL_COMPILER_IS_DPCPP
|
||||
template <typename T>
|
||||
struct cl::sycl::is_device_copyable<
|
||||
const OffByOneScalar<T>,
|
||||
std::enable_if_t<!std::is_trivially_copyable<const OffByOneScalar<T>>::value>> : std::true_type {};
|
||||
#endif
|
||||
|
||||
template <typename DataType, int DataLayout, typename IndexType>
|
||||
void test_device_memory(const Eigen::SyclDevice &sycl_device) {
|
||||
IndexType sizeDim1 = 100;
|
||||
|
||||
Reference in New Issue
Block a user