收集器可以收集有关对消息传递接口 (Message Passing Interface, MPI) 库的调用的数据。
使用开源 VampirTrace 5.5.3 发行版来实现 MPI 跟踪。该跟踪可识别以下 VampirTrace 环境变量:
VT_STACKS | |
VT_BUFFER_SIZE | |
VT_MAX_FLUSHES |
控制在终止 MPI 跟踪前刷新缓冲区的次数。缺省值是 0,这表示只要缓冲区满了就允许刷新到磁盘。将 VT_MAX_FLUSHES 设置为正数将为刷新缓冲区的次数设置限制。 |
VT_VERBOSE |
有关这些变量的更多信息,请参见 Technische Universität Dresden Web 站点上的 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 |
表 2–4 MPI 跟踪度量
度量 |
定义 |
---|---|
MPI 发送数 |
已启动 MPI 点对点发送数 |
发送的 MPI 字节 |
“MPI 发送”中的字节数 |
MPI 接收数 |
已完成 MPI 点对点接收数 |
接收的 MPI 字节 |
“MPI 接收”中的字节数 |
MPI 时间 |
对 MPI 函数的所有调用所花费的时间 |
其他 MPI 事件 |
对既没有发送也没有接收点对点消息的 MPI 函数的调用数 |
MPI 时间是 MPI 函数中所用的总 LWP 时间。如果还收集了 MPI 状态时间,则除 MPI_Init 和 MPI_Finalize 之外的所有 MPI 函数的 MPI 工作时间加上 MPI 等待时间应大约等于 MPI 工作时间。在 Linux 上,MPI 等待和工作基于用户 CPU 时间加系统 CPU 时间,而 MPI 时间基于实际时间,所以这些数值将不匹配。
当前,仅针对点对点消息收集 MPI 字节和消息计数;不针对集体通信函数记录 MPI 字节和消息计数。“接收的 MPI 字节”度量会计算所有消息中接收的实际字节数。“发送的 MPI 字节”会计算所有消息中发送的实际字节数。“MPI 发送数”会计算发送的消息数,“MPI 接收数”会计算接收的消息数。
收集 MPI 跟踪数据有助于标识 MPI 程序中可能因 MPI 调用而产生性能问题的位置。可能发生的性能问题的例子有负载平衡、同步延迟和通信瓶颈。