如何修复错误:“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_f64vreinterpretq_f64_u32 似乎没有定义。 如果您查看 Eigen/src/Core/arch/NEON/PacketMath.h 第 604 行,则定义了 vreinterpretq_f64_u64vreinterpretq_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 构建的主要内容,如果未能解决你的问题,请参考以下文章

如何修复:远程服务器返回错误:(400)错误请求

如何修复 WordPress 中的 HTTP 错误

如何修复 Ubuntu 中检测到系统程序错误的问题

如何修复“找不到名称'ClipboardItem'”错误?

如何修复 C++ 中的“分段错误”错误

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?