首页 文章

希望快速并行优化Lapack常规(gfortran)问题

提问于
浏览
0

直到两天前我才认为我对此有一个非常清楚的认识,但现在我可能会过度思考它并使自己感到困惑 . 我将解释我正在做什么,然后提出一些可能过于简单的问题,但到目前为止我已经搜索并找到了相互矛盾的答案 . 当然有人可以帮我 .

我编写了一个使用LAPACK例程来解决特征值问题的fortran代码 . 我的问题设置是(A-LB)x = 0,其中L是我的特征值,x是我的特征向量,A和B是方形,复数,非对称,非埃尔米特,非三角矩阵 . A和B都是NxN,我的代码中的N通常在1000到3000之间 .

现在代码完美无缺 . 我'm using an optimized atlas install with LAPACK. I' m专门运行例程ZGGEV(link)因为,现在,我需要所有特征值解和所有相关的特征向量解 .

现在我正在尝试优化我的代码以更快地运行 . 我们实验室中的所有计算机都包含4个或8个核心CPU,并在Ubuntu上运行 . 在解决这个问题时,我可以做些什么来利用我的完整cpu?我一直在研究以下事项:

  • 我安装了一个优化的OpenBlas库,它肯定更快,但我注意到它仍然只使用1个核心(它有一个小的尖峰,它使用更多 . 我认为这个尖峰是并行运行的BLAS包,LAPACK仅限于一个核心?)

  • 我've investigated PLASMA, but it doesn'看起来它将以当前的形式解决我的等式 .

  • 我've looked into ScaLAPACK, but this is over my head at the moment and I'我不确定's worth learning to utilize on an 8 core CPU. Furthermore, I use openmp threading for a later section of my code and I'从未将openmp与MPI结合起来 .

最后,我有一些具体的Blas问题:

  • Atlas附带"libptcblas"和"libptf77blas"库 . 这些应该是线程库,但是当我使用它们时我并没有注意到它们之间的区别,实际上它运行得慢一点(我猜是由于开销) . 我需要打电话来利用这些吗?我是否有理由在"libcblas"和"libf77blas?"上使用这些库

  • 使用OpenBlas,它还构建了一个非常具体的"libopenblas_penrynp-r0.2.12."这是线程版吗?再次,我没有注意到运行此blas与运行"libopenblas"之间的任何差异 .

希望有人可以清理我的一些Blas问题并指出我更快的解决方法 . 谢谢!

1 回答

  • 1

    你是正确的期望主要来自BLAS而不是LAPACK例程的多线程行为 . 矩阵的大小足以利用多线程环境 . 我不确定ZGGEV例程中BLAS使用的扩展,但它应该不仅仅是一个尖峰 .

    关于你的具体问题 .

    • 即使我没有广泛使用ATLAS库,也知道"the number of threads to use is determined at compile time" . 请参考http://math-atlas.sourceforge.net/faq.html#tnum .

    • 具体 libopenblas_*.alibopenblas.a 的副本或软链接 . 线程号在编译时再次定义 .

    请检查库构建中的日志文件和std.out,并验证它们是否已识别出正确数量的CPU .

    我注意到你提到的不止一台机器 . 请注意,ATLAS是一个自动调整的库 . 所以你必须在每台机器上重新编译库 . 另一方面,Openblas在 make 中接受 DYNAMIC_ARCH=1 选项 . 该库动态指定每台机器中的优化例程 .

    我对你的多线程测试的建议是使用构建Openblas

    $ make DYNAMIC_ARCH=1 NUM_THREADS=8
    

    然后在你的程序中 CALL ZGEMM . 这个例程肯定是优化的,应该显示多线程行为 .

相关问题