mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-15 07:10:37 +08:00
merge
This commit is contained in:
commit
32d95e86c9
@ -262,7 +262,7 @@ template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_mul<half2>(c
|
|||||||
#else
|
#else
|
||||||
float a1 = __low2float(a);
|
float a1 = __low2float(a);
|
||||||
float a2 = __high2float(a);
|
float a2 = __high2float(a);
|
||||||
return Eigen::half(internal::raw_uint16_to_half(__float2half_rn(a1 * a2)));
|
return Eigen::half(half_impl::raw_uint16_to_half(__float2half_rn(a1 * a2)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +71,18 @@ namespace Eigen {
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
Real test_precision<Real>() { return 1e-50; }
|
Real test_precision<Real>() { return 1e-50; }
|
||||||
|
|
||||||
|
// needed in C++93 mode where number does not support explicit cast.
|
||||||
|
namespace internal {
|
||||||
|
template<typename NewType>
|
||||||
|
struct cast_impl<Real,NewType>
|
||||||
|
{
|
||||||
|
static inline NewType run(const Real& x)
|
||||||
|
{
|
||||||
|
return x.template convert_to<NewType>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
@ -21,6 +21,7 @@ using Eigen::Tensor;
|
|||||||
|
|
||||||
#ifdef EIGEN_HAS_CUDA_FP16
|
#ifdef EIGEN_HAS_CUDA_FP16
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_conversion() {
|
void test_cuda_conversion() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -55,7 +56,7 @@ void test_cuda_conversion() {
|
|||||||
gpu_device.deallocate(d_conv);
|
gpu_device.deallocate(d_conv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_unary() {
|
void test_cuda_unary() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -92,7 +93,7 @@ void test_cuda_unary() {
|
|||||||
gpu_device.deallocate(d_res_float);
|
gpu_device.deallocate(d_res_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_elementwise() {
|
void test_cuda_elementwise() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -134,6 +135,7 @@ void test_cuda_elementwise() {
|
|||||||
gpu_device.deallocate(d_res_float);
|
gpu_device.deallocate(d_res_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_trancendental() {
|
void test_cuda_trancendental() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -186,7 +188,10 @@ void test_cuda_trancendental() {
|
|||||||
}
|
}
|
||||||
for (int i = 0; i < num_elem; ++i) {
|
for (int i = 0; i < num_elem; ++i) {
|
||||||
std::cout << "Checking elemwise log " << i << " input = " << input2(i) << " full = " << full_prec2(i) << " half = " << half_prec2(i) << std::endl;
|
std::cout << "Checking elemwise log " << i << " input = " << input2(i) << " full = " << full_prec2(i) << " half = " << half_prec2(i) << std::endl;
|
||||||
VERIFY_IS_APPROX(full_prec2(i), half_prec2(i));
|
if(std::abs(input2(i)-1.f)<0.05f) // log lacks accurary nearby 1
|
||||||
|
VERIFY_IS_APPROX(full_prec2(i)+Eigen::half(0.1f), half_prec2(i)+Eigen::half(0.1f));
|
||||||
|
else
|
||||||
|
VERIFY_IS_APPROX(full_prec2(i), half_prec2(i));
|
||||||
}
|
}
|
||||||
gpu_device.deallocate(d_float1);
|
gpu_device.deallocate(d_float1);
|
||||||
gpu_device.deallocate(d_float2);
|
gpu_device.deallocate(d_float2);
|
||||||
@ -196,7 +201,7 @@ void test_cuda_trancendental() {
|
|||||||
gpu_device.deallocate(d_res2_float);
|
gpu_device.deallocate(d_res2_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_contractions() {
|
void test_cuda_contractions() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -247,7 +252,7 @@ void test_cuda_contractions() {
|
|||||||
gpu_device.deallocate(d_res_float);
|
gpu_device.deallocate(d_res_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_reductions(int size1, int size2, int redux) {
|
void test_cuda_reductions(int size1, int size2, int redux) {
|
||||||
|
|
||||||
std::cout << "Reducing " << size1 << " by " << size2
|
std::cout << "Reducing " << size1 << " by " << size2
|
||||||
@ -296,17 +301,19 @@ void test_cuda_reductions(int size1, int size2, int redux) {
|
|||||||
gpu_device.deallocate(d_res_float);
|
gpu_device.deallocate(d_res_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_reductions() {
|
void test_cuda_reductions() {
|
||||||
test_cuda_reductions(13, 13, 0);
|
test_cuda_reductions<void>(13, 13, 0);
|
||||||
test_cuda_reductions(13, 13, 1);
|
test_cuda_reductions<void>(13, 13, 1);
|
||||||
|
|
||||||
test_cuda_reductions(35, 36, 0);
|
test_cuda_reductions<void>(35, 36, 0);
|
||||||
test_cuda_reductions(35, 36, 1);
|
test_cuda_reductions<void>(35, 36, 1);
|
||||||
|
|
||||||
test_cuda_reductions(36, 35, 0);
|
test_cuda_reductions<void>(36, 35, 0);
|
||||||
test_cuda_reductions(36, 35, 1);
|
test_cuda_reductions<void>(36, 35, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_full_reductions() {
|
void test_cuda_full_reductions() {
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
Eigen::GpuDevice gpu_device(&stream);
|
Eigen::GpuDevice gpu_device(&stream);
|
||||||
@ -355,7 +362,7 @@ void test_cuda_full_reductions() {
|
|||||||
gpu_device.deallocate(d_res_float);
|
gpu_device.deallocate(d_res_float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename>
|
||||||
void test_cuda_forced_evals() {
|
void test_cuda_forced_evals() {
|
||||||
|
|
||||||
Eigen::CudaStreamDevice stream;
|
Eigen::CudaStreamDevice stream;
|
||||||
@ -409,14 +416,14 @@ void test_cuda_forced_evals() {
|
|||||||
void test_cxx11_tensor_of_float16_cuda()
|
void test_cxx11_tensor_of_float16_cuda()
|
||||||
{
|
{
|
||||||
#ifdef EIGEN_HAS_CUDA_FP16
|
#ifdef EIGEN_HAS_CUDA_FP16
|
||||||
CALL_SUBTEST_1(test_cuda_conversion());
|
CALL_SUBTEST_1(test_cuda_conversion<void>());
|
||||||
CALL_SUBTEST_1(test_cuda_unary());
|
CALL_SUBTEST_1(test_cuda_unary<void>());
|
||||||
CALL_SUBTEST_1(test_cuda_elementwise());
|
CALL_SUBTEST_1(test_cuda_elementwise<void>());
|
||||||
CALL_SUBTEST_1(test_cuda_trancendental());
|
CALL_SUBTEST_1(test_cuda_trancendental<void>());
|
||||||
CALL_SUBTEST_2(test_cuda_contractions());
|
CALL_SUBTEST_2(test_cuda_contractions<void>());
|
||||||
CALL_SUBTEST_3(test_cuda_reductions());
|
CALL_SUBTEST_3(test_cuda_reductions<void>());
|
||||||
CALL_SUBTEST_4(test_cuda_full_reductions());
|
CALL_SUBTEST_4(test_cuda_full_reductions<void>());
|
||||||
CALL_SUBTEST_5(test_cuda_forced_evals());
|
CALL_SUBTEST_5(test_cuda_forced_evals<void>());
|
||||||
#else
|
#else
|
||||||
std::cout << "Half floats are not supported by this version of cuda: skipping the test" << std::endl;
|
std::cout << "Half floats are not supported by this version of cuda: skipping the test" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user