Intel oneAPI 環境變數設定
因工作需要,需要在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被硬編碼為需要此庫的特定依賴版本,則無法執行此類測試。
注意:如果無法滿足從屬模組載入,則當前載入的模組檔案將被終止,並且不會對您的環境進行任何更改。
額外資源
要獲取更多關於modulefiles的資訊,參見:- http://www.admin-magazine.com/HPC/Articles/Environment-Modules
- https://support.pawsey.org.au/documentation/display/US/Sample+modulefile+for+Environment+Modules
- https://www.chpc.utah.edu/documentation/software/modules-advanced.php
- https://modules.readthedocs.io/en/latest/
- https://lmod.readthedocs.io/en/latest/