在 C Mex 文件中使用 BLAS 库
Use BLAS library in C Mex-File
我正在尝试使用我的 C-Mex-Code 的 BLAS 库来分析使用和不使用 BLAS 时的性能差异。但是,我不知道如何在没有编译的情况下正确使用 BLAS errors/warnings(最终 Matlab 崩溃)。
下面是一个示例代码,我想在其中使用 Blas ( https://software.intel.com/de-de/node/468398#D4E53C70-D8FA-4095-A800-4203CAFE64FE ) 的 ddot() 函数计算向量积:
#include <mex.h>
#include <math.h>
#include <blas.h>
void TestBlas(double *L, double *R, mwSize n)
{
int one = 1;
double sum = ddot(&n,L,&one,L,&one);
//Output Matrix R not defined, just for test purposes...
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double *inMatrix; /* 1xN input matrix */
size_t ncols; /* size of matrix */
long *ncolsPr; /* output matrix */
double *outMatrix; /* output matrix */
inMatrix = mxGetPr(prhs[0]);
ncols = mxGetN(prhs[0]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL);
outMatrix = mxGetPr(plhs[0]);
TestBlas(inMatrix,outMatrix,(mwSize)ncols);
}
我收到的编译器警告是:
>> mex -largeArrayDims TestBlas.c -lmwblas
Building with 'Xcode with Clang'.
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:23: warning: passing 'mwSize *' (aka 'unsigned long *') to parameter of type 'const ptrdiff_t *' (aka 'const long *') converts between pointers to integer types with different sign [-Wpointer-sign]
double sum = ddot(&n,L,&one,L,&one);
^~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:559:22: note: passing argument to parameter 'n' here
const ptrdiff_t *n,
^
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:28: warning: incompatible pointer types passing 'int *' to parameter of type 'const ptrdiff_t *' (aka 'const long *') [-Wincompatible-pointer-types]
double sum = ddot(&n,L,&one,L,&one);
^~~~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:561:22: note: passing argument to parameter 'incx' here
const ptrdiff_t *incx,
^
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:35: warning: incompatible pointer types passing 'int *' to parameter of type 'const ptrdiff_t *' (aka 'const long *') [-Wincompatible-pointer-types]
double sum = ddot(&n,L,&one,L,&one);
^~~~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:563:22: note: passing argument to parameter 'incy' here
const ptrdiff_t *incy
^
3 warnings generated.
MEX completed successfully.
好像是我向 BLAS 函数传递了错误的变量类型(或指针类型?),但我就是不知道如何修复它。有人可以看看吗?
非常感谢!
如果我的怀疑是正确的,您只需定义代码中涉及的整数的正确类型即可:
#include <mex.h>
#include <math.h>
#include <blas.h>
void TestBlas(double *L, double *R, mwSignedIndex n) //changed
{
mwSignedIndex one = 1; //changed
double sum = ddot(&n,L,&one,L,&one);
//Output Matrix R not defined, just for test purposes...
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double *inMatrix; /* 1xN input matrix */
size_t ncols; /* size of matrix */
long *ncolsPr; /* output matrix */
double *outMatrix; /* output matrix */
inMatrix = mxGetPr(prhs[0]);
ncols = mxGetN(prhs[0]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix((mwSize)1,(mwSize)ncols,mxREAL); //changed
outMatrix = mxGetPr(plhs[0]);
TestBlas(inMatrix,outMatrix,(mwSignedIndex)ncols); //changed
}
根据我的经验,您必须特别注意函数调用中出现的文字常量,因此请注意 1
到 (mwSize)
的转换,这是 mxCreateDoubleMatrix
所期望的。
我正在尝试使用我的 C-Mex-Code 的 BLAS 库来分析使用和不使用 BLAS 时的性能差异。但是,我不知道如何在没有编译的情况下正确使用 BLAS errors/warnings(最终 Matlab 崩溃)。
下面是一个示例代码,我想在其中使用 Blas ( https://software.intel.com/de-de/node/468398#D4E53C70-D8FA-4095-A800-4203CAFE64FE ) 的 ddot() 函数计算向量积:
#include <mex.h>
#include <math.h>
#include <blas.h>
void TestBlas(double *L, double *R, mwSize n)
{
int one = 1;
double sum = ddot(&n,L,&one,L,&one);
//Output Matrix R not defined, just for test purposes...
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double *inMatrix; /* 1xN input matrix */
size_t ncols; /* size of matrix */
long *ncolsPr; /* output matrix */
double *outMatrix; /* output matrix */
inMatrix = mxGetPr(prhs[0]);
ncols = mxGetN(prhs[0]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL);
outMatrix = mxGetPr(plhs[0]);
TestBlas(inMatrix,outMatrix,(mwSize)ncols);
}
我收到的编译器警告是:
>> mex -largeArrayDims TestBlas.c -lmwblas
Building with 'Xcode with Clang'.
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:23: warning: passing 'mwSize *' (aka 'unsigned long *') to parameter of type 'const ptrdiff_t *' (aka 'const long *') converts between pointers to integer types with different sign [-Wpointer-sign]
double sum = ddot(&n,L,&one,L,&one);
^~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:559:22: note: passing argument to parameter 'n' here
const ptrdiff_t *n,
^
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:28: warning: incompatible pointer types passing 'int *' to parameter of type 'const ptrdiff_t *' (aka 'const long *') [-Wincompatible-pointer-types]
double sum = ddot(&n,L,&one,L,&one);
^~~~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:561:22: note: passing argument to parameter 'incx' here
const ptrdiff_t *incx,
^
/Users/jhess/Dropbox/Uni/E-Technik Master/Forschungspraxis Machine Learning/Matlab/TestBlas.c:9:35: warning: incompatible pointer types passing 'int *' to parameter of type 'const ptrdiff_t *' (aka 'const long *') [-Wincompatible-pointer-types]
double sum = ddot(&n,L,&one,L,&one);
^~~~
/Applications/MATLAB_R2015a.app/extern/include/blas.h:563:22: note: passing argument to parameter 'incy' here
const ptrdiff_t *incy
^
3 warnings generated.
MEX completed successfully.
好像是我向 BLAS 函数传递了错误的变量类型(或指针类型?),但我就是不知道如何修复它。有人可以看看吗? 非常感谢!
如果我的怀疑是正确的,您只需定义代码中涉及的整数的正确类型即可:
#include <mex.h>
#include <math.h>
#include <blas.h>
void TestBlas(double *L, double *R, mwSignedIndex n) //changed
{
mwSignedIndex one = 1; //changed
double sum = ddot(&n,L,&one,L,&one);
//Output Matrix R not defined, just for test purposes...
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double *inMatrix; /* 1xN input matrix */
size_t ncols; /* size of matrix */
long *ncolsPr; /* output matrix */
double *outMatrix; /* output matrix */
inMatrix = mxGetPr(prhs[0]);
ncols = mxGetN(prhs[0]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix((mwSize)1,(mwSize)ncols,mxREAL); //changed
outMatrix = mxGetPr(plhs[0]);
TestBlas(inMatrix,outMatrix,(mwSignedIndex)ncols); //changed
}
根据我的经验,您必须特别注意函数调用中出现的文字常量,因此请注意 1
到 (mwSize)
的转换,这是 mxCreateDoubleMatrix
所期望的。