17653分割错误(核心转储)
我正在尝试使用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];
}
}
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”语句的括号通常是一个糟糕的主意;想象不得不添加更多的线条,它可能会令人烦恼。当代码变得更加复杂时,很难阅读和推理。
感谢您的建议。在你提到的变化之后,我设法让它工作。 – mikebmx1
@ mikebmx1在这种情况下,您应该考虑接受答案。 –
你有什么试图调试你的代码?也许你会添加一些日志记录来查看发生的情况,然后寻求帮助。 – kebs