1#pragma once
2
3#include <c10/macros/Macros.h>
4
5#if !defined(__CUDACC__) && !defined(__HIPCC__)
6#include <ATen/cpu/vec/functional.h>
7#include <ATen/cpu/vec/vec.h>
8#endif
9
10namespace at {
11namespace native {
12namespace ufunc {
13
14template <typename T>
15C10_HOST_DEVICE C10_ALWAYS_INLINE T add(T self, T other, T alpha) __ubsan_ignore_undefined__ {
16 return self + alpha * other;
17}
18
19#if !defined(__CUDACC__) && !defined(__HIPCC__)
20using vec::Vectorized;
21template <typename T>
22C10_ALWAYS_INLINE Vectorized<T> add(Vectorized<T> self, Vectorized<T> other, Vectorized<T> alpha) __ubsan_ignore_undefined__ {
23 return vec::fmadd(other, alpha, self);
24}
25#endif
26
27}}} // namespace at::native::ufunc
28