2015-05-02 2 views
0

Я пытаюсь реализовать матричное умножение с динамическим распределением памяти с помощью OpenMP. Мне удается получить мою программу для компиляции нормально, но когда я пытаюсь выполнить его, я получаю ./ линию 14: 17653 сбоем сегментации (ядро сбрасывали) ./matrix.exe $ matrix_size17653 Ошибка сегментации (ядро сбрасывается)

int main(int argc, char *argv[]){ 
    if(argc < 2){ 
    printf("Usage: %s matrix/vector_size\n", argv[0]); 
    return 0; 
    } 

    int size = atoi(argv[1]); 
    double **matrix2 = (double **)malloc(sizeof(double*)*size); 
    double **matrix = (double **)malloc(sizeof(double*)*size); 
    double **result_sq = (double **)malloc(sizeof(double*)*size); 
    double **result_pl = (double **)malloc(sizeof(double*)*size); 
    int t; 
    for (t =0; t<size; t++) { 
     matrix[t]= (double *)malloc(sizeof(double)*size); 
     matrix2[t]= (double *)malloc(sizeof(double)*size); 
     result_pl[t]= (double *)malloc(sizeof(double)*size); 
     result_sq[t]=(double *)malloc(sizeof(double)*size); 
    } 
    matrix_vector_gen(size, matrix, matrix2); 

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

Кроме того, программа содержит следующую функцию для генерации двух матриц и выполнения умножения один раз последовательно и один раз с помощью openMP.

void matrix_vector_gen(int size, double **matrix, double **matrix2){ 
    int i,j; 
    for(i=0; i<size; i++) 
     for(j=0; j<size*size; j++) 
      matrix[i][j] = ((double)rand())/5307.0; 
      matrix2[i][j] = ((double)rand())/65535.0; 
} 
void matrix_mult_sq(int size, double **matrix2, 
       double **matrix_in, double **matrix_out){ 
    int i, j, k; 

    for(i=0; i<size; i++){ 

    for(j=0; j<size; j++) 
     matrix_out[i][j] = 0.0; 
     for(k=0; k<size; k++) 
      matrix_out[i][j] += matrix_in[i][k] * matrix2[k][j]; 
    } 
} 

void matrix_mult_pl(int size, double **matrix2, 
       double **matrix_in, double **matrix_out){ 
    int i, j, k; 


    # pragma omp parallel    \ 
     shared(size, matrix2, matrix_in, matrix_out) \ 
     private(i,j,k) 
    # pragma omp for 
     for(i=0; i<size; i++){ 

     for(j=0; j<size; j++) 
      matrix_out[i][j] = 0.0; 
      for(k=0; k<size; k++) 
       matrix_out[i][j] += matrix_in[i][k] * matrix2[k][j]; 
     } 
    } 
+1

Что вы пытались отладить свой код? Возможно, вы добавили некоторые записи, чтобы узнать, где это происходит, и попросите о помощи. – kebs

ответ

0
void matrix_vector_gen(int size, double **matrix, double **matrix2){ 
    int i,j; 
    for(i=0; i<size; i++) 
     for(j=0; j<size*size; j++) 
      matrix[i][j] = ((double)rand())/5307.0; 
      matrix2[i][j] = ((double)rand())/65535.0; 
} 

, когда вы покидаете брекеты только следующее заявление после того, как «за» утверждение выполняются в цикле, так что линия «matrix2» выполняются после того, как в конце петли, в какой момент я и J не связаны, поэтому (double *) matrix2 [i] является мусором; доступ к матрице2 [i] может или не может вызвать segfault в зависимости от компоновки кучи, но доступ к матрице2 [i] [j], скорее всего, будет, потому что не сообщается, куда он идет.

Это не единственная проблема: матрица [i] выделяется как указатель на массив sizeof (double) * size, в то время как вы обращаетесь к матрице [i] [size * size - 1] в цикле.

В языках C-производных, оставляя фигурные скобки для операторов «if», «do», «for», «case» и «while», как правило, является плохой идеей; Представьте, что вам нужно добавить больше строк, это может стать докучливым. Сложно читать и рассуждать, когда код становится более сложным.

+0

спасибо за совет. после изменений, которые вы упоминаете, мне удается заставить его работать. – mikebmx1

+0

@ mikebmx1 В этом случае вам следует подумать о принятии ответа. –