我正在解决3个不同的线性方程组系统,其中每个系统都取决于前一个系统的结果。它们都共享一些系数,然后与之前的结果一起定义新系统(当然,第一个系统由它自己定义)。
代码有点像这样:
vector<double>point(n);//initialized to values
vector<double>A(n*n,0);
vector<double>b(n,0);
double coefficient;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
coefficient=myCoeff(point[i],point[j]);
//A[i+j*n] and b[j] initialized using coefficient
}
}
vector<double>x(n) //initialized as solution of A\b
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
coefficient=myCoeff(point[i],point[j]);
//A[i+j*n] and b[j] initialized using coefficient and x
}
}
//x=A\b
//and so on for the third system
对代码进行概要分析表明80%的时间用于调用myCoeff。优化myCoeff超出了我的兴趣。
我脑子里有两个选择: - 将系数写入文件一次,然后读取两次 -use parallel_for而不是外部for循环。
是否可以将这两个选项结合起来? 如果您需要有关我可以提供的代码的更多详细信息,欢迎提出任何其他建议。
答案 0 :(得分:1)
使用parallel_for并行化循环(外部的一个或两个)看起来是个好主意,因为调用myCoeff似乎很昂贵。
然而,将所有系数写入文件系统可能不是一个好主意,因为文件系统I / O往往非常昂贵并且会破坏程序的执行流程。如果你可以支付额外的n * n存储空间,那么将系数存储在内存中可能会更好:
vector<double> coeff(n*n, 0);
for (i...) {
for (j...) {
coeff[j+n*i] = myCoeff(point[i],point[j]);
}
}
这很容易与循环并行化相结合。
如果您坚持在系统中存储系数的想法(可能是为了减少内存使用量),仅使用一个文件会使并行化非常困难(文件意味着按顺序访问)。相反,您可能希望在矩阵中的每行创建一个文件。这样,您可以轻松地将系数存储与外部循环的并行化相结合。
另外,最好还是按行存储矩阵系数:A [i * n + j]或反转你的i和j循环。