оптимизировать оценку повторяющихся коэффициентов - PullRequest
2 голосов
/ 22 февраля 2012

Я решаю 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 Ответ

1 голос
/ 22 февраля 2012

Использование параллелизма для распараллеливания циклов (внешнего или обоих) выглядит хорошей идеей, поскольку вызовы myCoeff кажутся дорогими.

Однако запись всех коэффициентов в файловую систему может быть не очень хорошей идеей, поскольку операции ввода-вывода в файловой системе, как правило, очень дороги и нарушают поток выполнения вашей программы. Если вы можете заплатить дополнительно 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...