首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么会有这么多的OpenBLAS包,哪一个会产生最快的结果?

为什么会有这么多的OpenBLAS包,哪一个会产生最快的结果?
EN

Ask Ubuntu用户
提问于 2021-02-23 03:33:56
回答 1查看 4.8K关注 0票数 3

在Ubuntu20.04中,有许多用于OpenBLAS的包。

代码语言:javascript
复制
~$ apt search openblas
p   libopenblas-base                              - Optimized BLAS (linear algebra) library (transitional)                                               
p   libopenblas-dev                               - Optimized BLAS (linear algebra) library (dev, meta)                                                  
p   libopenblas-openmp-dev                        - Optimized BLAS (linear algebra) library (dev, openmp)                                                
p   libopenblas-pthread-dev                       - Optimized BLAS (linear algebra) library (dev, pthread)                                               
p   libopenblas-serial-dev                        - Optimized BLAS (linear algebra) library (dev, serial)                                                
i A libopenblas0                                  - Optimized BLAS (linear algebra) library (meta)                                                       
p   libopenblas0-openmp                           - Optimized BLAS (linear algebra) library (shared lib, openmp)                                         
i A libopenblas0-pthread                          - Optimized BLAS (linear algebra) library (shared lib, pthread)                                        
p   libopenblas0-serial                           - Optimized BLAS (linear algebra) library (shared lib, serial)                                         
p   libopenblas64-0                               - Optimized BLAS (linear algebra) library (shared lib, 64bit, meta)                                    
p   libopenblas64-0-openmp                        - Optimized BLAS (linear algebra) library (shared lib, 64bit, openmp)                                  
p   libopenblas64-0-pthread                       - Optimized BLAS (linear algebra) library (shared lib, 64bit, pthread)                                 
p   libopenblas64-0-serial                        - Optimized BLAS (linear algebra) library (shared lib, 64bit, serial)                                  
p   libopenblas64-dev                             - Optimized BLAS (linear algebra) library (dev, 64bit, meta)                                           
p   libopenblas64-openmp-dev                      - Optimized BLAS (linear algebra) library (dev, 64bit, openmp)                                         
p   libopenblas64-pthread-dev                     - Optimized BLAS (linear algebra) library (dev, 64bit, pthread)                                        
p   libopenblas64-serial-dev                      - Optimized BLAS (linear algebra) library (dev, 64bit, serial)

这些软件包中哪一个会产生最快的结果?

我打算用GNU做数值计算(主要是对角化矩阵)。我的计算机有一个Intel Corei3-5005U处理器(如果优化的包应该取决于处理器类型,请注意哪个包在其他类型的处理器上应该是首选的)。

我注意到,当使用OpenBLAS而不是默认的BLAS时,速度至少提高了10倍。

EN

回答 1

Ask Ubuntu用户

发布于 2021-09-22 00:31:42

,为什么有这么多人?

  • -dev库包括头和库,用于在
  • libopenblas0 0*库具有32位(即,uint32_t)参数。
  • libopenblas64 64-0*库具有64位(即,uint64_t)参数。
    • 例如,在zgetrf()中,如果数组是uint32_t *ip,那么它不适合使用64版本,因为您的内存对齐是元素之间的4字节(uint32_t),而不是8字节。您必须重构代码以支持数组元素(uint64_t)之间的8字节对齐。
    • 如果您使用64,但设置为32,则会崩溃。
    • 如果您使用32,并设置为64,它可能不会出界,但您不会得到一个正确的结果。

基准测试

我正在将LAPACK、ATLAS和OpenBLAS支持集成到xnec2c电磁模拟器中,并具有以下基准测试,特别是针对zgetrf()和zgetrs()来代替现有的NEC2高斯消除算法。一定要为您的应用程序运行自己的基准测试,结果会有所不同。

在Ubuntu 20.04中,我们选择了以下库:

  • ~# update-alternatives --config libblas.so.3-x86_64-linux-gnu
  • ~# update-alternatives --config liblapack.so.3-x86_64-linux-gnu

在CentOS/RHEL中,您有以下库,可以直接访问它们,而不需要使用alternatives

  • libopenblas.so:系列
  • libopenblaso.so: OpenMP
  • libopenblasp.so: p线程

下面是在测试Ubuntu20.04时从我的记事本上粘贴的数字。每个部分的前两行定义了为测试选择的内容。这些测试是在KVM下的CentOS 7 VM上运行的,其中有24个vCPU,运行在一个双套接字XeonE5-2450 v2服务器上,有32个逻辑处理器:16个核心,32个线程。系统管理程序被轻松加载,不应该过多地干扰数字,但是肯定会有一些抖动。

默认LAPACK+BLAS:

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/blas/libblas.so.3
/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3
  Serial:
    Frequency_Loop elapsed time: 17.540371 seconds
    Frequency_Loop elapsed time: 16.697984 seconds
    Frequency_Loop elapsed time: 15.621345 seconds
    Frequency_Loop elapsed time: 15.515307 seconds

使用ATLAS的

/usr/lib/x86_64-linux-gnu/atlas/libblas.so.3 /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3 Serial: Frequency_Loop elapsed time: 12.882587 seconds Frequency_Loop elapsed time: 12.233791 seconds Frequency_Loop elapsed time: 12.828287 seconds Frequency_Loop elapsed time: 12.607457 seconds

混合ATLAS的BLAS和OpenBLAS系列

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/atlas/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-serial/liblapack.so.3
  Serial:
    Frequency_Loop elapsed time: 11.757070 seconds
    Frequency_Loop elapsed time: 11.566754 seconds

OpenBLAS串行

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/openblas-serial/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-serial/liblapack.so.3
  Serial:
    Frequency_Loop elapsed time: 11.345475 seconds
    Frequency_Loop elapsed time: 12.047305 seconds
    Frequency_Loop elapsed time: 11.693541 seconds

OpenBLAS系列LAPACK与OpenMP BLAS

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/openblas-openmp/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-serial/liblapack.so.3
  Serial (or barely threaded, 101%)
    Frequency_Loop elapsed time: 11.049351 seconds
    Frequency_Loop elapsed time: 11.756581 seconds

OpenBLAS OpenMP

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/openblas-openmp/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-openmp/liblapack.so.3
  Threaded (~400% cpu)
    Frequency_Loop elapsed time: 8.079269 seconds
    Frequency_Loop elapsed time: 8.119229 seconds
    Frequency_Loop elapsed time: 8.329753 seconds

OpenBLAS OpenMP LAPACK与默认BLAS

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/blas/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-openmp/liblapack.so.3
    Frequency_Loop elapsed time: 8.161807 seconds
    Frequency_Loop elapsed time: 8.009399 seconds

OpenBLAS线程具有不同的线程限制.

请注意,在某些情况下,限制线程可以减少线程争用并提高性能:

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
/usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3
  Threaded 1400% cpu
    Frequency_Loop elapsed time: 13.181950 seconds
    Frequency_Loop elapsed time: 12.866588 seconds
  OPENBLAS_NUM_THREADS=4
    Frequency_Loop elapsed time: 9.567861 seconds
  OPENBLAS_NUM_THREADS=8
    Frequency_Loop elapsed time: 8.767348 seconds
  OPENBLAS_NUM_THREADS=16
    Frequency_Loop elapsed time: 9.818271 seconds

结果

OpenBLAS的OpenMP在本例中表现最好。但是,如果您的代码被很好地分区,您可能会受益于fork()ing或使用p线程来完全并行地运行。对于单任务并行,分叉作业和_NUM_THREADS之间的一些平衡可能会很好地工作--但是将分叉与OpenBLAS或ATLAS的线程结合起来会引起争论。

例如,xnec2c支持运行频率作业数的-jNN选项。对于许多频率来说,在完全分叉()ed并行(每个频率一个作业)中运行串行LAPACK版本通常是最快的,而不是使用更多OpenBLAS/ATLAS线程运行更少的并行分叉作业,因为矩阵操作通常有一个无法并行化的大部分串行还原阶段。(见Amdahl定律.)

旁注:如果你为主机重新编译你的CPU,阿特拉斯会自动调整它。OpenBLAS可能也会这么做,但不确定。

票数 4
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1318554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档