Oracle Solaris Studio 12.2: パフォーマンスアナライザ

MPI トレースデータ

コレクタは、Message Passing Interface (MPI) ライブラリの呼び出しの際のデータを収集できます。

MPI トレースは、オープンソースの VampirTrace 5.5.3 リリースを使用して実装されます。これは次の VampirTrace 環境変数を認識します。

VT_STACKS

呼び出しスタックを記録するかどうかを制御します。デフォルトの設定は 1 です。VT_STACKS0 に設定すると、呼び出しスタックが無効になります。

VT_BUFFER_SIZE

MPI API トレースコレクタの内部バッファーのサイズを制御します。デフォルト値は 64M (64M バイト) です。

VT_MAX_FLUSHES

MPI トレースの終了前に行うバッファーのフラッシュ回数を制御します。デフォルト値は 0 です。この場合、バッファーがいっぱいになるとディスクにフラッシュされます。 VT_MAX_FLUSHES を正数に設定すると、バッファーがフラッシュされる回数が制限されます。

VT_VERBOSE

さまざまなエラーメッセージや状態メッセージをオンにします。デフォルト値は 1 で、重大なエラーメッセージや状態メッセージをオンにします。問題が生じる場合は、この変数を 2 に設定してください。

これらの変数については、Technische Universität Dresden Web サイトにある『Vampirtrace User Manual』を参照してください。

バッファーの制限に達したあとに発生する MPI イベントはトレースファイルに書き込まれないため、トレースが不完全になります。

この制限を撤廃してアプリケーションのトレースを完全なものにするには、VT_MAX_FLUSHES 環境変数を 0 に設定します。この設定を行うと、MPI API トレースコレクタは、バッファーがいっぱいになるたびにバッファーをディスクにフラッシュします。

バッファーのサイズを変更するには、VT_BUFFER_SIZE 環境変数を設定します。この変数の最適値は、トレース対象のアプリケーションによって異なります。小さな値を設定すると、アプリケーションに利用できるメモリーは増えますが、MPI API トレースコレクタによるバッファーのフラッシュが頻繁に行われるようになります。このようなバッファーのフラッシュによって、アプリケーションの動作が大幅に変化する可能性があります。その一方、大きな値 (2G など) を設定すると、MPI API トレースコントローラによるバッファーのフラッシュは最小限に抑えられますが、アプリケーションに使用できるメモリーは少なくなります。バッファーやアプリケーションデータを保持するために十分なメモリーを利用できない場合、アプリケーションの一部がディスクにスワップされて、アプリケーションの動作が大幅に変化する可能性があります。

次のリストに、データが収集される関数を示します。

MPI_Abort

MPI_Accumulate

MPI_Address

MPI_Allgather

MPI_Allgatherv

MPI_Allreduce

MPI_Alltoall

MPI_Alltoallv

MPI_Alltoallw

MPI_Attr_delete

MPI_Attr_get

MPI_Attr_put

MPI_Barrier

MPI_Bcast

MPI_Bsend

MPI_Bsend-init

MPI_Buffer_attach

MPI_Buffer_detach

MPI_Cancel

MPI_Cart_coords

MPI_Cart_create

MPI_Cart_get

MPI_Cart_map

MPI_Cart_rank

MPI_Cart_shift

MPI_Cart_sub

MPI_Cartdim_get

MPI_Comm_compare

MPI_Comm_create

MPI_Comm_dup

MPI_Comm_free

MPI_Comm_group

MPI_Comm_rank

MPI_Comm_remote_group

MPI_Comm_remote_size

MPI_Comm_size

MPI_Comm_split

MPI_Comm_test_inter

MPI_Dims_create

MPI_Errhandler_create

MPI_Errhandler_free

MPI_Errhandler_get

MPI_Errhandler_set

MPI_Error_class

MPI_Error_string

MPI_File_close

MPI_File_delete

MPI_File_get_amode

MPI_File_get_atomicity

MPI_File_get_byte_offset

MPI_File_get_group

MPI_File_get_info

MPI_File_get_position

MPI_File_get_position_shared

MPI_File_get_size

MPI_File_get_type_extent

MPI_File_get_view

MPI_File_iread

MPI_File_iread_at

MPI_File_iread_shared

MPI_File_iwrite

MPI_File_iwrite_at

MPI_File_iwrite_shared

MPI_File_open

MPI_File_preallocate

MPI_File_read

MPI_File_read_all

MPI_File_read_all_begin

MPI_File_read_all_end

MPI_File_read_at

MPI_File_read_at_all

MPI_File_read_at_all_begin

MPI_File_read_at_all_end

MPI_File_read_ordered

MPI_File_read_ordered_begin

MPI_File_read_ordered_end

MPI_File_read_shared

MPI_File_seek

MPI_File_seek_shared

MPI_File_set_atomicity

MPI_File_set_info

MPI_File_set_size

MPI_File_set_view

MPI_File_sync

MPI_File_write

MPI_File_write_all

MPI_File_write_all_begin

MPI_File_write_all_end

MPI_File_write_at

MPI_File_write_at_all

MPI_File_write_at_all_begin

MPI_File_write_at_all_end

MPI_File_write_ordered

MPI_File_write_ordered_begin

MPI_File_write_ordered_end

MPI_File_write_shared

MPI_Finalize

MPI_Gather

MPI_Gatherv

MPI_Get

MPI_Get_count

MPI_Get_elements

MPI_Get_processor_name

MPI_Get_version

MPI_Graph_create

MPI_Graph_get

MPI_Graph_map

MPI_Graph_neighbors

MPI_Graph_neighbors_count

MPI_Graphdims_get

MPI_Group_compare

MPI_Group_difference

MPI_Group_excl

MPI_Group_free

MPI_Group_incl

MPI_Group_intersection

MPI_Group_rank

MPI_Group_size

MPI_Group_translate_ranks

MPI_Group_union

MPI_Ibsend

MPI_Init

MPI_Init_thread

MPI_Intercomm_create

MPI_Intercomm_merge

MPI_Irecv

MPI_Irsend

MPI_Isend

MPI_Issend

MPI_Keyval_create

MPI_Keyval_free

MPI_Op_create

MPI_Op_free

MPI_Pack

MPI_Pack_size

MPI_Probe

MPI_Put

MPI_Recv

MPI_Recv_init

MPI_Reduce

MPI_Reduce_scatter

MPI_Request_free

MPI_Rsend

MPI_rsend_init

MPI_Scan

MPI_Scatter

MPI_Scatterv

MPI_Send

MPI_Send_init

MPI_Sendrecv

MPI_Sendrecv_replace

MPI_Ssend

MPI_Ssend_init

MPI_Start

MPI_Startall

MPI_Test

MPI_Test_cancelled

MPI_Testall

MPI_Testany

MPI_Testsome

MPI_Topo_test

MPI_Type_commit

MPI_Type_contiguous

MPI_Type_extent

MPI_Type_free

MPI_Type_hindexed

MPI_Type_hvector

MPI_Type_indexed

MPI_Type_lb

MPI_Type_size

MPI_Type_struct

MPI_Type_ub

MPI_Type_vector

MPI_Unpack

MPI_Wait

MPI_Waitall

MPI_Waitany

MPI_Waitsome

MPI_Win_complete

MPI_Win_create

MPI_Win_fence

MPI_Win_free

MPI_Win_lock

MPI_Win_post

MPI_Win_start

MPI_Win_test

MPI_Win_unlock

   

MPI トレースデータは、次のメトリックスに変換されます。

表 2–4 MPI トレースメトリックス

メトリック 

定義 

MPI 送信数 

開始された MPI ポイントツーポイント送信数 

MPI 送信バイト数 

MPI で送信されるバイト数 

MPI 受信数 

完了した MPI ポイントツーポイント受信数 

MPI 受信バイト数 

MPI で受信されるバイト数 

MPI 時間 

MPI 関数へのすべての呼び出しにかかった時間 

そのほかの MPI イベント 

2 点間のメッセージの送受信を行わない MPI 関数の呼び出しの数 

MPI 時間は MPI 関数でかかった LWP 時間の合計です。MPI 状態の時間も収集される場合、MPI_Init および MPI_Finalize 以外のすべての MPI 関数については、MPI 作業時間と MPI 待機時間の合計が MPI 作業時間にほぼ等しくなるはずです。Linux では、MPI 待機および MPI 作業はユーザー CPU 時間とシステム CPU 時間の合計に基づきますが、MPI 時間は実際の時間に基づくため、数値は一致しません。

MPI のバイトおよびメッセージのカウントは、現在のところ 2 点間のメッセージについてのみ収集され、集合的な通信機能に関しては記録されません。MPI 受信バイト数は、すべてのメッセージで実際に受信したバイト数をカウントします。MPI 送信バイト数は、すべてのメッセージで実際に送信したバイト数をカウントします。MPI 送信数は送信したメッセージの数をカウントし、MPI 受信数は受信したメッセージの数をカウントします。

MPI トレースデータの収集は、MPI 呼び出しが原因となる可能性のある、MPI プログラム内のパフォーマンスの問題を抱えている場所を特定する上で役立ちます。パフォーマンスの問題となる可能性のある例としては、負荷分散、同期遅延、および通信のボトルネックがあります。