blob: ffe1fc2dc6203ddfab06eb12c807bf6b998f7d3f [file] [edit]
// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0
// EIGEN_SUFFIXES;1;2
#if defined(EIGEN_TEST_PART_2)
// Older DPC++ NVPTX passes define __CUDA_ARCH__ without CUDA language mode.
#define __SYCL_DEVICE_ONLY__ // NOLINT(bugprone-reserved-identifier): simulate the compiler's device pass.
#define __CUDA_ARCH__ 500 // NOLINT(bugprone-reserved-identifier): simulate older DPC++ NVPTX targets.
#ifndef EIGEN_NO_ASSERTION_CHECKING
#define EIGEN_NO_ASSERTION_CHECKING
#endif
#endif
// AdaptiveCpp defines this flag even without Eigen's explicit SYCL integration.
#define SYCL_DEVICE_ONLY
#include "main.h"
#include "fp_control.h"
#if !defined(EIGEN_TEST_PART_2)
#include <contrib/Eigen/Tensor>
#endif
#ifdef EIGEN_SYCL_DEVICE_ONLY
#error Eigen SYCL integration requires EIGEN_USE_SYCL
#endif
#ifndef SYCL_DEVICE_ONLY
#error Eigen must preserve externally defined macros
#endif
#if defined(EIGEN_TEST_PART_2)
#if defined(EIGEN_CUDA_ARCH) || defined(EIGEN_GPU_COMPILE_PHASE)
#error SYCL device compilation alone must not select CUDA intrinsic paths
#endif
// Keep stringification nonempty for the MSVC traditional preprocessor.
static_assert(sizeof(EIGEN_MAKESTRING((EIGEN_DEVICE_FUNC))) == 3,
"Implicit SYCL use must not enable Eigen's flattening policy");
#endif
EIGEN_DECLARE_TEST(sycl_macro_collision) {
#if !defined(EIGEN_TEST_PART_2) && EIGEN_ARCH_x86_64
ScopedFlushToZero fp_mode(FlushToZeroMode::None);
VERIFY(fp_mode.isSupported());
#endif
#if defined(EIGEN_TEST_PART_2)
#if EIGEN_COMP_GNUC
VERIFY_IS_EQUAL(std::string(EIGEN_MAKESTRING(EIGEN_ALWAYS_INLINE)),
std::string("__attribute__((always_inline)) inline"));
VERIFY_IS_EQUAL(std::string(EIGEN_MAKESTRING(EIGEN_LAMBDA_ALWAYS_INLINE)),
std::string("__attribute__((always_inline))"));
#endif
const half half_a(33.f / 32), half_b(65.f / 64), half_c((std::numeric_limits<half>::denorm_min)());
VERIFY_IS_EQUAL(float(numext::fma(half_a, half_b, half_c)),
float(half(numext::fma(float(half_a), float(half_b), float(half_c)))));
#endif
Vector4d a, b;
a << 1, 2, 3, 4;
b << 5, 6, 7, 8;
Vector4d expected;
expected << 6, 8, 10, 12;
VERIFY_IS_EQUAL((a + b).eval(), expected);
VERIFY_IS_EQUAL(numext::mini(2, 3), 2);
VERIFY_IS_EQUAL(numext::maxi(2.0, 3.0), 3.0);
#if !defined(EIGEN_TEST_PART_2)
Tensor<float, 1> tensor(3), result(3);
tensor.setConstant(2.0f);
result = tensor + tensor;
for (Index i = 0; i < result.size(); ++i) VERIFY_IS_EQUAL(result(i), 4.0f);
#endif
}