缘起
在使用学校的计算集群时,可以很方便地使用module load
命令来加载一些如Intel编译器、Python Anaconda之类的软件包,在不需要它们时也可以直接丢掉,这样可以很方便地选用和启用某些环境变量,防止某些环境变量污染其他软件的编译环境。
在自己的电脑上,为了安装和编译各种程序有时会下载安装很多编译器和软件包,这样在编译或运行某些程序时,由于环境变量的影响,编译器或程序经常会报错,于是我打算在自己的电脑上也安装module来管理这些软件包和环境变量。
module工具的安装与工作方式
安装module
对于Debian系系统如Ubuntu,可直接用apt安装:
|
|
一般会默认安装到/usr/share/modules
下。该路径下的modulefiles
文件夹会存放一些默认的module文件:
dot module-git module-info modules null use.own
用户使用module avail
命令可以查看它们。
如果发现module命令不能使用,是因为还没有进行初始化。在/usr/share/modules/init
下有针对如bash、 ksh、 fish、 tcsh、 zsh等各种shell的初始化工具。例如我在zsh内使用module工具,那么就需要运行如下命令来完成初始化:
|
|
由于每次重新登录系统或zsh之后都需要重新输入上述命令,为了方便起见,可以把它加入~/.zshrc
中。
module工具的工作方式
module工具通过识别modulefile的方式来罗列和加载用户指定的软件包和环境变量,一个典型的modulefile内容如下所示:
#%Module
proc ModulesHelp { } { puts stderr “This module adds solar to your path” }
module-whatis “This module adds solar to your path\n”
set basedir “/home/aturing/software/solar-1.2”
prepend-path PATH “${basedir}/bin”
prepend-path LD_LIBRARY_PATH “${basedir}/lib64”
module load intel/19.1/64/19.1.1.217
module load intel-mpi/intel/2019.7/64
在安装好module后,module会在默认的/usr/share/modules/modulefiles
路径下寻找modulefiles。在用户使用module avail
命令查看可用的module时,module工具会把/usr/share/modules/modulefiles
路径下的modulefiles展示出来。安装完module工具后默认的module一般如下所示:
——- /usr/share/modules/modulefiles ——–
dot module-git module-info modules null use.own
如果用户使用module load use.own
命令来加载use.own
,那么module工具会在用户根目录下创建privatemodules
文件夹,用户可以把自定义的modulefiles放在此文件夹下。之后位于~/privatemodules
目录下的modulefiles也会被module工具检测到。
安装软件包并用module工具管理
安装Intel的C++编译器icc
Intel为Intel芯片使用者免费提供自家的C++编译器icc和Fortran编译器ifort,用户可以在Intel的官网上下载安装。Intel提供多种安装方式,既有集成了多种Intel编译器与工具的oneAPI,也有这些编译器和工具的独立版本。完整版的oneAPI工具包很大,由于我目前只需要icc和ifort两个编译器,因此我只下载安装这两个独立版的编译器。
-
下载安装包
可以在Intel官网上下载独立版的icc编译器安装包,网址如下:https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#dpcpp-cpp。对于Linux/Windows/macOS各个系统,都有在线版和离线版两种安装包可选。可以选择在线版的安装包,例如我下载的安装包名称是
l_dpcpp-cpp-compiler_p_2022.1.0.137.sh
。也可以使用命令行下载:
1
wget https://registrationcenter-download.intel.com/akdlm/irc_nas/18717/l_dpcpp-cpp-compiler_p_2022.1.0.137.sh
-
运行安装包
下载完成后进入存放安装包的目录,使用如下命令安装:
1
sudo sh ./l_dpcpp-cpp-compiler_p_2022.1.0.137.sh -a -s --eula accept
其中
-a
表示使用命令行参数;-s
表示静默(silence)安装,即不弹出安装窗口;--eula accept
表示同意用户协议。详情可见Intel的安装指导.编译器默认安装在
/opt/intel/oneapi
目录下。 -
配置modulefiles
Intel在安装包内集成了可自动生成modulefiles的脚本,用户只需运行该脚本,就可以将安装的编译器或工具包自动编写成module工具可以使用的modulefiles。
配置脚本是位于安装目录
/opt/intel/oneapi
下的modulefiles-setup.sh
文件。用户在运行此脚本时可指定放置生成的modulefiles的文件夹,这里我选择将生成的modulefiles放在~/privatemodules
目录下:1
/opt/intel/oneapi/modulefiles-setup.sh --output-dir=$HOME/privatemodules
-
查看和加载编译器
完成上述步骤后就可以使用
module avail
命令来查看刚才安装的icc编译器了,在运行module avail
命令后会看到类似下面所示的输出:1 2 3 4 5 6 7 8
------------------------------------------------ /usr/share/modules/modulefiles ------------------------------------------------ dot module-git module-info modules null use.own ------------------------------------------------- /home/lijin/privatemodules --------------------------------------------------- compiler-rt/2022.1.0 compiler/2022.1.0 debugger/2021.6.0 icc/2022.1.0 init_opencl/2022.1.0 tbb/2021.6.0 compiler-rt/latest compiler/latest debugger/latest icc/latest init_opencl/latest tbb/latest compiler-rt32/2022.1.0 compiler32/2022.1.0 dev-utilities/2021.6.0 icc32/2022.1.0 oclfpga/2022.1.0 tbb32/2021.6.0 compiler-rt32/latest compiler32/latest dev-utilities/latest icc32/latest oclfpga/latest tbb32/latest
由于我还安装了一些其他工具,所以除了icc,还显示了其他的module。
然后使用
module load icc/latest
就可以加载安装的最新版本的icc编译器啦!
安装Intel的Fortran编译器ifort
安装ifort编译器的步骤与上述步骤类似,这里不再赘述。ifort编译器默认安装目录也是/opt/intel/oneapi
,安装完成后再次运行
|
|
即可更新~/privatemodules
目录下的modulefiles。