我认为直到两天前我对此有一个非常清楚的认识,但现在我可能会过度思考它并使自己感到困惑。我将解释我正在做的事情,然后提出一些可能过于简单的问题,但到目前为止我已经搜索并找到了相互矛盾的答案。当然有人可以让我直截了当。
我编写了一个使用LAPACK例程来解决特征值问题的fortran代码。我的问题设置是(A-LB)x = 0,其中L是我的特征值,x是我的特征向量,A和B是方形,复数,非对称,非埃尔米特,非三角矩阵。 A和B都是NxN,我的代码中的N通常在1000到3000之间。
现在代码完美无缺。我使用LAPACK优化的地图集安装。我特意运行常规ZGGEV(link),因为目前我需要所有特征值解和所有相关的特征向量解。
现在我正在尝试优化代码以更快地运行。我们实验室中的所有计算机都包含4个或8个核心CPU,并在Ubuntu上运行。在解决这个问题时,我可以做些什么来利用我的完整cpu?我一直在研究以下事项:
最后,我有一些具体的Blas问题:
希望有人可以清理我的一些Blas问题并指出我采用更快的解决方法。谢谢!
答案 0 :(得分:1)
您正确期望主要来自BLAS而不是LAPACK例程的多线程行为。矩阵的大小足以利用多线程环境。我不确定ZGGEV例程中BLAS使用的扩展,但它应该不仅仅是一个尖峰。
关于您的具体问题。
libopenblas_*.a
是其中的副本或软链接
libopenblas.a
。线程号在编译时再次定义。请检查库构建中的日志文件和std.out,并验证它们是否已识别出正确数量的CPU。
我注意到你提到的不止一台机器。请注意,ATLAS是一个自动调整的库。所以你必须在每台机器上重新编译库。另一方面,Openblas在DYNAMIC_ARCH=1
中接受make
选项。该库动态指定每台机器中的优化例程。
我对你的多线程测试的建议是使用
构建Openblas$ make DYNAMIC_ARCH=1 NUM_THREADS=8
然后在您的计划中CALL ZGEMM
。这个例程绝对是优化的,应该显示多线程行为。