MPI トレースデータ
コレクタは、Message Passing Interface (MPI) ライブラリの呼び出しの際のデータを収集できます。
MPI トレースは、オープンソースの VampirTrace 5.5.3 リリースを使用して実装されます。これは次の VampirTrace 環境変数を認識します。
VT_STACKS
|
呼び出しスタックをデータに記録するかどうかを制御します。デフォルトの設定は 1 です。 VT_STACKS を 0 に設定すると、呼び出しスタックが無効になります。
|
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-5 MPI トレースメトリック
|
|
MPI 送信
|
開始された MPI ポイントツーポイント送信数
|
MPI 送信バイト数
|
MPI で送信されるバイト数
|
MPI 受信
|
完了した MPI ポイントツーポイント受信数
|
MPI 受信バイト数
|
MPI で受信されるバイト数
|
MPI 時間
|
MPI 関数へのすべての呼び出しにかかった時間
|
その他の MPI イベント
|
2 点間のメッセージの送受信を行わない MPI 関数の呼び出しの数
|
|
MPI 時間は、MPI 関数で費やされたスレッド合計時間です。MPI 状態の時間も収集される場合、MPI_Init および MPI_Finalize 以外のすべての MPI 関数については、MPI 作業時間と MPI 待機時間の合計が MPI 作業時間にほぼ等しくなるはずです。Linux では、MPI 待ちおよび MPI ワークがユーザーとシステムの CPU 時間に基づいているのに対して、MPI 時間は実際の時間に基づいているため、これらの数値は一致しません。
MPI のバイトおよびメッセージカウントは、現在、ポイントツーポイントメッセージについてのみ収集されます。これらは集合通信関数については記録されません。MPI 受信バイト数は、すべてのメッセージで実際に受信したバイト数をカウントします。MPI 送信バイト数は、すべてのメッセージで実際に送信したバイト数をカウントします。MPI 送信数は送信したメッセージの数をカウントし、MPI 受信数は受信したメッセージの数をカウントします。
MPI トレースデータの収集は、MPI 呼び出しが原因となる可能性のある、MPI プログラム内のパフォーマンスの問題を抱えている場所を特定する上で役立ちます。パフォーマンスの問題となる可能性のある例としては、負荷分散、同期遅延、および通信のボトルネックがあります。