优化重复系数评估

时间:2012-02-22 12:37:54

标签: c++ optimization parallel-processing

我正在解决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循环。

是否可以将这两个选项结合起来? 如果您需要有关我可以提供的代码的更多详细信息,欢迎提出任何其他建议。

1 个答案:

答案 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循环。