株式会社アスムス
先頭へ
先頭へ

技術情報:計算機使いこなしのコツ


プログラム開発環境構築

材料シミュレーションに役立つ優れたオープンソースソフトウェアが多数公開されています。これらソフトウェアの多くはソースコードで配布されており、利用するには事前のコンパイルが必要です。特にMPI並列を利用するソフトウェアは、その実行形式ファイルがMPI実行環境に依存するため、実行形式ファイルで配布し難いことが、この背景にあります。そこでコンパイル(プログラム開発)環境を整えようとするのですが、科学技術計算では現在でもFortranが用いられることが多く、そのコンパイラとMPI開発環境を用意することは、不慣れな方には難しいかもしれません。

ここでは、なるべく簡単に、無料で利用できるソフトウェアを用いて、FortranコンパイラとMPI開発環境を含む、プログラム開発環境を整える方法をご紹介します。この目的を達成するためには、WindowsではなくLinuxを利用する方が容易です。各ソフトウェアは、執筆時点の最新版です。

過去の情報はこちら:2017年10月, 2016年3月

Windows Subsystem for Linux (WSL)の利用

WSLは、Windows上で動作するLinux環境です。

Windows PCにWSL (Ubuntu)を導入して、PHASE/0を導入するまでの手順はこちらを参照してください。

実機PCへのLinuxインストール

使わなくなったPCがあれば、Linuxをインストールして再利用しましょう。Ubuntuをインストールしても良いのですが、大規模計算機などサーバー用途で使われることが多いRed Hat Enterprise Linux (RHEL)の互換ディストリビューションを使ってみませんか。

かつては、RHEL互換ディストリビューションとしてCentOSが重宝されましたが、CentOSプロジェクト運営方針変更に伴い、継続されるCentOS StreamはRHEL互換ディストリビューションとは言えなくなってしまいました。

2022年以降のRHEL互換(CentOS後継)ディストリビューションとして、以下の二つを紹介します。

例えば以下のコマンドで、開発環境が整います。

$ sudo dnf install -y gcc-gfortran openmpi-devel fftw-static perl gnuplot make patch

高性能開発環境の導入

Linuxを導入すると、簡単な操作で各種パッケージ(オープンソースソフトウェア)をインストールして、開発環境(GNUコンパイラ;Fortran, C, C++)が整います。けれども、これらで作成した実行形式ファイルは、実行性能が高くない場合があります。より良い実行性能を得るための、高性能プログラム開発環境を二つご紹介します。いずれもMPIに対応したFortran, C, C++の各コンパイラを無償で利用できます。

Intel oneAPI

一つ目はIntel oneAPI Toolkits、通称Intelコンパイラです。Base ToolkitHPC Toolkitをそれぞれインストールします。インストール先の既定値は/opt/intel/oneapi/です。次のコマンドで環境設定して利用します。

source /opt/intel/oneapi/setvars.sh

コンパイルコマンドは下表の通りです。

FortranCC++
非MPIiforticcicpc
MPImpiifortmpiiccmpiicpc

NVIDIA HPC SDK

二つ目はNVIDIA HPC SDKです。旧PGIコンパイラとCUDAが統合されました。

Downloadからライセンスに同意した後に、RedHat系ディストリビューションでは「Linux x86_64 CentOS/RHEL RPM」、Ubuntuでは「Linux x86_64 DEB」をそれぞれクリックして表示されるコマンドを実行するだけでインストールできます。

インストール先は/opt/nvidia/hpc_sdk/Linux_x86_64/です。以下のように環境変数を設定します(21.9は、バージョンに応じて変更してください)。

HPC_SDK=/opt/nvidia/hpc_sdk/Linux_x86_64/21.9/
export PATH=$HPC_SDK/comm_libs/mpi/bin:$HPC_SDK/compilers/bin:$PATH
export LD_LIBRARY_PATH=$HPC_SDK/comm_libs/mpi/lib:$HPC_SDK/compilers/lib:$LD_LIBRARY_PATH

コンパイルコマンドを下表に示します。

FortranCC++
非MPInvfortrannvcnvc++
MPImpifortmpiccmpic++

メッセージダイジェスト

インターネット経由でファイルを入手する際に、正しくダウンロードできていないことや、Webサイトの改ざんにより悪意のある(ウィルスを含む)ファイルに差し替えられている可能性が心配です。そこで、目的のファイルが正しくダウンロードできていることを確認する方法の一つとして、メッセージダイジェストが利用されています。

名前の通り「メッセージ(ファイル)」から作成された「ダイジェスト(要約)」であり、ファイルがわずかに変更されるだけで全く異なるダイジェストになるように、要約方法(ハッシュ関数)が工夫されています。メッセージダイジェストが同じであることは完全に同じファイルであることを保証しませんが、強力な確認手段として普及しています。

要約に用いるハッシュ関数の代表がMD5(他にMD4, MD2など)やSHA512(他にSHA256, SHA1など)です。LinuxではMD5とSHA256によるメッセージダイジェストをそれぞれ以下のコマンドで計算します。

$ md5sum ファイル名
$ sha256sum ファイル名
同じことをWindowsでは、コマンドプロンプトからcertutilコマンドで計算します。
> certutil -hashfile ファイル名 MD5
> certutil -hashfile ファイル名 SHA256
例題として半角スペース一文字だけ(1 byteのみ)のファイルのメッセージダイジェストを計算すると、以下のようになりました。

利用中のシェルを調べる

Linuxでは「シェル(shell)」と呼ばれるプログラムを通してコマンドを与え、様々な処理を行います。代表的なシェルとして、bash, tcsh, zshなどがあります。利用中のシェルは、以下のコマンドで知ることができます。

$ echo $0

この時、シェル名の前に「-」が表示されれば、それがログインシェルです。例えば-bashと表示されれば、bashがログインシェルです。


ドットファイルの読み込み

Linuxではログイン時に、ホームディレクトリの名前が「.」で始まるファイル(ドットファイルと呼ばれます)を読み込んで各種設定を行います。いつも使う項目が自動的に設定されると便利なのはもちろんのこと、並列計算(MPI)ではプログラムが自動的の他の計算機に接続してプログラムを起動します。自動的に接続したときにもプログラム起動のための適切な設定がなされている必要がありますので、ドットファイルでの設定が必須です。ドットファイルの具体的ファイル名は、ログインシェルにより異なります。

(詳細を省略しました。さらに詳しく知りたい方はmanを参照するなど調べてください。)


公開鍵認証について

計算機にログインする際には、古くからユーザー名とパスワードを利用した本人確認(パスワード認証)が使われてきましたが、現在ではその安全性が十分でないと考えられることが多く、特にインターネットを介した接続には、安全性の高い公開鍵認証を利用することが一般的です。

公開鍵認証では公開鍵と秘密鍵のペアを自分で作成します。秘密鍵は絶対に他人に教えてはいけません。ログイン元となる(手元にある)計算機に安全に保管してください。ログイン先の計算機管理者にも教えません。この点が「ログイン先の管理者から通知されるユーザー名とパスワードを使ってログインする」というパスワード認証の最初の手続きと根本的に異なります。一方、公開鍵はその名の通り外部に晒しても問題にはなりません。ログイン先の計算機に配置する必要がありますので、管理者にお願いするなどしましょう。電子メールで送付しても安全性は損なわれません。

公開鍵認証の安全性は電子署名に支えられており、RSA。ECDSA, Ed25519等の電子署名アルゴリズムが利用されます。RSAやECDSAでは鍵の長さ(ビット数)を選択できます。RSAでは2048(PuTTYgenの既定値), 3072(ssh-keygenの既定値;OpenSSH 7.9以降), 4096、ECDSAでは256, 384, 521から選びます。

以下では、PuTTY(Windows用)とOpenSSH (主にLinux用)をそれぞれ使って、公開鍵/秘密鍵を作成します。OpenSSHで生成した秘密鍵をPuTTYで利用する場合、両者の鍵の「フォーマット」が異なるため変換が必要です。その手順も併せて説明します。

PuTTYで鍵作成

PuTTY Key Generator Generating Generated

OpenSSHで鍵生成

以下のようにssh-keygenコマンドを実行します。電子署名アルゴリズムの既定値はRSAです。EDCSA, Ed25519を用いる場合はオプション-t edcsa, -t ed25519をそれぞれ指定します。オプション-bで鍵の長さを指定します。【Enter】ではEnterキーを、【パスフレーズ】にはパスフレーズを入力します。

$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/asms/.ssh/id_ecdsa): 【Enter】
Enter passphrase (empty for no passphrase): 【パスフレーズ】
Enter same passphrase again: 【パスフレーズ】
Your identification has been saved in /home/asms/.ssh/id_ecdsa
Your public key has been saved in /home/asms/.ssh/id_ecdsa.pub
The key fingerprint is:
(以下略)
$

ホームディレクトリ下の.sshディレクトリに秘密鍵(上記例ではid_ecdsa)と公開鍵(同id_ecdsa.pub)が生成されます。さらに、秘密鍵をPuTTYで利用する場合には、以下の手順で変換します。

sshポートフォワード

関連する話題としてsshポートフォワード機能を紹介します。遠隔地の計算サーバーを利用することを想定して、下図のネットワーク構成を考えます。ログインサーバーへの接続はインターネットを介するので公開鍵認証を使い、ログインサーバーからリモート計算機へは、安全な組織内ネットワークのみを利用するので、パスワード認証で接続します。

リモート計算サーバーを利用する場合 ローカル
計算機
ログイン
サーバー
リモート
計算機
パスワード認証 パスワード認証× 公開鍵認証+ポートフォワード

リモート計算機と通信するアプリケーションソフトウェアの中には、安全なネットワーク内での利用を前提としているために公開鍵認証をサポートしておらず、パスワード認証のみ利用可能なものがあります。その場合でも、sshポートフォワードを利用して公開鍵認証で安全な通信経路を確保すると、ローカル計算機で動作するアプリケーションソフトウェアがその経路を利用して、リモート計算機に接続できることがあります。

ポートフォワード設定

ポートフォワードは、ローカル計算機からログインサーバーへの接続にオプションを追加して設定します。OpenSSHでは例えば以下のコマンドを実行します。

$ ssh loginserver -L 10022:remotehost:22 -N -f

PuTTYでは右図のように設定します。いずれの場合も、ローカル計算機の10022番ポートが、リモート計算機の22番ポート(sshの既定値)につながります。すなわち、アプリケーションプログラムがローカル計算機の10022番ポートにssh接続すると、(ログインサーバーを自動的に経由して)リモート計算機にssh接続することになり、あたかもリモート計算機にパスワード認証でログインしているかのように振る舞います。

なお、セキュリティポリシーは所属組織により区々であり、技術的に可能なこと全ての実行が許可されているとは限りません。どのような利用方法が許可されているのかご確認のうえ、セキュリティに配慮してご利用ください。



PHASE/0製品版のご利用にあたりご不明な点や、解析、カスタマイズのご依頼・ご相談などにつきましてはお問い合せください。

ナノ材料シミュレーション お問い合わせ ナノ材料シミュレーション 解析のご依頼へ