【发布时间】:2014-08-11 18:19:14
【问题描述】:
我的程序是用 C++ 编写的,我使用 Eigen 库进行其中的矩阵运算。里面有一个巨大的矩阵积,尺寸分别为50000*1000和1000*50000。所以我尝试从 MKL 库中调用 BLAS 函数来提高性能。然后调用 dgemm 函数时出现分段错误。
这里是代码
double alpha = 1, beta = 0;
double *s1;
MKL_INT mm1 = q, nn1 = q, kk1 = ncol1;
s1 = (double *)malloc(q*q*sizeof(double));
cout << 14 << endl;
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,mm1, nn1, kk1, alpha, V.data(), mm1, A01.data(), kk1, beta, s1, mm1);
代码在小尺寸下工作正常。我用以下代码编译代码:
icpc lapack.cpp generators.cpp SimpleRNG.cpp example.cpp -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lpthread -lm -DMKL_ILP64 -o new_example.o
或
icpc lapack.cpp generators.cpp SimpleRNG.cpp example.cpp -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -o new_example.o
即:我尝试了 LP64 接口和 ILP64 接口,但它们都不起作用,有人可以帮我吗?我在Linux服务器上运行程序,内存很大。
非常感谢!
【问题讨论】:
-
50000 * 50000 * sizeof(double)约为 20GB(假设为 8 字节doubles)。你检查你的malloc的返回值了吗? -
这个问题标记为C++,你为什么用
malloc而不是std::vector?此外,鉴于您使用的是malloc,那么对free的调用在哪里?另外:你为什么使用 C 风格的演员表? -
@T.C.,谢谢提醒,我把内存分配部分改成'double s1 = (double)mkl_malloc(sizeof(double)*nn1*nn1, 64)',并使用 ilp 接口编译,现在代码可以工作了。你介意回答这个问题吗,我会马上接受的。
-
@RobertAllanHenniganLeahy,感谢您的评论,这里我使用 CBLAS 作为接口来调用用 fortran 编写的 BLAS 函数。 CBLAS是C接口,所以我使用malloc(),函数末尾有free()。
-
我使用bpeek查看服务器的实时输出,有时输出很长,我需要使用什么命令将输出重定向到服务器上的文件,所以我可以检查?谢谢!
标签: c++ segmentation-fault eigen lapack blas