-
Notifications
You must be signed in to change notification settings - Fork 3
mpi profiling
xiehuc edited this page Apr 21, 2015
·
1 revision
在新数据格式中,主要是处理一些程序,用一个if判断将数据类型参数传入MPI调用。因此 我们在捕获的时候是使用的:
count \times map(fortran\ type)
这样将乘积记录下来,就可以计算更加精确的结果。map是用的数组映射,更具体的:
- 编译datatype.f程序并执行,会输出一些C语言的初始化数组的代码datatype.h
- 在编译时 #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对应新格式。
在旧数据格式中,认为datatype参数是一个字面常量,因此可以从bitcode中取得。于是插桩捕获时只捕获了count量。