因工作需要,需要在linux系統配置多個不同環境的庫,需要使用environmental-module工具管理環境變量,為保持配置方法的一致性,也使用modulefile文件加載Intel oneAPI軟件。
以下參考自 https://software.intel.com/content/www/us/en/develop/documentation/oneapi-programming-guide/top/oneapi-development-environment-setup/use-modulefiles-with-linux.html
使用Linux的modulefile配置oneAPI開放環境
大多數組件工具文件夾包含一個或多個modulefile腳本,它們配置該組件環境變量。modulefile可以替代setvars.sh腳本去設置環境變量。
由於moudlefile不支持參數,對於支持多個配置(如32位和64位)的oneAPI工具和庫,有多個modulefile
注意:Intel oneAPI工具提供的modulefile與Tcl Environment Modules (Tmod)和Lua Environment Modules (Lmod)兼容。以下是支持的最低版本
- Tmod 4.1
- Tcl version 8.4
- Lmod version 8.2.10
輸入以下命令,查看測試系統安裝了哪個版本的文件:
module --version
每一個modulefile都可以自動驗證系統的Tcl版本是否支持
oneAPI modulefile腳本存放在每個組件文件夾的moudulefiles文件夾下。例如,對於默認安裝,ipp的modulefile腳本存放在 /opt/intel/ipp/latest/modulefiles/ 目錄。
由於oneAPI組件文件夾在磁盤中的組織方式,直接在安裝oneAPI模塊文件的位置使用它們可能會很困難。oneAPI安裝文件夾中提供了一個特殊的modulefiles-setup.sh腳本,以便於使用oneAPI modulefile。在默認安裝中,該安裝腳本位於此處:/opt/intel/oneapi/modulefiles-setup.sh
modulefile-setup.sh腳本查找oneAPI安裝中的所有modulefile腳本,並將它們組織到單個文件夾目錄中。這些文件夾是為包含一個或多個ModuleFile的每個已安裝oneAPI組件命名的。
每個名為文件夾的組件都包含指向該oneAPI組件提供的所有modulefile的符號鏈接。這些符號鏈接被組織為版本化的modulefile文件。每個組件文件夾都包含(至少)一個“最新”版本的modulefile,默認情況下,在加載組件modulefile而不指定版本標簽時將選中該文件。
oneAPI modulefiles頂級目錄的默認名稱為modulefiles,位於oneAPI安裝文件夾中。例如:/opt/intel/oneapi/modulefile
創建modulefiles目錄
運行modulefiles-setup.sh腳本
etvars.sh腳本去設置環境變量。
由於moudlefile不支持參數,對於支持多個配置(如32位和64位)的oneAPI工具和庫,有多個modulefile:
注意:默認情況下,modulefiles-setup.sh腳本在oneAPI工具安裝的目錄下創建了一個名為modulefiles的文件夾。如果你的oneAPI安裝文件夾不具有寫權限,使用--output-dir=<path-to-folder>選項去在一個具有寫權限的位置創建modulefiles文件夾。輸入modulefiles-setup.sh --help查看更多信息。
在modulefiles-setup.sh腳本運行后,在modulefiles文件夾下創建了如下組織形式的文件。
[oneapi_root]
- [modulefiles]
- - [compiler]
- - - [1.0] -> [oneapi_root/compiler/1.0/modulefiles/compiler] # symlink named 1.0 points to compiler modulefile
- - [compiler32]
- - - [1.0] -> [oneapi_root/compiler/1.0/modulefiles/compiler32] # symlink named 1.0 points to compiler32 modulefile
- - [ipp]
- - - [1.1] -> [oneapi_root/ipp/1.1/modulefiles/ipp]
- - - [1.2] -> [oneapi_root/ipp/1.2/modulefiles/ipp]
- - [ipp32]
- - - [1.1] -> [oneapi_root/ipp/1.1/modulefiles/ipp32]
- - - [1.2] -> [oneapi_root/ipp/1.2/modulefiles/ipp32]
etc…
現在,可以將MODULEFILESPATH進行更新,從而指向新的modulefiles目錄。
在你的系統中安裝module工具
以下指導可以幫助你迅速熟悉Ubuntu*環境下的Environment Modules 工具。想要關於module工具安裝的完整細節,參見http://modules.sourceforge.net/.
$ sudo apt update $ sudo apt install tcl $ sudo apt install environment-modules
確保本地的tclsh的版本足夠新(截止文章寫的時候,需要8.4以上的版本)
$ tclsh % puts $tcl_version 8.6 % exit
測試module安裝,module別名
$ source /usr/share/modules/init/sh $ module
注意:Bourne兼容Shell的初始化應使用上面顯示的源命令。/usr/share/modules/init/文件夾中提供了其他特定shell的init 腳本。有關更多詳細信息,請參閱man模塊中的該文件夾和初始化部分。
包括sourcing module別名初始化腳本 ( .../modules/init/sh) 在以下設置腳本中,用以確保module命令通常可用。之后,系統可以准備好使用module命令了。
modulefiles-setup.sh腳本入門
- 在Linux開發系統中安裝了tclsh
- 在系統中安裝了Environment Modules工具 (i.e., module)
- 已經sourced了.../modules/init/sh (或等價的) module 初始化命令
-
安裝了oneAPI開發所需的oneAPI工具包
$ cd <oneapi-root-folder> # cd to the oneapi_root install directory $ ./modulefiles-setup.sh # run the modulefiles setup script $ module use modulefiles # use the modulefiles folder created above $ module avail # will show tbb/X.Y, etc. $ module load tbb # loads tbb/X.Y module $ module list # should list the tbb/X.Y module you just loaded $ module unload tbb # removes tbb/X.Y changes from the environment $ module list # should no longer list the tbb/X.Y env var module
在unload步驟之前,使用env命令檢查環境並查找您加載的modulefile所做的更改。例如,如果加載了tbb modulefile,該命令將顯示該modulefile所做的一些環境更改(檢查modulefile以查看它將進行的所有更改):
$ env | grep -i "intel"
注意:modulefile是一個腳本,但它不需要設置“x”(可執行)權限,因為它由最終用戶安裝和維護的“模塊”解釋器加載和解釋。oneAPI產品的安裝不包括modulefile解釋器。它必須單獨安裝。同樣,ModuleFile不要求設置“w”權限,但必須可讀(理想情況下,為所有用戶設置“r”權限)。
Versioning
oneAPI工具包安裝程序將version文件夾應用於各個oneAPI工具和庫,其形式為每個工具或庫的頂級目錄中的版本化的子目錄。這些版本化組件文件夾用於創建版本化模塊文件。這就是modulefiles-setup.sh腳本的基本功能;它將在頂級$(ONEAPI_ROOT)/modulefiles文件夾中創建的符號鏈接組織為<modulefile name>/version,因此在使用module命令時,可以按版本引用相應的modulefile。
$ module avail ---------------- modulefiles ----------------- ipp/1.1 ipp/1.2 compiler/1.0 compiler32/1.0
多個modulefiles
一個工具或庫可以在其modulefiles文件夾中提供多個modulefiles。每個模塊都成為可加載的模塊。將根據提取它們的零部件文件夾為它們分配一個版本。
了解使用oneAPI時如何編寫模塊文件
modulefiles-setup.sh腳本使用符號鏈接將所有可用的工具和庫modulefiles收集到oneAPI的一個頂級modulefiles文件夾中。這意味着不會移動或觸摸oneAPI的ModuleFile。作為這種方法的結果,${ModulesCurrentModulefile}變量指向每個modulefile的符號鏈接,而不是指向各個安裝文件夾中的實際modulefile。因此,由於符號鏈接,這些模塊文件無法引用模塊文件的組件文件夾中的其他文件夾或文件。
因此,oneAPI的每個modulefile都使用如下語句以獲取對相應安裝目錄中原始modulefile的引用:
[ file readlink ${ModulesCurrentModulefile} ]
為了更好地理解,請查看安裝附帶的模塊文件。大多數注釋包括解釋如何解析對真實文件的符號鏈接引用,以及解析版本號(和版本目錄)。它們還包括檢查以確保安裝的TCL是適當的版本級別,並包括檢查以防止您無意中加載同一modulefile的兩個版本。
通過ModuleFile使用module load命令
幾個modulefile使用module load命令來確保也加載了所有必需的依賴模塊。沒有嘗試指定這些依賴ModuleFile的版本。這意味着,在加載需要依賴模塊的模塊之前,可以手動預加載特定的依賴模塊。如果未預加載從屬模塊,則會加載最新的可用版本。
這是設計的,因為它提供了控制環境的靈活性。例如,您可能已經安裝了一個庫的更新版本,您希望根據以前版本的編譯器進行測試。也許更新后的庫有一個bug修復,而您對更改構建中任何其他庫的版本不感興趣。如果依賴ModuleFile被硬編碼為需要此庫的特定依賴版本,則無法執行此類測試。
注意:如果無法滿足從屬模塊加載,則當前加載的模塊文件將被終止,並且不會對您的環境進行任何更改。