如何修复错误:“vreinterpretq_u32_f64”未在此范围内声明 - 在 Android 上使用 Eigen 构建
Posted
技术标签:
【中文标题】如何修复错误:“vreinterpretq_u32_f64”未在此范围内声明 - 在 Android 上使用 Eigen 构建【英文标题】:How to fix error: 'vreinterpretq_u32_f64' was not declared in this scope - building with Eigen on Android 【发布时间】:2019-10-16 08:26:56 【问题描述】:我正在尝试为具有 Eigen 作为依赖项的 android 构建 Tensorflow Lite。 在构建过程中出现此错误:
.../eigen/Eigen/src/Core/arch/NEON/Complex.h:383:83: error: 'vreinterpretq_u32_f64' was not declared in this scope
Packet2d eq_swapped = vreinterpretq_f64_u32(vrev64q_u32(vreinterpretq_u32_f64(eq)));
^
经过一番挖掘,我发现:
-
vreinterpretq_u32_f64 确实没有在 Eigen 中定义,并且
Eigen 只有标准库作为依赖项
那么这个函数究竟应该从哪里来呢? (我确实明确包含了标准库 android-ndk-r17c/sources/cxx-stl/llvm-libc++)我缺少一些包含吗? 任何人都可以帮我解释一下吗?
谢谢。
【问题讨论】:
这应该由像arm_neon.h
这样的标头提供,并且 Eigen 应该仅在启用矢量化时尝试使用它。您应该使用您的确切设置和一个最小示例报告错误。您还可以通过使用 -DEIGEN_DONT_VECTORIZE
编译来显式停用 Eigen 中的矢量化。
感谢您的回复@ch,但使用 -DEIGEN_DONT_VECTORIZE 我得到:“tensorflow/lite/kernels/eigen_support.cc:36:1:错误:除以零不是常量表达式”我想我确实需要矢量化...
【参考方案1】:
vreinterpretq_u32_f64
和 vreinterpretq_f64_u32
似乎没有定义。
如果您查看 Eigen/src/Core/arch/NEON/PacketMath.h
第 604 行,则定义了 vreinterpretq_f64_u64
和 vreinterpretq_u64_f64
。
考虑到向量宽度为 128 位,vreinterpretq_u32_f64
应该从 f64x2 转换为 u32x4,vreinterpretq_f64_u32
类似
只需在Eigen/src/Core/arch/NEON/PacketMath.h
的第604行之后添加这两个定义
template <typename T> float64x2_t vreinterpretq_f64_u32(T a) return (float64x2) a;
template <typename T> uint32x4_t vreinterpretq_u32_f64(T a) return (uint32x4) a;
希望这会有所帮助!
【讨论】:
以上是关于如何修复错误:“vreinterpretq_u32_f64”未在此范围内声明 - 在 Android 上使用 Eigen 构建的主要内容,如果未能解决你的问题,请参考以下文章