Skip to content
xiehuc edited this page Apr 21, 2015 · 1 revision

mpi profiling

new format

在新数据格式中,主要是处理一些程序,用一个if判断将数据类型参数传入MPI调用。因此 我们在捕获的时候是使用的:

count \times map(fortran\ type)

这样将乘积记录下来,就可以计算更加精确的结果。map是用的数组映射,更具体的:

  1. 编译datatype.f程序并执行,会输出一些C语言的初始化数组的代码datatype.h
  2. 在编译时 #include 该头文件,从而初始化一个 DT 数组。在openmpi中数据类型是用 一个整数来代替的,将其作为下标,其值为数据类型的实际大小。即用一个数组 DT[Fortran_Type] = sizeof。

在实际实现中,为了共用接口,在整个计数器数组后面追加 FORTRAN_DATATYPE_MAP_SIZE 大小的空间(默认128),用于存放映射表。

同时为了避免另外一个问题,如果 count 不为空,datatype 不为0, 但是由于映射表不完 整,使得映射之后的 map(datatype)=0。从而整个结果为0。因此我们需要能有检测错误的 能力。具体的实现是再在后面追加 FORTRAN_DATATYPE_MAP_SIZE 的空间用于存放访问 表。当实际访问映射表的某位时,在对应的访问表写1。因此当某个时间,检查访问表中为 1的位,发现映射表为空,则说明有错误发生。

整个数据结构如下:

内存数据:   | 计数器数组    | 映射表(128) | 访问表(128)  |

写入文件:    | 计数器数组    |

默认新写入的都是新格式。但为了保留旧格式的只读兼容,使用MPInfo表示旧格式数据, MPIFullInfo表示新格式数据。

MPBenchTiming对应旧格式,MPBenchReTiming对应新格式。

old format

在旧数据格式中,认为datatype参数是一个字面常量,因此可以从bitcode中取得。于是插桩捕获时只捕获了count量。

Clone this wiki locally