Forum - VEを使う場合・使わない場合のコンパイル方法について

Jump to navigation Jump to search
Overview > Programming Contest > 2022 > VEを使う場合・使わない場合のコンパイル方法について
[#110]

VEを効果的に利用しているかを確認するため、VEを使う場合と使わない場合の性能比較を行いたいのですが、 C++で以下のようなコンパイル方法を見つけたものの、それぞれの意味がよく分かっておりません。

(1) nc++ test.cpp

(2) nc++ -mno-vector test.cpp

(3) mpic++ test.cpp

(4) mpic++ -vh test.cpp


これらがどのような意味を持っているか、VEの有無による性能の違いを確認するには どのようなコンパイル方法で比較すればよいかなど、ご教授願えないでしょうか?

よろしくお願いいたします。

Posted by Kobayah.alpha on 14 December 2022 at 06:24.
Edited by Kobayah.alpha on 14 December 2022 at 06:25.

「VEの有無」が次の二つのどちらなのか判断できかねましたので二つの内容で回答します。

(a) VEに含まれるベクトル演算機構を使った場合、使わない場合での性能比較

(b) VEに含まれるベクトル演算機構を使った場合とVEをまったく使用せずSX-Aurora に搭載されたIntel CPU との性能比較


(a) VEに含まれるベクトル演算機構を使った場合、使わない場合での性能比較

-mno-vector を指定した場合、コンパイラの自動ベクトル化機能が無効になりユーザコードでベクトル命令を使用しないようにできます。

-mno-vector の指定あり/なしの性能を性能測定機能を使って比較してください。

以下は性能測定機能の一つのPROGINF機能を使った例です。

$ export VE_PROGINF=DETAIL
$ nc++ test.cpp -o vec.out (ベクトル演算機構使用)
$ ./vec.out
******** Program Information ********
Real Time (sec) : 11.329254
User Time (sec) : 11.323691
...
$ nc++ test.cpp -mno-vector -o novec.out (ベクトル演算機構使用せず)
$ ./novec.out
******** Program Information ********
Real Time (sec) : ...
...

上記の Real Time の値を比較してください。

PROGINF機能については以下の資料をご確認ください。

[Vector Engine向け C/C++コンパイラの使い方]

https://sxauroratsubasa.sakura.ne.jp/wiki/images/b/ba/ncc_how_to_use_rev2-jp.pdf


詳細は「PROGINF/FTRACE ユーザーズガイド」をご確認ください。

PROGINF/FTRACE ユーザーズガイド (G2AT03)

https://sxauroratsubasa.sakura.ne.jp/documents/sdk/pdfs/g2at03-PROGINF_FTRACE_User_Guide_ja.pdf


(b) VEに含まれるベクトル演算機構を使った場合とVEをまったく使用せず SX-Aurora に搭載されたIntel CPU との性能比較

g++ などのIntel CPU向けのコンパイラでコンパイルしたものと nc++ で コンパイルしたものの性能を比較してください。性能値の取得には time コマンドを使用してください。

例:
$ nc++ test.cpp
$ /opt/nec/ve/bin/time ./a.out
$ g++ test.cpp
$ time ./a.out


ここからは MPI(mpic++)ついての回答です。


MPIプログラムのコンパイル・リンク時(mpic++実行時)に、-vh オプションを 指定した場合、生成される実行形式ファイルは、VEを利用せず、Intel CPU で 動作するものとなります。一方、-vh 指定無しの場合は、VE上で動作する 実行形式ファイルを生成する違いがあります。


また、MPIプログラムを実行する際は、mpirunあるいはmpiexecコマンドを利用いただきますが、 この場合も同様に、-vh 付きでコンパイル・リンクしたプログラムの場合は-vhオプション の指定が必要となります。


なお、MPIプログラムのコンパイル・リンク及びプログラム実行の際には事前にMPIセットアップスクリプト を読み込む必要があります。以下、その手順になります。


まずは、ご利用のシステムにインストールされているNEC MPIのバージョンの確認をお願いします。


以下、NEC MPI Version 2.21.0 が /opt/nec/ve/mpi/2.21.0 にインストールされていると 仮定した手順となります。(2.21.0以外のバージョンであっても、/opt/nec/ve/mpi 配下に インストールされますので、バージョンの部分を読み替えてください)


mpic++を実行する前に、ご利用中のログインシェル(sh系あるいはcsh系)に応じて、 以下の操作のいずれかを行ってください。この操作により、MPIプログラムのコンパイル から実行までの環境設定が行われます。

source /opt/nec/ve/mpi/2.21.0/bin/necmpivars.sh
または
source /opt/nec/ve/mpi/2.21.0/bin/necmpivars.csh

詳細については下記資料の3.1節、3.2節をご参照ください。

NEC MPI ユーザガイド (G2AM01)

https://sxauroratsubasa.sakura.ne.jp/documents/mpi/pdfs/g2am01-NEC_MPI_User_Guide_ja.pdf

以上です。

Posted by NEC SDK team (forum administrator) on 16 December 2022 at 09:50.
Edited by NEC SDK team (forum administrator) on 16 December 2022 at 09:56.

ご回答ありがとうございます。

どうやら「ベクトル演算しない = VEを使わない = Intel CPUで実行している」ものと勘違いをしていたようでした。

nc++は、VE上で動く実行ファイルを作るためのコンパイラで、ベクトル演算をオプションで無効にしても、VE上で動作しているということが分かりました。

Intel CPUと実行時間を比較したい場合は g++ を利用すればよいことが分かりました。

Posted by Kobayah.alpha on 16 December 2022 at 10:30.