RL-*_*L-S 8 c++ arrays vectorization eigen eigen3
更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。
这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n Array<double, 2, 2> a;\n a.setRandom();\n\n Array<double, 3, 2> b;\n b.col(0).tail(2) = a.col(1);\n // b.col(0).template tail<2>() = a.col(1);\n\n return b;\n}\n\nint main(){\n std::cout << foo() << \'\\n\';\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32。
在以下情况下不会出现该错误:
\n-march=native-O1或低于时b.col(0).tail(2) = a.col(1);行时b.col(0).template tail<2>() = a.col(1);所以看起来 GCC 看到了 3x2 数组和 2x2 数组,但没有意识到每个数组只访问了两个条目。
\n我现在的问题是:这件事应该向谁报告?海湾合作委员会,艾根?还是用户的bug?
\n告诉我24错误注释 ( offset [16, 24]) 中的内容即可获得奖励积分。是16开始,是24读取大小?
编辑:示例可以通过使用Array3d和进一步简化Array2d,请参阅此处。