MPI 跟踪数据
收集器可以收集有关对消息传递接口 (Message Passing Interface, MPI) 库的调用的数据。
使用开源 VampirTrace 5.5.3 发行版来实现 MPI 跟踪。该跟踪可识别以下 VampirTrace 环境变量:
VT_STACKS
|
控制是否在数据中记录调用堆栈。缺省设置为 1。将 VT_STACKS 设置为 0 将禁用调用堆栈。
|
VT_BUFFER_SIZE
|
控制 MPI API 跟踪收集器的内部缓冲区的大小。缺省值为 64M(64 兆字节)。
|
VT_MAX_FLUSHES
|
控制在终止 MPI 跟踪前刷新缓冲区的次数。缺省值是 0,用于设置只要缓冲区满了就允许刷新到磁盘。将 VT_MAX_FLUSHES 设置为正数将为刷新缓冲区的次数设置限制。
|
VT_VERBOSE
|
启用各种错误和状态消息显示。缺省值为 1,在此设置下会启用紧急错误和状态消息。如果出现问题,请将此变量设置为 2。
|
|
有关这些变量的更多信息,请参见 Technische Universität Dresden Web 站点上的《Vampirtrace User Manual》(《Vampirtrace 用户手册》)。
在达到缓冲区限制之后发生的 MPI 事件将不会写入跟踪文件,这将导致跟踪不完整。
要去掉限制并获取应用程序的完整跟踪,请将 VT_MAX_FLUSHES 环境变量设置为 0。该设置将导致 MPI API 跟踪收集器在缓冲区已满时刷新磁盘的缓冲区。
要更改缓冲区大小,请设置 VT_BUFFER_SIZE 环境变量。该变量的最佳值取决于要跟踪的应用程序。设置较小的值将增加应用程序可以使用的内存,但是将触发 MPI API 跟踪收集器频繁进行缓冲区刷新。这些缓冲区刷新可能会显著改变应用程序的行为。另一方面,设置较大的值(如 2 G)可以使 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 Sends(MPI 发送次数)
|
已启动 MPI 点对点发送数
|
MPI Bytes Sent(发送的 MPI 字节数)
|
"MPI Sends"(MPI 发送次数)中的字节数
|
MPI Receives(MPI 接收次数)
|
已完成 MPI 点对点接收数
|
MPI Bytes Received(接收的 MPI 字节数)
|
"MPI Receives"(MPI 接收次数)中的字节数
|
MPI Time(MPI 时间)
|
对 MPI 函数的所有调用所花费的时间
|
Other MPI Events(其他 MPI 事件)
|
对既没有发送也没有接收点对点消息的 MPI 函数的调用数
|
|
"MPI Time"(MPI 时间)是 MPI 函数中所用的总线程时间。如果还收集了 MPI 状态时间,则除 MPI_Init 和 MPI_Finalize 之外的所有 MPI 函数的 MPI 工作时间加上 MPI 等待时间应大约等于 MPI 工作时间。在 Linux 上,MPI 等待和工作时间基于用户 CPU 时间加系统 CPU 时间,而 MPI 时间基于实际时间,所以这些数值将不匹配。
当前,仅针对点对点消息收集 MPI 字节和消息计数。不针对集合通信函数记录 MPI 字节和消息计数。"MPI Bytes Received"(接收的 MPI 字节数)度量会计算所有消息中接收的实际字节数。"MPI Bytes Sent"(发送的 MPI 字节数)会计算所有消息中发送的实际字节数。"MPI Sends"(MPI 发送次数)会计算发送的消息数,"MPI Receives"(MPI 接收次数)会计算接收的消息数。
收集 MPI 跟踪数据有助于标识 MPI 程序中可能因 MPI 调用而产生性能问题的位置。可能发生的性能问题的例子有负载平衡、同步延迟和通信瓶颈。