Fedora与Ubuntu性能测试差异悬殊:R脚本运行耗时差40倍求助
问题:Fedora 38与Ubuntu 22.04上R矩阵乘法性能差异达40倍
我刚购置一台ZBook Fury G10用于数据科学工作,在全新安装的Fedora 38和Ubuntu 22.04系统上运行同一R脚本测试性能,发现耗时差距接近40倍:Fedora仅需1.2秒,Ubuntu却要44秒。求排查及优化建议。
测试脚本
# Set matrix dimensions matrix_size <- 4000 # Generate random matrices set.seed(123) matrix_a <- matrix(rnorm(matrix_size^2), nrow = matrix_size, ncol = matrix_size) matrix_b <- matrix(rnorm(matrix_size^2), nrow = matrix_size, ncol = matrix_size) # Measure time taken on start_time_p52s <- Sys.time() result_p52s <- matrix_a %*% matrix_b end_time_p52s <- Sys.time() # Calculate time taken on time_taken_p52s <- end_time_p52s - start_time_p52s # Print time taken on cat("Time taken to complete: ", time_taken_p52s, " seconds\n")
系统会话信息
Fedora 38
> sessionInfo() R version 4.3.1 (2023-06-16) Platform: x86_64-redhat-linux-gnu (64-bit) Running under: Fedora Linux 38 (Workstation Edition) Matrix products: default BLAS/LAPACK: FlexiBLAS OPENBLAS-OPENMP; LAPACK version 3.11.0 locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C time zone: US/Eastern tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.3.1
Ubuntu 22.04.3 LTS
> sessionInfo() R version 4.3.1 (2023-06-16) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 22.04.3 LTS Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0 locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_DK.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_DK.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_DK.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_DK.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.3.1
Linux Mint 21.2
> sessionInfo() R version 4.1.2 (2021-11-01) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Linux Mint 21.2 Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0 locale: [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.1.2
排查与优化方案
1. 核心原因:BLAS/LAPACK实现差异
从会话信息可直接定位问题:
- Fedora使用FlexiBLAS OPENBLAS-OPENMP,自带OpenMP多线程支持,LAPACK版本为3.11.0,能充分利用ZBook Fury G10的多核CPU
- Ubuntu和Linux Mint默认使用
libblas.so.3.10.0,这是BLAS的参考实现,通常为单线程,性能远低于优化后的多线程BLAS库
矩阵乘法是BLAS核心操作,单线程与多线程实现的性能差距可达数十倍,这就是耗时差40倍的关键。
2. 排查步骤
- 在Ubuntu的R中运行
library(parallel); detectCores()查看CPU核心数,再运行Sys.getenv("OMP_NUM_THREADS")或Sys.getenv("OPENBLAS_NUM_THREADS"),若返回空值或1,说明未启用多线程 - 在Ubuntu终端执行
update-alternatives --list libblas.so.3-x86_64-linux-gnu,确认系统是否已安装OpenBLAS等优化版本
3. Ubuntu优化操作
- 安装OpenBLAS:
sudo apt-get install libopenblas-dev - 设置OpenBLAS为默认BLAS:
在弹出的选项中选择OpenBLAS对应的路径(如sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3) - 重启R后重新运行测试脚本,性能应接近Fedora水平
- 可选:安装与Fedora一致的FlexiBLAS:
同样用sudo apt-get install flexiblas-dev flexiblas-openblasupdate-alternatives设置为默认,或在R中通过Sys.setenv(FLEXIBLAS_LIBRARY="openblas")临时切换
4. 额外验证
在R中运行sessionInfo()确认BLAS已切换为OpenBLAS,同时可手动设置线程数确保充分利用CPU:
Sys.setenv(OPENBLAS_NUM_THREADS = parallel::detectCores())
内容的提问来源于stack exchange,提问作者Søren ONeill
相关产品推荐
相关产品推荐

