Multithreading 希望快速并行优化拉帕克程序(gfortran)问题
直到两天前,我还以为我对这一点有了非常清晰的理解,但现在我可能想得太多了,弄糊涂了。我会解释我在做什么,然后问几个可能过于简单的问题,但到目前为止,我已经找到了相互矛盾的答案。肯定有人能纠正我的错误 我已经编写了一个fortran代码,它利用LAPACK例程来解决特征值问题。我的问题是(A-LB)x=0,其中L是我的特征值,x是我的特征向量,A和B是平方、复、非对称、非厄米、非三角矩阵。A和B都是NxN,在我的代码中,N通常在1000到3000之间 现在代码工作得很好。我正在使用LAPACK的优化atlas安装。我专门运行例程ZGGEV(),因为现在我需要所有的特征值解和所有相关的特征向量解 现在,我正试图优化我的代码,使其运行得更快。我们实验室的所有计算机都包含4或8个核心CPU,并在Ubuntu上运行。在解决这个问题时,我能做些什么来利用我的全部cpu吗?我一直在研究以下方面:Multithreading 希望快速并行优化拉帕克程序(gfortran)问题,multithreading,optimization,lapack,blas,eigenvalue,Multithreading,Optimization,Lapack,Blas,Eigenvalue,直到两天前,我还以为我对这一点有了非常清晰的理解,但现在我可能想得太多了,弄糊涂了。我会解释我在做什么,然后问几个可能过于简单的问题,但到目前为止,我已经找到了相互矛盾的答案。肯定有人能纠正我的错误 我已经编写了一个fortran代码,它利用LAPACK例程来解决特征值问题。我的问题是(A-LB)x=0,其中L是我的特征值,x是我的特征向量,A和B是平方、复、非对称、非厄米、非三角矩阵。A和B都是NxN,在我的代码中,N通常在1000到3000之间 现在代码工作得很好。我正在使用LAPACK的优
- 我安装了一个优化的OpenBlas库,速度肯定更快,但我注意到它仍然只使用1个内核(有一个小的峰值,它使用的更多。我假设这个峰值是并行运行的BLAS包,LAPACK仅限于一个内核?)
- 我已经研究过等离子体,但它看起来并不能以现在的形式解出我的方程
- 我研究过ScaLAPACK,但目前我还不清楚这是否值得学习在8核CPU上使用。此外,我在代码的后面部分使用openmp线程,我从未将openmp与MPI结合使用
希望有人能澄清我的一些Blas问题,并为我指出一个更快的解决方法。谢谢 您认为多线程行为主要来自BLAS而不是LAPACK例程是正确的。矩阵的大小足以利用多线程环境。我不确定BLAS在ZGGEV例程中的使用范围,但它应该不仅仅是一个峰值 关于你的具体问题
libopenblas_*.a
是
libopenblas.a
。线程编号在编译时再次定义make
中的DYNAMIC_ARCH=1
选项。此库动态指定每台机器中的优化例程
我对多线程测试的建议是使用
$ make DYNAMIC_ARCH=1 NUM_THREADS=8
然后在程序中调用ZGEMM。这是一个绝对优化的例程,应该显示多线程行为。非常感谢!我很确定我现在完全明白了。我为每台计算机分别制作了一个地图册。按照你的建议,我在ZGEMM上用Openblas做了许多测试,我肯定看到了并行加速。经过进一步检查,我确实得到了一些与ZGGEV加速,但很少。然而,Openblas的运行速度仍然比ATLAS快得多,因此这是一个优势。