You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:
    sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu
    
    在弹出的选项中选择OpenBLAS对应的路径(如/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3)
  • 重启R后重新运行测试脚本,性能应接近Fedora水平
  • 可选:安装与Fedora一致的FlexiBLAS:
    sudo apt-get install flexiblas-dev flexiblas-openblas
    
    同样用update-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:33:16