Environment Modules 简明教程

1. Modules 简介

在 Linux 超算平台上,通常会安装有不同版本的多种编译器和其他软件等,如常用的编译器有 intel 和 gnu,常用的 MPI 并行库包括 intel mpi,openmpi,mpich2 等,而且对于同一软件,还包含不同的版本或采用不同编译设置得到的可执行程序和链接库等。在使用这些程序时,经常需要对环境变量进行修改。并且由于程序编译时会调用不同类型编译器或第三库,这时程序之间还存在着依赖关系。这使得当执行某个特定版本的程序时,环境变量的修改变得十分复杂。

Environment Modules 包是一个简化 shell 初始化的工具,它允许用户在使用 modulefiles 进行会话期间轻松修改其环境。每个模块文件都包含为应用程序配置 shell 所需的信息。模块文件可以由系统上的许多用户共享,并且用户可以拥有自己的集合来补充或替换共享模块文件。

2. Modules 安装

Modules 可直接采用源码安装方式,在Modules 官网下载最新4.2.1版本的源代码。在 Terminal 中输入如下命令安装 Modules 软件

# modules 安装目录
INSTALL_PATH=${HOME}/opt/modules-4.2.1/ tar -xvf modules-4.2.1.tar # 进入 modules 目录
cd modules-4.2.1 # 安装 modules 软件
./configure --prefix=${INSTALL_PATH}
make
make install

在安装完毕后我们将 modules 设置脚本添加入环境变量中。注意,modules 中包含多种 shell 设置脚本,可以根据不同情况设置。这里由于我们用的是 zsh,输入如下命令即可

echo "souce ${HOME}/opt/modules-4.2.1/init/zsh" >> ~/.zshrc
souce ~/.zshrc

输入如下命令,查看当前包含的模块并加载用户模块

➜  ~ module avail
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own
➜ ~ module load use.own
➜ ~ module list
Currently Loaded Modulefiles:
1) use.own

此时,用户目录下会出现 privatemodules 文件夹,用户可以直接在此文件夹中添加自定义模块文件添加环境变量。

3. Modules 使用

Modules 使用包括 shell 命令和 modulefile 文件定义两部分内容,下面将分别进行介绍。

3.1. Modules 指令

module 安装好后,即可调用 module [command] 来查看或加载模块,主要指令如下

➜ ~ module avail # 列出当前 module path 中的所有可用模块文件
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own ----------------------------------------- /home/lilongxiang/privatemodules -----------------------------------------
cmake/3.8.0 ➜ ~ module load cmake/3.8.0 # 加载模块文件/类 ➜ ~ module list # 显示已经加载的模块
Currently Loaded Modulefiles:
1) use.own 2) cmake/3.8.0 ➜ ~ module unload cmake # 卸载模块文件/类 ➜ ~ module list # 显示已经加载的模块
Currently Loaded Modulefiles:
1) use.own

3.2. Modules 脚本内容

采用 module load 命令时,可用的模块其实都是安装在 module path 目录下的 modulefile 文件。一个基本 modulefile 内容如下

#%Module -*- tcl -*-
## This is a module to access something # 显示 module help 主要内容
proc ModulesHelp { } {
puts stderr "This module sets up access to something"
} # 显示 module whatis 显示主要内容
module-whatis "sets up access to something"
# module 加载前需要模块类
prereq module_flag
# module 加载冲突模块类
conflict another_module_flag # 加载其他模块
module load gcc
# 设置环境变量
setenv SOMEVERION 0.95
# 添加环境变量
append-path PATH /home/[user]/[somedir]/bin
append-path MANPATH /home/[user]/[somedir]/man
append-path LD_LIBRARY_PATH /home/[user]/[somedir]/lib

其中包含的设置关键字有以下几个

  • prereq 指示加载此脚本需要预先加载的模块名,当这些模块没有预先加载时,module load 此模块会报错;
  • conflict 指示与此模块冲突的其他模块类,注意这里不仅可以添加 modulefile 文件名称,也可添加 modulefile 所在路径文件名,此时代表模块和文件内所有模块类都会产生冲突;
  • module load 指示加载此模块同时自动加载的模块,注意其和 prereq 命令的不同;
  • setenv 设定环境变量;
  • append-path 添加环境变量;

3.3. Modules 脚本配置

modulefile 文件可以按照相关功能添加到不同目录中,下面显示了 privatemodules 文件夹内所有 modulefile 文件

.
├── cmake
│   └── 3.8.0
├── compiler
│   └── intel
│   └── 2018.1.163
└── mpi
├── gnu
│   ├── mpich2
│   │   └── 3.2.1
│   └── openmpi
│   └── 3.1.3
├── intel
│   ├── intel_mpi
│   │   └── 2018.1.163
│   ├── mpich2
│   └── openmpi
│   └── 3.1.3
└── mpich2

调用 module avail 命令,对应显示内容如下

➜ ~ module avail
------------------------------------------ /usr/share/Modules/modulefiles ------------------------------------------
dot module-git module-info modules null use.own ----------------------------------------- /home/lilongxiang/privatemodules -----------------------------------------
cmake/3.8.0 mpi/gnu/mpich2/3.2.1 mpi/intel/intel_mpi/2018.1.163
compiler/intel/2018.1.163 mpi/gnu/openmpi/3.1.3 mpi/intel/openmpi/3.1.3

在此用户配置文件中,所有与 mpi 库相关的 modulefile 文件都放在了目录 privatemodules/mpi 内,并且根据编译时所调用的编译器种类分为 gnu 和 intel 两个文件夹。

按照这种设置方法可以方便的对 modulefile 文件进行配置,在每个 modulefile 文件内添加 conflict mpi,即可避免用户加载不同的 mpi 配置文件,当加载多个时 module 程序会直接报错

➜ ~ module load mpi/intel/openmpi/3.1.3
Loading mpi/intel/openmpi/3.1.3
Loading requirement: compiler/intel/2018.1.163
➜ ~ module load mpi/gnu/openmpi/3.1.3
Loading mpi/gnu/openmpi/3.1.3
ERROR: mpi/gnu/openmpi/3.1.3 cannot be loaded due to a conflict.
HINT: Might try "module unload mpi/intel/openmpi/3.1.3" first.

4. Modules 示例

4.1. Intel 编译器环境变量设置

intel 编译器安装后提供了 compilervars.sh 脚本文件自动为用户添加环境变量设置,但是这种方法不适用于 module 脚本,因为 modulefile 实际为 tcl 脚本文件,因此无法运行 shell 命令。

为了获取 intel 脚本内 设定的环境变量,可以采用 env2 脚本来方便的直接获取。下载 env2 脚本,运行

perl ./env2 -from bash -to modulecmd "<path to intel shell script> intel64" >> intell_module_file.log

即可在 intell_module_file.log 中查看 compilervars.sh 总定义的所有环境变量。将 intell_module_file.log 文件放置到 ~/privatemodules/compiler/intel/ 路径下,文件名用具体版本号 2018.1.163 替代,随后便可用

module load compiler/intel/2018.1.163

命令添加 intel 编译器环境变量。

4.2. openmpi 环境变量设置

在设置好 intel 编译器环境后,编译 openmpi 库并安装到 ${HOME}/opt/openmpi-3.1.3-intel 目录下。

privatemodules/mpi/intel/openmpi/3.1.3 文件内添加

#%Module -*- tcl -*-
## This is a module to access cmake-3.8.0-rc1
proc ModulesHelp { } {
puts stderr "This module sets up access to openmpi-3.1.3 built with intel compiler"
}
module-whatis "sets up access to openmpi-3.1.3 with intel compiler"
#prereq intel_2018
conflict mpi
module load compiler/intel/2018.1.163
setenv SOMEVERION 3.1.3
append-path PATH ${HOME}/opt/openmpi-3.1.3-intel/bin
append-path LD_LIBRARY_PATH ${HOME}/opt/openmpi-3.1.3-intel/lib

即可通过命令 module load mpi/intel/openmpi/3.1.3 来加载编译后的 openmpi 环境。

Environment Modules 简明教程的更多相关文章

  1. appium简明教程

    appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...

  2. SaltStack简明教程

    第1章 SaltStack简明教程 1.1 SaltStack简介 SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS E ...

  3. React-Router 中文简明教程(上)

    概述 说起 前端路由,如果你用过前端 MV* 框架构建 SPA 应用(单页面应用),对此一定不陌生. 传统开发中的 路由,是由服务端根据不同的用户请求地址 URL,返回不同内容的页面,而前端路由则将这 ...

  4. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  5. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

  6. 2013 duilib入门简明教程 -- 部分bug 2 (14)

        上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃            如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...

  7. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  8. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  9. 2013 duilib入门简明教程 -- FAQ (19)

        虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下.     需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...

随机推荐

  1. Shadertoy 教程 Part 1 - 介绍

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  2. 【UE4 C++】DateTime、Timespan 相关函数

    基于UKismetMathLibrary DateTime 相关函数 Timespan 运算操作相关函数见尾部附录 /** Returns the date component of A */ UFU ...

  3. [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp

    博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...

  4. 单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  5. 嵌入式单片机stm32之DMA实验

    一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...

  6. Linux Shell Here Document

    Here Document 是一种有特殊用处的代码块,他使用IO重定向的形式记录了一段临时的文本或交互命令,并且把这些文本或命令 依次的传递给一个程序或一个命令,作为他运行时的标准输入. Here d ...

  7. 原串反转 牛客网 程序员面试金典 C++ Python

    原串反转 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniS ...

  8. hdu 5172 GTY's gay friends(线段树最值)

    题意: GTY有n个朋友,站成一排,每个人有一个特征值ai. 有m个询问.每次询问给两个数L,R.问你[L,R](即aL...aR)是否是1..(R-L+1)的一个全排列. 是输出YES,否则输出NO ...

  9. 前端面试手写代码——模拟实现new运算符

    目录 1 new 运算符简介 2 new 究竟干了什么事 3 模拟实现 new 运算符 4 补充 预备知识: 了解原型和原型链 了解this绑定 1 new 运算符简介 MDN文档:new 运算符创建 ...

  10. Apache Solr应用服务器存在远程代码执行漏洞👻

    Apache Solr应用服务器存在远程代码执行漏洞 1.描述 Apache Solr是一个开源的搜索服务,使用Java语言开发,主要基于HTTP和Apache Lucene实现的. Solr是一个高 ...