2010-03-26 2 views
1

Мой код матрицы умноженияОшибка сегментации при умножении матрицы с использованием openMp?

int matMul(int ld, double** matrix) 
{ 

    //local variables initialize 

    omp_set_num_threads(nthreads); 


    \#pragma omp parallel private(tid,diag,ld) shared(i,j,k,matrix) 

    { 
    /* Obtain and print thread id */ 

    tid = omp_get_thread_num(); 

    for (k=0; k<ld; k++) { 
    if (matrix[k][k] == 0.0) { 
     error = 1; 
     return error; 
    } 
    diag = 1.0/matrix[k][k]; 
\#pragma omp for 

    for (i=k+1; i < ld; i++) { 

     matrix[i][k] = diag * matrix[i][k]; 

    } 
    for (j=k+1; j<ld; j++) { 

     for (i=k+1; i<ld; i++) { 

     matrix[i][j] = matrix[i][j] - matrix[i][k] * matrix[k][j]; 

     } 

    } 
    } 

    } 
    return error; 

} 

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

+0

сообщите нам, где находится segv. Скажите нам, какой компилятор вы используете. – bmargulies

ответ

0

Я предполагаю, что ваша «матрица "представляет собой массив указателей на фактическую матрицу» строки, что-то вроде:

double *matrix[NROWS]; 
for (i = 0; i < NROWS; ++i) { 
    matrix[i] = malloc(sizeof(double)*NCOL); 
} 

Но если „матрицы“ определяется этим путем

double matrix[NROWS][NCOL]; 

Ваша программа не может работать. Если ваш идентификатор матрицы определен правильно, возможной причиной сбоя может быть неправильный размер («ld»).

С уважением

1

Я столкнулся с той же проблемой при компиляции моего кода под Linux с помощью GCC 4.2. Линия, которая является причиной проблемы является:

omp_set_num_threads(nthreads); 

Вы должны попытаться установить число потоков, указав его под pragmaomp для:

#pragma omp for num_threads(nthreads) 

Надеется, что это помогает!

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