見出し画像

Intel Fortranを使いたいfishユーザな人って世界に何人いるんだろう

はじめに

この記事は「シェルにfishを使用している」かつ「Intel Fortran (Intel oneAPI)を使う」という極めてニッチなことをしている人のTipsです。
(一部、bashユーザでもIntel oneAPIをCLIで使う人は、便利だと思ってくれる部分がありそう)

fish shell

fishはシェルの一種です。bashやzshのなかま

利点:タブ補完がめっちゃくちゃにつよい。zshみたいに設定に凝らなくてもデフォルトでいい感じ。
欠点:POSIX非互換のためbashやzsh用のシェルスクリプトは基本的に動かない。

Intel oneAPI

Intel oneAPIは、Intel製のC, C++, Fortanコンパイラや開発に使われるライブラリなんかをまとめているツールみたいです。利用だけなら無料です。
いろんなものが入ってるみたいですが、僕としては「インテルコンパイラを無料で使える、やったー」くらいの認識

中に、

  • Intel oneAPI Base Toolkit

  • Intel oneAPI HPC Toolkit

  • Intel oneAPI AI Analytics Toolkit

  • etc…

などの種類があり、fortranコンパイラ(ifort)を使うには、Baset Toolkit + HPC Toolkitをインストールする。

Intel oneAPIの設定ロードが面倒

本題です。
Intel oneAPIをCLIでアクティベートするときに

$ source /opt/intel/oneapi/setvars.sh

として設定を読み込む必要があるんですね。で、これが実行される時に、

$ source /opt/intel/oneapi/setvars.sh
:: initializing oneAPI environment ...
   bash: BASH_VERSION = 4.4.20(1)-release
   args: Using "$@" for setvars.sh arguments: 
:: advisor -- latest
:: ccl -- latest
:: clck -- latest
:: compiler -- latest
:: dal -- latest
:: debugger -- latest
:: dev-utilities -- latest
:: dnnl -- latest
:: dpcpp-ct -- latest
:: dpl -- latest
:: inspector -- latest
:: intelpython -- latest
:: ipp -- latest
:: ippcp -- latest
:: ipp -- latest
:: itac -- latest
:: mkl -- latest
:: mpi -- latest
:: tbb -- latest
:: vpl -- latest
:: vtune -- latest
:: oneAPI environment initialized ::

と、長々とした出力が吐き出されます。
しかも普通は "source ~" 部分は.bashrcとかに書くと思うのでシェルを立ち上げるたびにこれがでてきます。

たまにしか使わないならまだしも、僕は計算機でもtmuxでシェルをいくつも立ち上げたりするので、起動時に自動でこれが出てくるのは流石によくないです。

Intel oneAPIを使うときだけロード

そこで考えだされたのがこちらの解決策。

前提:fishをログインシェルにしてしまうとPOSIX非互換のためか予期せぬエラーが起こったりするので、僕の環境ではログインシェルはbashのまま「シェル起動→bash→.bashrcでexec fish→fish」のようになってます。

.bashrc

 if [ -v INTEL_FLAG ]; then
   source /opt/intel/oneapi/setvars.sh
 fi

#以下でexec fishの処理

.config/fish/config.fish

alias ifish="set -x INTEL_FLAG true ; bash"

このようにしてあげると、普通にシェルを立ち上げただけではIntel oneAPIの設定はロードされず上の冗長な出力も出てきません。
そして、いざIntelコンパイラを使う時に、「ifish」とコマンド(エイリアス)を打てば、INTEL_FLAGにtrueが入った状態でbashが起動され、Intel oneAPIの設定がロードされた後にfishが立ち上がります。

$ ifort --version
bash: ifort: command not found...

$ ifish
 
:: initializing oneAPI environment ...
   bash: BASH_VERSION = 4.4.20(1)-release
   args: Using "$@" for setvars.sh arguments: 
:: advisor -- latest
:: ccl -- latest
:: clck -- latest
:: compiler -- latest
:: dal -- latest
:: debugger -- latest
:: dev-utilities -- latest
:: dnnl -- latest
:: dpcpp-ct -- latest
:: dpl -- latest
:: inspector -- latest
:: intelpython -- latest
:: ipp -- latest
:: ippcp -- latest
:: ipp -- latest
:: itac -- latest
:: mkl -- latest
:: mpi -- latest
:: tbb -- latest
:: vpl -- latest
:: vtune -- latest
:: oneAPI environment initialized ::
 
Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish

$ ifort --version
ifort (IFORT) 2021.5.0 20211109
Copyright (C) 1985-2021 Intel Corporation.  All rights reserved.

これで必要な時にだけIntel oneAPIがロードされるので、ストレスのないシェル生活が送れます。

注意点

「source /opt/intel/oneapi/setvars.sh」の処理は、"setvars.sh"の中身がbash用シェルスクリプトなので.bashrcの方で行う必要があります。config.fish側でsourceしてもエラーになります。

この記事が気に入ったらサポートをしてみませんか?