2016-12-14 3 views
-1

Я пытаюсь выполнить алгоритм устранения ошибки в Guassian в https://courses.engr.illinois.edu/cs554/fa2015/notes/06_lu_8up.pdf, чтобы реализовать LU-факторизацию и в конечном итоге распараллелить ее с помощью openmp. Правильно ли выглядит следующий алгоритм, где l - множитель, а m - матрица?Реализация последовательной LU-декомпозиции в C++

void decompose2(double **m) { 
    begin =clock(); 
    int i=0, j=0, k=0; 

    for(k = 1; k < size - 1; k++) 
    { 
     for(i = k + 1; i < size; i++) 
     { 
     l[i][k] = m[i][k]/m[k][k]; 
     } 

     for(j = k + 1; j < size; j++) 
     { 
     for(i = k + 1; k < size; k++) 
     { 
      m[i][j] = m[i][j] - (l[i][k]*m[k][j]); 
     } 
     } 

    } 
    end = clock(); 
} 

Я не думаю, что это правильно, потому что в соответствии с другой бумагой времен я получаю после распараллеливания на таком же количестве процессоров, совершенно различны.

ответ

0

"Имеет ли следующий алгоритм выглядеть правильно, ..." - Нет, потому что

  • массивы 0-индекс в C++,
  • (который вы, вероятно, используете) не конвертируются в double**,
  • int не хороший тип итераторы (использование size_t вместо этого),
  • вы не проверить, если m[k][k] может быть (близко к) нулю, когда вы, возможно, придется поменять местами строки.

Обратите внимание, что я только посмотрел на очевидные ошибки реализации, а не на возможные случаи, чтобы сделать код лучше, например. увеличивая стабильность расчета.

Смежные вопросы