C++ 使用步幅时出现noalias()问题
我正在使用Eigen进行计算流体动力学应用,我注意到了一个bug。我对代码进行了抽象,这样任何人都可以复制它。我使用的是Eigen 3.3.7 下面的代码复制了该问题C++ 使用步幅时出现noalias()问题,c++,eigen,eigen3,C++,Eigen,Eigen3,我正在使用Eigen进行计算流体动力学应用,我注意到了一个bug。我对代码进行了抽象,这样任何人都可以复制它。我使用的是Eigen 3.3.7 下面的代码复制了该问题 #包括 #包括 #包括“本征/本征” 使用名称空间std; 使用名称空间特征; int main(){ 常数int dim=3; const int nb=功率(3,dim); 常数int nq=功率(2,dim); 向量A(dim*nb); 对于(uint i=0;i 材料B(D.数据(),尺寸,nb,外层(nq*nb)); M
#包括
#包括
#包括“本征/本征”
使用名称空间std;
使用名称空间特征;
int main(){
常数int dim=3;
const int nb=功率(3,dim);
常数int nq=功率(2,dim);
向量A(dim*nb);
对于(uint i=0;i
材料B(D.数据(),尺寸,nb,外层(nq*nb));
Map
材料C(C.数据(),尺寸,尺寸,内跨距(nq));
mat_C.noalias()=mat_A*mat_B.transpose();
cout就我而言,通过从gitlab存储库中提取主分支解决了此问题。它可能与此相关。感谢您的帮助。亲爱的Kihiro,请解释您希望更新我的帖子的结果。无论有无noalias()因为LHS和RHS之间没有内存混叠。问题似乎来自矩阵mult忽略版本中noalias
的跨步的结果(如果在第一个mult之后查看C
向量,它有正确的数字,但不在正确的位置…)赋值的代码路径似乎不同,noalias案例调用了paralelize_gemm
,它假设您的值被打包在一起,因此忽略了跨步。感谢您提供的信息。您知道在使用跨步时避免使用临时跨步的方法吗?
12402 0 0
31356 0 0
50310 0 0
12402 164034 315666
31356 497916 964476
50310 831798 1.61329e+06