为什么在使用Clang 3.9时,返回复制的Matrix3d的元素会导致不正确的输出?
在Clang 3.9上使用为什么在使用Clang 3.9时,返回复制的Matrix3d的元素会导致不正确的输出?,clang,eigen,eigen3,Clang,Eigen,Eigen3,在Clang 3.9上使用-O2编译以下示例,在main中调用时,会导致重新编程返回垃圾(1.9038e+185): 代码 reproFunction,通过在中的R\u赋值来初始化R(这是常量)。它返回R(1,2)。在赋值和返回之间,reproFunction在多个操作中使用R,但它们都不能更改R。删除任何这些操作都会导致reproFunction返回正确的值 在以下任何情况下都不会出现此行为: 该程序是用clang3.5、clang4.0或g++-5.4编译的 优化级别为-O1或更低 使用特
-O2
编译以下示例,在main
中调用时,会导致重新编程返回垃圾(1.9038e+185
):
代码
reproFunction
,通过在中的R\u赋值来初始化R
(这是常量)。它返回R(1,2)
。在赋值和返回之间,reproFunction
在多个操作中使用R
,但它们都不能更改R
。删除任何这些操作都会导致reproFunction
返回正确的值
在以下任何情况下都不会出现此行为:
- 该程序是用clang3.5、clang4.0或g++-5.4编译的
- 优化级别为
-O1
或更低
- 使用特征值3.2.10代替特征值3.3.3
现在的问题是:这种行为是因为我在上面的代码中遗漏了一个bug,是因为Eigen 3.3.3中的bug,还是因为Clang 3.9中的bug
可以在中找到一个独立的复制示例。我可以用Clang3.9复制,但不能用Clang3.8。我将伊根这边的问题一分为二:
错误256:启用未对齐加载/存储的矢量化。这涉及所有体系结构和所有大小。通过定义特征值未对齐向量化=0,可以禁用此新行为
该提交允许对未对齐的数据执行矢量化操作
我仍然认为,这是clang中的一个bug,但是您可以通过使用编译来解决它
-D EIGEN_UNALIGNED_VECTORIZE=0
此外,如果检测到clang 3.9作为编译器,可以通过自动禁用此功能来“修复”Eigen。这听起来很像clang中的一个bug。只是出于好奇,R12的?它离R(1,2)
(in)有多远?这并不能解决问题,我只是想知道…@AviGinsburg:我已经为上面的R12
的值添加了一行输出。它似乎是一个垃圾值,而不是我最初记错的0。ulp距离为`-2.77422e+18`。示例的分支现在打印出由float\u distance
返回的结果,该结果可能与该叮当声相关。
R12 == R(1,2): 0
R12: 1.9036e+185
R(1, 2): 0.7
-D EIGEN_UNALIGNED_VECTORIZE=0