对向量的BLAS1类型操作

时间:2013-12-11 11:16:25

标签: matlab blas

有人知道MATLAB用于执行BLAS1类型操作的内容,例如dscaldaxpy吗?

>> a=ones(1,1e6,'double');
>> b=ones(1,1e6,'double');
>> a=2*a;  % dscal
>> a=2*a+1;
>> b=2*b+a; % daxpy

我已使用BLAS_VERSION环境变量替换了MATLABs BLAS库。我使用了自定义编译(和修改)的OpenBLAS,并在此处插入了一些printf以查看MATLAB是否正在调用库。我确实得到了printf矩阵 - 矩阵乘法,但我没有得到任何简单的BLAS1操作。这是一种耻辱,因为出于性能原因我真的需要这个。

这让我想知道 - MATLAB重新实现了这个基本功能吗?这样做的原因是什么?最后 - 它在哪里实施,我可以预先加载/替换它吗?

1 个答案:

答案 0 :(得分:1)

经过更多调查后,我现在确定MATLAB不会将BLAS用于所有向量操作(它确实将其用于某些操作 - 请参阅下面的编辑注释)。您可以通过以下方式在Linux下验证这一点。启动MATLAB,然后

>> feature getpid
ans =
   13608

从linux终端检查,MATLAB加载了哪些动态库,或者确切地说,检查MKL是否已加载(我在Intel CPU上测试):

$ cat /proc/13608/numa_maps | grep mkl

以上返回空输出,因此mkl尚未链接。现在,对矢量执行简单的操作:

>> a=zeros(1, 1e6, 'double');
>> a=2*a; % dscal

再次检查库:

$ cat /proc/13608/numa_maps | grep mkl

同样,输出为空,所以没有MKL。您可以检查其他BLAS1操作是否相同。现在,做一个BLAS3操作:

>> A=zeros(100);
>> B=A*A';

并检查mkl

的链接库
$ cat /proc/13608/numa_maps | grep mkl

7f4b687ec000 prefer:0 file=/home/matlab/R2013a/bin/glnxa64/mklcompat.so
7f4b6afb4000 prefer:0 file=/home/matlab/R2013a/bin/glnxa64/mkl.so
[...]

所以是的,MATLAB确实将BLAS库用于BLAS3,不,它不会将它用于BLAS1。我还没有找到任何方法可以用MATLABs内部函数代替向量上的操作。而且我相信没有。它们似乎是在一个核心MATLAB库(libmwmcr)中实现的。

修改 事实证明,BLAS1库用于计算点积:

>> a=zeros(1, 1e6, 'double');
>> b=zeros(1, 1e6, 'double');
>> c=a*b';