【问题标题】:Compile r with mkl (With mulithreads support)使用 mkl 编译 r(支持多线程)
【发布时间】:2013-02-06 10:46:03
【问题描述】:

我根据这些指南编译了 R:

http://www.r-bloggers.com/compiling-64-bit-r-2-10-1-with-mkl-in-linux/

http://cran.r-project.org/doc/manuals/R-admin.html#MKL

但是对于矩阵代数,R 并不使用所有可用的 CPU。

我都试过了:

MKL="-L${MKL_LIB_PATH} -lmkl_gf_lp64 -lmkl_gnu_thread \
      -lmkl_core -fopenmp -lpthread"

MKL="   -L${MKL_LIB_PATH}                               \
-Wl,--start-group                               \
            ${MKL_LIB_PATH}/libmkl_gf_lp64.a        \
            ${MKL_LIB_PATH}/libmkl_gnu_thread.a     \
            ${MKL_LIB_PATH}/libmkl_core.a           \
 -Wl,--end-group                                 \
 -lgomp -lpthread"

选项。

如何强制 R 使用所有可用的 CPU?

如何检查 R 是否使用 MKL?

【问题讨论】:

    标签: multithreading r compilation intel-mkl


    【解决方案1】:

    我想添加我的程序来用 MKL 库编译 R 3.0.1。我在核心 i7 英特尔处理器、8G RAM 上使用 Debian 7.0。首先我安装了 MKL 库,在我用这个命令设置了 MKL 相关的环境变量(MKLROOT 和 LD_LIBRARY_PATH)之后:

    >source /opt/intel/mkl/bin/mklvars.sh intel64
    

    所以我在./configure中使用了以下参数:

    >./configure --enable-R-shlib --enable-threads=posix --with-lapack --with-blas="-fopenmp -m64 -I$MKLROOT/include -L$MKLROOT/lib/intel64 -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lpthread -lm"
    

    并使用 make 和 make install 完成安装。

    作为基准,我在没有 MKL 的情况下做了两个 5000 x 5000 矩阵产品之间的产品并得到:

    用户系统已过 57.455 0.104 29.033

    编译后:

    用户系统已过 15.993 0.176 4.333

    真正的收获!

    【讨论】:

      【解决方案2】:

      现在所有这一切都变得容易多了——简短的blog post is here 详细讨论了以下步骤。

      但简而言之,您所需要的只是:

      ## get archive key
      cd /tmp
      wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
      apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
      
      ## add MKL to apt's repo list
      sh -c 'echo deb https://apt.repos.intel.com/mkl all main > /etc/apt/sources.list.d/intel-mkl.list'
      
      ## update and install (500+ mb download, 1.9gb installed)    
      apt-get update
      apt-get install intel-mkl-64bit-2018.2-046 
      
      ## make it system default via update alternatives
      update-alternatives --install /usr/lib/x86_64-linux-gnu/libblas.so     libblas.so-x86_64-linux-gnu      /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
      update-alternatives --install /usr/lib/x86_64-linux-gnu/libblas.so.3   libblas.so.3-x86_64-linux-gnu    /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
      update-alternatives --install /usr/lib/x86_64-linux-gnu/liblapack.so   liblapack.so-x86_64-linux-gnu    /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
      update-alternatives --install /usr/lib/x86_64-linux-gnu/liblapack.so.3 liblapack.so.3-x86_64-linux-gnu  /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
      
      ## tell ldconfig
      echo "/opt/intel/lib/intel64"     >  /etc/ld.so.conf.d/mkl.conf
      echo "/opt/intel/mkl/lib/intel64" >> /etc/ld.so.conf.d/mkl.conf
      ldconfig
      

      就是这样。没有其他的。不重新编译或链接。例如,R 现在显示在 sessionInfo() 中:

      Matrix products: default
      BLAS/LAPACK: /opt/intel/compilers_and_libraries_2018.2.199/linux/mkl/lib/intel64_lin/libmkl_rt.so
      

      【讨论】:

        【解决方案3】:

        (不是一个真正的答案:我不使用 MKL,我使用 OpenBlas 作为shared BLAS as described in the R-admin manual。)

        • 作为快速检查是否使用了优化的 BLAS,我进行了矩阵乘法。即使只使用 1 个内核,优化的 BLAS 也应该比标准 BLAS R 的速度更快。

        • 为了检查有多少内核在使用,我在矩阵乘法过程中查看top(或 CPU 使用图/监视器)。

        • 过去在 CPU 关联性方面存在问题,因此 BLAS 会启动 $n$ 个线程,但它们都运行在同一个内核上,请参阅 Parallel processing in R limited
          r-devel (3.0.0-to-be) 有设置 CPU 亲和性的功能。

        【讨论】:

          【解决方案4】:
          猜你喜欢
          • 1970-01-01
          • 2011-12-23
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 2017-05-20
          • 1970-01-01
          • 2012-02-27
          • 2011-12-17
          相关资源
          最近更新 更多