- 行列サイズは960とコード中で固定されている
- Pythonのプログラムは、実行可能なスクリプトとなっている
% ./mm.py
あるいは、pythonのバージョン3系のコードなので、そのインタープリタを明示的に呼び出して% python3 mm.py
にて実行できます。- Pythonのプログラムの実行には数分かかるので注意すること
- mm.cにおいては、行列積の計算が3回反復して試行されている。
- Makefile で標準的な環境でコンパイルできるようになっている
- OpenMPのライブラリがない場合は、IMC HPCクラスタを使うと便利。詳細は後述。
- 行列サイズと反復数(試行数)を引数とする
- #ifdefにより、どのような最適化をしたコードを実行するかを決定する
- ソースコードの先頭付近にある#define文のコメントを外すと最適化を適用したものを計測できる
- check_mat()で、計算が最適化をしていない関数で計算したものと一致するかをチェック
- コンピュータでの浮動小数点計算は誤差がある。最適化では計算順序を入れ替えている。
- その誤差がmax_errorで指定するものより小さいかを判定。それ以上であれば、エラーメッセージが出力される。
- この機能を使う場合、dgemm_unopt (A, B, C_unopt, N);を実行しておく必要がある
学内ネットワーク環境からは以下のようにsshで学内のアカウント(無線LANを使うときのIDとPW)で利用できます。学外からは、VPNで繋いでからsshすると利用できます。
% ssh xdev.edu.tut.ac.jp
- 上記のsshでログインすると窓口サーバーに繋がります。
- コンパイラとして、Intel Compiler (icc)も使えます。
- ログイン後、git cloneのコマンドにて課題のサンプルプログラムをコピーします。lsでコピーが成功したか確認します。
% git clone https://github.com/TUT-class-sato/ComptArch-report-2nd.git
% ls ComptArch-report-2nd
- 逐次処理のプログラムで短時間で終わる処理であれば、窓口サーバーで処理しても大丈夫です。
- OpenMPなど並列処理のプログラムの実行を行うためには、以下をコマンドを実行し、計算サーバーに移動して、プログラムを実行すること。
% qsub -I -q wEduq -l select=1:ncpus=4 -v DOCKER_IMAGE=prg-env:latest
- qsubコマンド実行後、コマンドプロンプトが返ってきたら、
make; make run
で実験できます。qsub –I –l select…
が紛らわしいのですが、最初が大文字のiで、セレクトの前が小文字のLです。- qsubとは計算機のリソースを管理して共有して使えるようにしているツールなので、リソースがその時に使えるものがないと待ち時間が発生します。
- そのままの状態で待っていると、リソースが使えるようになったタイミングでコマンドプロンプトが戻ってきます。
- qsub -I のオプションはインタラクティブで使うということで、コマンドプロンプトから直接利用するモードです。
- 一方で、実行するコマンドが決まっている場合は以下の要領でバッチ処理をするとよい。
- qsubで実行するコマンドをスクリプトとして用意し、qsub実行時にスクリプトを読み込み、空きがある段階で実行されて結果をファイルで書き戻す。
- スレッド数の指定は、
export OMP_NUM_THREADS=4; make run
あるいはmake run -e OMP_NUM_THREADS=4
- IMCのxdevから利用する計算サーバーは、教育向け用途では4コアまでの利用に限定されている。
- CPUなどの情報は
% lscpu
とすると、OSが認識しているCPUの情報などが表示されます。OSは% less /etc/redhat-release
にて表示されます。- xdevからqsubで割り当てられた計算サーバーのCPUやOSを表示するには、qsubの後でノードを割り当てた後に上記のコマンドを実行する必要があります。
- AVX_OMPのdefine文や#ifの設定を変更すると、IMCのクラスタにおいてデフォルトのMakefileの設定(gcc)ではコンパイルがエラーとなります。
- コンパイラをIntel Compierのiccに切り替えると、__m512dなどのデータ型を認識できるようになり、コンパイルできます。
- 具体的には、Makefileの冒頭で以下のように変更することにより、iccでコンパイルするようにします。
#CC=gcc
CC=icc
- その他の事項は、適宜、IMC HPCクラスタのwikiをご覧ください。