有人知道MATLAB用于执行BLAS1类型操作的内容,例如dscal
或daxpy
吗?
>> 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重新实现了这个基本功能吗?这样做的原因是什么?最后 - 它在哪里实施,我可以预先加载/替换它吗?
答案 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';