在Ubuntu20.04中,有许多用于OpenBLAS的包。
~$ 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倍。
发布于 2021-09-22 00:31:42
zgetrf()中,如果数组是uint32_t *ip,那么它不适合使用64版本,因为您的内存对齐是元素之间的4字节(uint32_t),而不是8字节。您必须重构代码以支持数组元素(uint64_t)之间的8字节对齐。我正在将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:
下面是在测试Ubuntu20.04时从我的记事本上粘贴的数字。每个部分的前两行定义了为测试选择的内容。这些测试是在KVM下的CentOS 7 VM上运行的,其中有24个vCPU,运行在一个双套接字XeonE5-2450 v2服务器上,有32个逻辑处理器:16个核心,32个线程。系统管理程序被轻松加载,不应该过多地干扰数字,但是肯定会有一些抖动。
/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/openblas-serial/liblapack.so.3
Serial:
Frequency_Loop elapsed time: 11.757070 seconds
Frequency_Loop elapsed time: 11.566754 seconds/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/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/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/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请注意,在某些情况下,限制线程可以减少线程争用并提高性能:
/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 secondsOpenBLAS的OpenMP在本例中表现最好。但是,如果您的代码被很好地分区,您可能会受益于fork()ing或使用p线程来完全并行地运行。对于单任务并行,分叉作业和_NUM_THREADS之间的一些平衡可能会很好地工作--但是将分叉与OpenBLAS或ATLAS的线程结合起来会引起争论。
例如,xnec2c支持运行频率作业数的-jNN选项。对于许多频率来说,在完全分叉()ed并行(每个频率一个作业)中运行串行LAPACK版本通常是最快的,而不是使用更多OpenBLAS/ATLAS线程运行更少的并行分叉作业,因为矩阵操作通常有一个无法并行化的大部分串行还原阶段。(见Amdahl定律.)
旁注:如果你为主机重新编译你的CPU,阿特拉斯会自动调整它。OpenBLAS可能也会这么做,但不确定。
https://askubuntu.com/questions/1318554
复制相似问题