2010-03-26 8 views
1

Mon code de multiplication matricielle estErreur de segmentation lors de la multiplication matricielle avec 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; 

} 

Je suppose qu'il est à cause de l'objet de la matrice seulement, mais pourquoi il sera nulle, même si elle est passée comme paramètre ..

+0

Dites-nous où segv est. Dites-nous quel compilateur vous utilisez. – bmargulies

Répondre

0

Je suppose que votre « matrice »est un tableau de pointeurs vers la matrice réelle » lignes, quelque chose comme:

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

Mais si « matrice » est définie ainsi

double matrix[NROWS][NCOL]; 

votre programme ne peut pas fonctionner. Si votre identifiant de matrice est correctement défini, une raison possible de crash mey est une taille incorrecte ("ld").

Cordialement

1

je suis tombé sur le même problème lors de la compilation mon code sous Linux en utilisant GCC 4.2. La ligne qui est à l'origine du problème est:

omp_set_num_threads(nthreads); 

Vous devriez essayer de définir le nombre de threads en spécifiant sous pragmaomp pour:

#pragma omp for num_threads(nthreads) 

it helps!

Questions connexes