如何在 for 循环 c++ 犰狳中加快对巨大矢量的调用
How to speed up the call to a huge vector in a for loop c++ armadillo
>我正在使用犰狳库。我的程序太慢并且我需要加快它的部分如下
for(int q(0); q < Nk*Nk; q++){
for(int k(0); k < Nk*Nk; k++){
int kq = (k+q) % (Nk*Nk);
cx_mat Gx = ((Eigveck.slice(k)).t())*(Vxk.slice(k)-Vxk.slice(kq))*Eigveck.slice(kq);
cx_mat Gy = ((Eigveck.slice(k)).t())*(Vyk.slice(k)-Vyk.slice(kq))*Eigveck.slice(kq);
vec ek = Eigvalk.col(k);
vec ekq = Eigvalk.col(kq);
for(int i(0); i < Ltot; i++){
for(int j(0); j < Ltot; j++){
chi = chi + (abs(Gx(i,j))*abs(Gx(i,j))+abs(Gy(i,j))*abs(Gy(i,j)))*(1.0/(1.0+exp(ekq(j)/T))-1.0/(1.0+exp(ek(i)/T)))*((ekq(j)-ek(i))/((ekq(j)-ek(i))*(ekq(j)-ek(i))+eta*eta))/(Nk*Nk);
}
}
}
double qx = (G1(0)*floor(q/Nk)/Nk+G2(0)*(q % Nk)/Nk);
double qy = (G1(1)*floor(q/Nk)/Nk+G2(1)*(q % Nk)/Nk);
lindhard << qx << " " << qy << " " << -chi << " " << endl;
}
在这部分之前,我定义了一个巨大的矩阵,Eigvalk和巨大的立方体,Eigveck,Vxk,Vyk。
现在,在 for 循环中对它们的值的调用非常慢,需要很长时间。 立方体包含特征向量和给定问题的其他数量。问题是,对于 Nk=10(测试代码的非常小的 Nk(,计算 Nk*Nk=100 乘以 47 个特征向量需要 0.1 秒,执行使用它们的循环需要 4.5 秒。我已经检查了花费时间的部分是呼叫
cx_mat Gx = .....
我还尝试定义向量或巨大的cx_mat(通过矢量化矩阵(而不是cx_cube,但没有任何变化。
有没有更好的方法解决这个问题?
我没有看到市长错误。矩阵的遍历顺序是可以的。
我认为您的代码可以使用这样的 openMP 缩减有效地并行计算
for(int q(0); q < Nk*Nk; q++){
#pragma omp parallel for default(shared) reduction(+:chi)
for(int k(0); k < Nk*Nk; k++){
int kq = (k+q) % (Nk*Nk);
cx_mat Gx = ((Eigveck.slice(k)).t())*(Vxk.slice(k)-Vxk.slice(kq))*Eigveck.slice(kq);
cx_mat Gy = ((Eigveck.slice(k)).t())*(Vyk.slice(k)-Vyk.slice(kq))*Eigveck.slice(kq);
vec ek = Eigvalk.col(k);
vec ekq = Eigvalk.col(kq);
for(int i(0); i < Ltot; i++){
for(int j(0); j < Ltot; j++){
chi = chi + (abs(Gx(i,j))*abs(Gx(i,j))+abs(Gy(i,j))*abs(Gy(i,j)))*(1.0/(1.0+exp(ekq(j)/T))-1.0/(1.0+exp(ek(i)/T)))*((ekq(j)-ek(i))/((ekq(j)-ek(i))*(ekq(j)-ek(i))+eta*eta))/(Nk*Nk);
}
}
}
double qx = (G1(0)*floor(q/Nk)/Nk+G2(0)*(q % Nk)/Nk);
double qy = (G1(1)*floor(q/Nk)/Nk+G2(1)*(q % Nk)/Nk);
lindhard << qx << " " << qy << " " << -chi << " " << endl;
}
附言。
也许您定义了一些常量局部变量,例如
const auto delta = ekq(j)-ek(i);
您是如何测量热点的?
您使用哪些编译器选项?我假设您打开了适当的优化级别,对吧?
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- 当提供巨大的输入时,中止在堆栈操作程序中调用错误
- 如何在 for 循环 c++ 犰狳中加快对巨大矢量的调用