2015-05-02 107 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; 
} 
當你離開括號出來後,才下一條語句

的「for」語句循環中執行,因此,「矩陣2」線的循環結束後執行,在這點i和j因此(double *)matrix2 [i]是垃圾;訪問matrix2 [i]可能會或可能不會根據堆佈局導致段錯誤,但訪問matrix2 [i] [j]很可能會因爲不知道它會發生什麼。

這不是唯一的問題:在循環中訪問矩陣[i] [size * size - 1]時,矩陣[i]被分配爲指向sizeof(double)* size數組的指針。在C派生語言中,省略「if」,「do」,「for」,「case」和「while」語句的括號通常是一個糟糕的主意;想象不得不添加更多的線條,它可能會令人煩惱。當代碼變得更加複雜時,很難閱讀和推理。

+0

感謝您的建議。在你提到的變化之後,我設法讓它工作。 – mikebmx1

+0

@ mikebmx1在這種情況下,您應該考慮接受答案。 –