Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大矩阵上的cblasdgemm分割错误_C++_C_Blas_Intel Mkl - Fatal编程技术网

C++ 大矩阵上的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

我在一台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 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
from
limits.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
from
limits.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列?以下是我使用的文档: