我不明白BLAS,LAPACK和ATLAS是如何相关的以及我应该如何一起使用它们!我一直在查看他们的所有手册,我对BLAS和LAPACK以及如何在我找到的极少数示例中使用它们有了一般概念,但我找不到任何使用ATLAS的实际示例来查看它与这两个.
我正在尝试对矩阵做一些低级别的工作,我的主要语言是C.首先我想使用GSL,但它说如果你想要最好的性能,你应该使用BLAS和ATLAS.有没有什么好的网页提供一些很好的例子,说明如何一起使用这些(在C中)?换句话说,我正在寻找使用这三个(或其中任何一个子集!)的教程.总之我很困惑!
我正在建立我的numpy/scipy环境基于blas和lapack或多或少基于这个步骤.
当我完成后,如何检查,我的numpy/scipy函数是否确实使用了之前构建的blas/lapack功能?
我不确定这是否更像是一个操作系统问题,但我想我会问这里,以防任何人从Python的结尾有一些见解.
我一直在尝试使用一个CPU密集型for循环joblib,但是我发现不是将每个工作进程分配给不同的核心,我最终将它们全部分配到同一个核心而没有性能提升.
这是一个非常简单的例子......
from joblib import Parallel,delayed
import numpy as np
def testfunc(data):
# some very boneheaded CPU work
for nn in xrange(1000):
for ii in data[0,:]:
for jj in data[1,:]:
ii*jj
def run(niter=10):
data = (np.random.randn(2,100) for ii in xrange(niter))
pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
...这是我在htop脚本运行时看到的内容:

我在一台4核的笔记本电脑上运行Ubuntu 12.10(3.5.0-26).显然joblib.Parallel是为不同的工作者生成单独的进程,但有没有办法让这些进程在不同的内核上执行?
我想编写一个广泛使用BLAS和LAPACK线性代数功能的程序.由于性能是一个问题,我做了一些基准测试,并想知道,如果我采取的方法是合法的.
可以说,我有三位参赛者,他们希望用简单的矩阵矩阵乘法来测试他们的表现.参赛者是:
dot.我为不同的维度实现了矩阵 - 矩阵乘法i.i为5的增量和matricies运行5-500 m1和m2设置了这样的:
m1 = numpy.random.rand(i,i).astype(numpy.float32)
m2 = numpy.random.rand(i,i).astype(numpy.float32)
Run Code Online (Sandbox Code Playgroud)
使用的代码如下所示:
tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ import m1, m2")
rNumpy.append((i, tNumpy.repeat(20, 1)))
Run Code Online (Sandbox Code Playgroud)
有了这个功能
_blaslib = ctypes.cdll.LoadLibrary("libblas.so")
def Mul(m1, m2, i, r):
no_trans = c_char("n")
n = c_int(i)
one = c_float(1.0)
zero = c_float(0.0)
_blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(n), byref(n), byref(n),
byref(one), m1.ctypes.data_as(ctypes.c_void_p), byref(n),
m2.ctypes.data_as(ctypes.c_void_p), byref(n), byref(zero),
r.ctypes.data_as(ctypes.c_void_p), byref(n))
Run Code Online (Sandbox Code Playgroud)
测试代码如下所示:
r = …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我有循环,我构建和确定线性系统,并尝试解决它:
#pragma omp parallel for
for (int i = 0; i < n[0]+1; i++) {
for (int j = 0; j < n[1]+1; j++) {
for (int k = 0; k < n[2]+1; k++) {
arma::mat A(max_points, 2);
arma::mat y(max_points, 1);
// initialize A and y
arma::vec solution = solve(A,y);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有时,程序会随机挂起,或者解决方案向量中的结果是NaN.如果我这样做:
arma::vec solution;
#pragma omp critical
{
solution = solve(weights*A,weights*y);
}
Run Code Online (Sandbox Code Playgroud)
然后这些问题似乎不再发生了.
当它挂起时,它会这样做,因为有些线程正在等待OpenMP屏障:
Thread 2 (Thread 0x7fe4325a5700 (LWP 39839)):
#0 0x00007fe44d3c2084 in gomp_team_barrier_wait_end () from /usr/lib64/gcc-4.9.2/lib64/gcc/x86_64-redhat-linux-gnu/4.9.2/libgomp.so.1
#1 …Run Code Online (Sandbox Code Playgroud) 几天以来,我在使用MATLAB时不断收到同样的错误dlopen.我对MATLAB很新,这就是为什么我不知道该怎么做.谷歌似乎也没有帮助我.当我尝试制作一个特征向量时,我得到了这个:
Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
在进行乘法时我也得到了这个:
Error using *
BLAS loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么办.这些是我找到的主题:
有谁可以帮助我吗?
>> randn(3,3)
ans =
2.7694 0.7254 -0.2050
-1.3499 -0.0631 -0.1241
3.0349 0.7147 1.4897
>> eig(ans)
Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud) 我正在编写一个包含Cython扩展和使用LAPACK(和BLAS)的Python模块.我打开使用两种clapack或lapacke,或某种f2c或f2py解决方案,如果必要的.最重要的是,我能够调用lapack并blas从用Cython在紧密循环不Python的调用开销例程.
我在这里找到了一个例子.但是,该示例取决于SAGE.我希望我的模块可以在不安装SAGE的情况下进行安装,因为我的用户不太可能想要或不需要SAGE.我的用户很可能安装了numpy,scipy,pandas和scikit的软件包,所以这些都是合理的依赖.使用的接口的最佳组合是什么,以及最小的setup.py文件看起来可以获取必要的信息(来自numpy,scipy等)以进行编译?
编辑: 这是我最终做的.它适用于我的macbook,但我不知道它是多么便携.当然有更好的方法.
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
from Cython.Build import cythonize
from numpy.distutils.system_info import get_info
# TODO: This cannot be the right way
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:]
includes = [blas_include,numpy.get_include()]
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"],
include_dirs = includes,
libraries=['blas','lapack'])
])
)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为在我的macbook上,clapack.h头文件与...相同cblas.h.然后我可以在我的pyx文件中执行此操作:
ctypedef np.int32_t …Run Code Online (Sandbox Code Playgroud) 当我跑步时,sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})我得到了InternalError: Blas SGEMM launch failed.这是完整的错误和堆栈跟踪:
InternalErrorTraceback (most recent call last)
<ipython-input-9-a3261a02bdce> in <module>()
1 batch_xs, batch_ys = mnist.train.next_batch(100)
----> 2 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
338 try:
339 result = self._run(None, fetches, feed_dict, options_ptr,
--> 340 run_metadata_ptr)
341 if run_metadata:
342 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
562 try:
563 results = self._do_run(handle, target_list, unique_fetches,
--> 564 feed_dict_string, options, run_metadata) …Run Code Online (Sandbox Code Playgroud) 我试图在Python中实现大量的矩阵 - 矩阵乘法.最初,我假设NumPy将自动使用我的线程BLAS库,因为我是针对这些库构建的.但是,当我查看顶部或其他内容时,似乎代码根本不使用线程.
任何想法是什么错误或我可以做些什么来轻松使用BLAS性能?