115#ifndef EIGEN_ASSIGN_AOCL_H
116#define EIGEN_ASSIGN_AOCL_H
122template <
typename Dst,
typename Src>
123class aocl_assign_traits {
128 StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),
129 InnerSize = Dst::IsVectorAtCompileTime ?
int(Dst::SizeAtCompileTime)
130 : (Dst::Flags &
RowMajorBit) ?
int(Dst::ColsAtCompileTime)
131 : int(Dst::RowsAtCompileTime),
132 LargeEnough = (InnerSize == Dynamic) || (InnerSize >= EIGEN_AOCL_VML_THRESHOLD)
137 EnableAoclVML = DstHasDirectAccess && SrcHasDirectAccess && StorageOrdersAgree && LargeEnough,
138 Traversal = LinearTraversal
143template <
typename Dst,
typename Lhs,
typename Rhs>
144class aocl_assign_binary_traits {
151 (
int(Dst::IsRowMajor) ==
int(Lhs::IsRowMajor)) && (int(Dst::IsRowMajor) == int(Rhs::IsRowMajor)),
152 InnerSize = Dst::IsVectorAtCompileTime ?
int(Dst::SizeAtCompileTime)
153 : (Dst::Flags &
RowMajorBit) ?
int(Dst::ColsAtCompileTime)
154 : int(Dst::RowsAtCompileTime),
155 LargeEnough = (InnerSize == Dynamic) || (InnerSize >= EIGEN_AOCL_VML_THRESHOLD)
160 EnableAoclVML = DstHasDirectAccess && LhsHasDirectAccess && RhsHasDirectAccess && StorageOrdersAgree && LargeEnough
165#define EIGEN_AOCL_VML_UNARY_CALL_FLOAT(EIGENOP) \
166 template <typename DstXprType, typename SrcXprNested> \
167 struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<float>, SrcXprNested>, assign_op<float, float>, \
168 Dense2Dense, std::enable_if_t<aocl_assign_traits<DstXprType, SrcXprNested>::EnableAoclVML>> { \
169 typedef CwiseUnaryOp<scalar_##EIGENOP##_op<float>, SrcXprNested> SrcXprType; \
170 static void run(DstXprType &dst, const SrcXprType &src, const assign_op<float, float> &) { \
171 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
172 Eigen::Index n = dst.size(); \
173 if (n <= 0) return; \
174 const float *input = reinterpret_cast<const float *>(src.nestedExpression().data()); \
175 float *output = reinterpret_cast<float *>(dst.data()); \
176 for (Eigen::Index i = 0; i < n; ++i) { \
177 output[i] = std::EIGENOP(input[i]); \
183#define EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(EIGENOP, AOCLOP) \
184 template <typename DstXprType, typename SrcXprNested> \
185 struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<double>, SrcXprNested>, assign_op<double, double>, \
186 Dense2Dense, std::enable_if_t<aocl_assign_traits<DstXprType, SrcXprNested>::EnableAoclVML>> { \
187 typedef CwiseUnaryOp<scalar_##EIGENOP##_op<double>, SrcXprNested> SrcXprType; \
188 static void run(DstXprType &dst, const SrcXprType &src, const assign_op<double, double> &) { \
189 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
190 Eigen::Index n = dst.size(); \
191 eigen_assert(n <= INT_MAX && "AOCL does not support arrays larger than INT_MAX"); \
192 if (n <= 0) return; \
193 const double *input = reinterpret_cast<const double *>(src.nestedExpression().data()); \
194 double *output = reinterpret_cast<double *>(dst.data()); \
195 int aocl_n = internal::convert_index<int>(n); \
196 AOCLOP(aocl_n, const_cast<double *>(input), output); \
204EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(exp2, amd_vrda_exp2)
205EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(exp, amd_vrda_exp)
206EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(sin, amd_vrda_sin)
207EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(cos, amd_vrda_cos)
208EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(sqrt, amd_vrda_sqrt)
209EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(cbrt, amd_vrda_cbrt)
210EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(abs, amd_vrda_fabs)
211EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(log, amd_vrda_log)
212EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(log10, amd_vrda_log10)
213EIGEN_AOCL_VML_UNARY_CALL_DOUBLE(log2, amd_vrda_log2)
216#define EIGEN_AOCL_VML_BINARY_CALL_FLOAT(EIGENOP, STDFUNC) \
217 template <typename DstXprType, typename LhsXprNested, typename RhsXprNested> \
219 DstXprType, CwiseBinaryOp<scalar_##EIGENOP##_op<float, float>, LhsXprNested, RhsXprNested>, \
220 assign_op<float, float>, Dense2Dense, \
221 std::enable_if_t<aocl_assign_binary_traits<DstXprType, LhsXprNested, RhsXprNested>::EnableAoclVML>> { \
222 typedef CwiseBinaryOp<scalar_##EIGENOP##_op<float, float>, LhsXprNested, RhsXprNested> SrcXprType; \
223 static void run(DstXprType &dst, const SrcXprType &src, const assign_op<float, float> &) { \
224 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
225 Eigen::Index n = dst.size(); \
226 if (n <= 0) return; \
227 const float *lhs = reinterpret_cast<const float *>(src.lhs().data()); \
228 const float *rhs = reinterpret_cast<const float *>(src.rhs().data()); \
229 float *output = reinterpret_cast<float *>(dst.data()); \
230 for (Eigen::Index i = 0; i < n; ++i) { \
231 output[i] = STDFUNC(lhs[i], rhs[i]); \
237#define EIGEN_AOCL_VML_BINARY_CALL_DOUBLE(EIGENOP, AOCLOP) \
238 template <typename DstXprType, typename LhsXprNested, typename RhsXprNested> \
240 DstXprType, CwiseBinaryOp<scalar_##EIGENOP##_op<double, double>, LhsXprNested, RhsXprNested>, \
241 assign_op<double, double>, Dense2Dense, \
242 std::enable_if_t<aocl_assign_binary_traits<DstXprType, LhsXprNested, RhsXprNested>::EnableAoclVML>> { \
243 typedef CwiseBinaryOp<scalar_##EIGENOP##_op<double, double>, LhsXprNested, RhsXprNested> SrcXprType; \
244 static void run(DstXprType &dst, const SrcXprType &src, const assign_op<double, double> &) { \
245 eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
246 Eigen::Index n = dst.size(); \
247 eigen_assert(n <= INT_MAX && "AOCL does not support arrays larger than INT_MAX"); \
248 if (n <= 0) return; \
249 const double *lhs = reinterpret_cast<const double *>(src.lhs().data()); \
250 const double *rhs = reinterpret_cast<const double *>(src.rhs().data()); \
251 double *output = reinterpret_cast<double *>(dst.data()); \
252 int aocl_n = internal::convert_index<int>(n); \
253 AOCLOP(aocl_n, const_cast<double *>(lhs), const_cast<double *>(rhs), output); \
262EIGEN_AOCL_VML_BINARY_CALL_DOUBLE(sum, amd_vrda_add)
263EIGEN_AOCL_VML_BINARY_CALL_DOUBLE(pow, amd_vrda_pow)
264EIGEN_AOCL_VML_BINARY_CALL_DOUBLE(max, amd_vrda_fmax)
265EIGEN_AOCL_VML_BINARY_CALL_DOUBLE(min, amd_vrda_fmin)
constexpr unsigned int DirectAccessBit
Definition Constants.h:160
constexpr unsigned int RowMajorBit
Definition Constants.h:71