生化环材狗都不读 2022-06-04 21:13
浏览 21
已结题

在Linux中编译c语言后运行,进行分块矩阵的相乘运算,错误为signal SIGSEGV, Segmentation fault

问题遇到的现象和发生背景
  • 在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);        
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
开始我猜想是否为访问越界或者越级问题,但最后似乎仍处于用户的虚拟地址中分配的堆区之中。我试图在window上编译,结果相同,但是给出了发生错误的模块在分块矩阵相乘的函数代码段。
我想要达到的结果
照理来说分块矩阵的运算时间会更快,我就是因为程序卡住了才感觉到事情不太对。
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月12日
    • 创建了问题 6月4日

    悬赏问题

    • ¥15 pnpm 下载element-plus
    • ¥15 解决编写PyDracula时遇到的问题
    • ¥15 有没有人能解决下这个问题吗,本人不会编程
    • ¥15 plotBAPC画图出错
    • ¥30 关于#opencv#的问题:使用大疆无人机拍摄水稻田间图像,拼接成tif图片,用什么方法可以识别并框选出水稻作物行
    • ¥15 Python卡尔曼滤波融合
    • ¥20 iOS绕地区网络检测
    • ¥15 python验证码滑块图像识别
    • ¥15 根据背景及设计要求撰写设计报告
    • ¥20 能提供一下思路或者代码吗