问题遇到的现象和发生背景
- 在Linux中编译c语言,进行分块矩阵的相乘运算,在输出了未分块的矩阵运算的运行时间后,进入分块矩阵乘法运算函数之中,输出block_num之后就程序就卡着不动了。随后host os卡住,我强制重启。
- 随后我在win10上用vscode进行调试,结果显示进程还在用户态之中,错误发生在0x0000000000401662,报的错是signalSIGSEGV, Segmentation fault.
问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<time.h>
void multMatB(int n,float *A,float *B,float *C,int blocksize){
int i,j,k,b_i,b_j,b_k;
register float tem = 0;
int block_num = n/blocksize;
printf("block_num=%d\n",block_num);
/*ijk*/
for(b_i=0;b_i<block_num;b_i++)
for(b_j=0;b_i<block_num;b_j++)
for(b_k=0;b_k<block_num;b_k++)
for(i=0;i<blocksize;i++)
for(j=0;j<blocksize;j++)
{
tem = 0;
for(k=0;k<blocksize;k++)
tem += A[(b_i*blocksize+i)*n+b_k*blocksize+k]*B[(b_k*blocksize+k)*n+b_j*blocksize+j];
C[(b_i*blocksize+i)*n+b_j*blocksize+j] += tem;
}
}
void multMat(int n,float *A,float *B,float *C){
int i,j,k;
register float tem=0;
for(i=0;i<n;i++)
// ikj
for(j=0;j<n;j++)
{
tem=0;
for(k=0;k<n;k++)
tem +=A[k+i*n]*B[j+k*n];
C[j+i*n]=tem;
}
}
int main(int argc,char **argv){
int nmax= 2048,i,j;
int blocksize=16;
float tem=0;
double seconds;
float *A=(float*)malloc(nmax*nmax*sizeof(float));
float *B=(float*)malloc(nmax*nmax*sizeof(float));
float *C=(float*)malloc(nmax*nmax*sizeof(float));
float *D=(float*)malloc(nmax*nmax*sizeof(float));
struct timeval start, end;
// for(i=0;i<nmax*nmax;i++) A[i]=rand48()*2-1;
// for(i=0;i<nmax*nmax;i++) B[i]=rand48()*2-1;
for(i=0;i<nmax*nmax;i++) A[i]=rand()*2-1;
for(i=0;i<nmax*nmax;i++) B[i]=rand()*2-1;
for(i=0;i<nmax*nmax;i++) C[i]=0;
for(i=0;i<nmax*nmax;i++) D[i]=0;
gettimeofday(&start,NULL);
multMat(nmax,A,B,D);
gettimeofday(&end,NULL);
seconds = (end.tv_sec - start.tv_sec) + 1.0e-6 * (end.tv_usec-start.tv_usec);
printf("n = %d, time = %.3f s\n",nmax,seconds);
gettimeofday(&start,NULL);
multMatB(nmax,A,B,C,blocksize);
gettimeofday(&end,NULL);
seconds = (end.tv_sec - start.tv_sec) + 1.0e-6 * (end.tv_usec-start.tv_usec);
printf("n = %d, blocksize = %d, time = %.3f s\n",nmax,blocksize,seconds);
for(i=0;i<nmax;i++)
for(j=0;j<nmax;j++)
tem+=(C[i*nmax+j]-D[i*nmax+j])*(C[i*nmax+j]-D[i*nmax+j]);
printf("error%.4f\n",tem);
free(A);
free(B);
free(C);
free(D);
}
运行结果及报错内容
我的解答思路和尝试过的方法
开始我猜想是否为访问越界或者越级问题,但最后似乎仍处于用户的虚拟地址中分配的堆区之中。我试图在window上编译,结果相同,但是给出了发生错误的模块在分块矩阵相乘的函数代码段。
我想要达到的结果
照理来说分块矩阵的运算时间会更快,我就是因为程序卡住了才感觉到事情不太对。