C++ 大矩阵上的cblasdgemm分割错误
我在一台24核的机器上工作,内存约400GB,运行Ubuntu。使用“英特尔MKL cblasdgemm”执行简单矩阵乘法时,我遇到分段错误:C++ 大矩阵上的cblasdgemm分割错误,c++,c,blas,intel-mkl,C++,C,Blas,Intel Mkl,我在一台24核的机器上工作,内存约400GB,运行Ubuntu。使用“英特尔MKL cblasdgemm”执行简单矩阵乘法时,我遇到分段错误: int k=5; int m=2E5; int n=3E4; double * A = (double *)mkl_malloc( m*k*sizeof( double ), 64 ); UTILITIES::check_alloc("A", A); //Check alloc just checks if the pointer
int k=5;
int m=2E5;
int n=3E4;
double * A = (double *)mkl_malloc( m*k*sizeof( double ), 64 );
UTILITIES::check_alloc("A", A); //Check alloc just checks if the pointer is null
UTILITIES::random_matrix(m,k,A); //fills matrix with random numbers
double * B = (double *)mkl_malloc( k*n*sizeof( double ), 64 );
UTILITIES::check_alloc("B", B);
UTILITIES::random_matrix(k,n,B); //files matrix with random numbers
double * TestMatrix = (double *)mkl_malloc( m*n*sizeof( double ), 64 );
printf("Allocating a matrix of size %le\n",(double) m*n*sizeof(double)); //4.8E10
UTILITIES::check_alloc("TestMatrix", TestMatrix);//No problem
for (int i=0; i<m*n; i++) { //I added this just to make sure I could allocate the memory, of course this will all be overwritten
TestMatrix[i] = 1.0;
}
printf("TestMatrix %lf\n", TestMatrix[1]); //no problem accessing the memory
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m,n,k,
1.0,
A,k,
B,n,
0.0,
TestMatrix,n); //Segfaults at this line (without it, there is no segfault).
我的编译行:
g++ -m64 main.cpp -I/opt/intel/composer_xe_2013_sp1.0.080/mkl/include -L/opt/intel/composer_xe_2013_sp1.0.080/mkl/lib/intel64 -lmkl_rt;
我最好的猜测是在初始化过程中
m*n
,因为循环会导致溢出
但是,(归功于mch)SEGDULT是由于m*n*sizeof(双精度)
中的溢出造成的。显然,m*n
在升级到size\u t
之前进行了评估。一种解决方法是将m
和n
更改为long
,因此i
我的最佳猜测是在初始化中m*n
,因为循环会导致溢出
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m,n,k,
1.0,
A,k,
B,n,
0.0,
TestMatrix,n);
但是,(归功于mch)SEGDULT是由于m*n*sizeof(双精度)
中的溢出造成的。显然,m*n
在升级到size\u t
之前进行了评估。解决此问题的一种方法是将m
和n
更改为long
,并相应地将i
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m,n,k,
1.0,
A,k,
B,n,
0.0,
TestMatrix,n);
-----------------------------^尝试更改为m
,最后一个参数:
最不发达国家
矩阵C的第一维的大小;如果你路过一个
矩阵C[m][n],值应为m
-----------------------------^尝试更改为m
,最后一个参数:
最不发达国家
矩阵C的第一维的大小;如果你路过一个
矩阵C[m][n],值应为m
你是说整数溢出吗?如何在64位机器上编译64位文件?此外,如果没有矩阵乘法(以及初始化),segfault不会发生。您可以检查这一点,例如,通过打印INT_MAX
fromlimits.h
I已检查,并且m*n不超过INT_MAX(2147483647)。不管怎样,我将初始化循环更改为long int,我们仍然存在故障。正如我所说,即使没有初始化,仍然有一个segfault.m*n是6e9,比INT大3倍_MAX@mch我的错误,是的,它更大。然而,这并不能解决问题。我假设cblas_dgemm使用long int或类似于索引数组的东西,不是吗?我相信我使用的是64位版本的库。你是说整数溢出吗?如何在64位机器上编译64位文件?此外,如果没有矩阵乘法(以及初始化),segfault不会发生。您可以检查这一点,例如,通过打印INT_MAX
fromlimits.h
I已检查,并且m*n不超过INT_MAX(2147483647)。不管怎样,我将初始化循环更改为long int,我们仍然存在故障。正如我所说,即使没有初始化,仍然有一个segfault.m*n是6e9,比INT大3倍_MAX@mch我的错误,是的,它更大。然而,这并不能解决问题。我假设cblas_dgemm使用long int或类似于索引数组的东西,不是吗?我相信我正在使用64位版本的库。我试过了,但它仍然存在故障。在C中,它是行主维度,因此前导维度应该是列数。您链接到的文档可能是指major列?这是我使用的文档:我试过了,但仍然存在故障。在C中,它是行主维度,因此前导维度应该是列数。您链接到的文档可能是指major列?以下是我使用的文档: