Files
SAPFOR/dvm/tools/pppa/trunk/src/dvmh_stat.h
2025-03-25 20:35:20 +03:00

209 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Файл содержит типы и функции для сбора статистики DVMH
* <b> Файл не полностью совпадает с файлом из RTS! Соотвествующие места помечены как (+) </b>
* @author Aleksei Shubert <alexei@shubert.ru>
*/
#ifndef DVM_SYS_DVMH_STAT_H
#define DVM_SYS_DVMH_STAT_H
#if defined(_WIN64)
#define __LLP64__ 1
#endif
#if defined(__LLP64__)
typedef long long DvmType;
typedef unsigned long long UDvmType;
#else
typedef long DvmType;
typedef unsigned long UDvmType;
#endif
#define DVMH_EXTENDED_STAT 0 /**< разбор расширенной статистики */
// -- Forward declarations ---------------------------------------------------------------------------------------------
struct _dvmh_stat_header_st;
struct _dvmh_stat_header_gpu_info_st;
struct _dvmh_stat_interval_st;
struct _dvmh_stat_interval_gpu_st;
struct _dvmh_stat_interval_gpu_metric_st;
struct _dvmh_stat_interval_thread_st;
// -- Типы связанные с заголовком статистики
typedef struct _dvmh_stat_header_st dvmh_stat_header;
typedef struct _dvmh_stat_header_gpu_info_st dvmh_stat_header_gpu_info;
// -- Типы связанные с интервальной статистикой
typedef struct _dvmh_stat_interval_st dvmh_stat_interval;
typedef struct _dvmh_stat_interval_gpu_st dvmh_stat_interval_gpu;
typedef struct _dvmh_stat_interval_gpu_metric_st dvmh_stat_interval_gpu_metric;
typedef struct _dvmh_stat_interval_thread_st dvmh_stat_interval_thread;
// -- Constants --------------------------------------------------------------------------------------------------------
// Названия метрик
typedef enum {
DVMH_STAT_METRIC_KERNEL_EXEC,
/* DVMH-CUDA memcpy */
DVMH_STAT_METRIC_CPY_DTOH,
DVMH_STAT_METRIC_CPY_HTOD,
DVMH_STAT_METRIC_CPY_DTOD,
/* DVMH memcpy */
DVMH_STAT_METRIC_CPY_ACROSS_DTOH,
DVMH_STAT_METRIC_CPY_ACROSS_HTOD,
DVMH_STAT_METRIC_CPY_ACROSS_DTOD,
DVMH_STAT_METRIC_CPY_SHADOW_DTOH,
DVMH_STAT_METRIC_CPY_SHADOW_HTOD,
DVMH_STAT_METRIC_CPY_SHADOW_DTOD,
DVMH_STAT_METRIC_CPY_REMOTE_DTOH,
DVMH_STAT_METRIC_CPY_REMOTE_HTOD,
DVMH_STAT_METRIC_CPY_REMOTE_DTOD,
DVMH_STAT_METRIC_CPY_REDIST_DTOH,
DVMH_STAT_METRIC_CPY_REDIST_HTOD,
DVMH_STAT_METRIC_CPY_REDIST_DTOD,
DVMH_STAT_METRIC_CPY_IN_REG_DTOH,
DVMH_STAT_METRIC_CPY_IN_REG_HTOD,
DVMH_STAT_METRIC_CPY_IN_REG_DTOD,
DVMH_STAT_METRIC_CPY_GET_ACTUAL,
/* DVMH loop events */
DVMH_STAT_METRIC_LOOP_PORTION_TIME,
/* DVMH utility functions events */
DVMH_STAT_METRIC_UTIL_ARRAY_TRANSFORMATION,
DVMH_STAT_METRIC_UTIL_ARRAY_REDUCTION,
DVMH_STAT_METRIC_UTIL_RTC_COMPILATION,
DVMH_STAT_METRIC_UTIL_PAGE_LOCK_HOST_MEM,
// --
DVMH_STAT_METRIC_FORCE_INT
} dvmh_stat_metric_names;
#define DVMH_STAT_SIZE_STR 64
#define DVMH_STAT_METRIC_CNT DVMH_STAT_METRIC_FORCE_INT
#define DVMH_STAT_MAX_GPU_CNT 8
#define DVMH_STAT_GPU_UNKNOWN "Unknown"
// -- Global variables -------------------------------------------------------------------------------------------------
static const char *dvmhStatMetricsTitles[DVMH_STAT_METRIC_FORCE_INT] = {
"Kernel executions",
"Copy GPU to CPU",
"Copy CPU to GPU",
"Copy GPU to GPU",
"[Across] Copy GPU to CPU",
"[Across] Copy CPU to GPU",
"[Across] Copy GPU to GPU",
"[Shadow] Copy GPU to CPU",
"[Shadow] Copy CPU to GPU",
"[Shadow] Copy GPU to GPU",
"[Remote] Copy GPU to CPU",
"[Remote] Copy CPU to GPU",
"[Remote] Copy GPU to GPU",
"[Redistribution] Copy GPU to CPU",
"[Redistribution] Copy CPU to GPU",
"[Redistribution] Copy GPU to GPU",
"[Region IN] Copy GPU to CPU",
"[Region IN] Copy CPU to GPU",
"[Region IN] Copy GPU to GPU",
"GET_ACTUAL",
"Loop execution",
"Data reorganization",
"Reduction",
"GPU Runtime compilation",
"Page lock host memory"
};
static short dvmhDebug = 0;
// -- Data types -------------------------------------------------------------------------------------------------------
/**
* Описатель GPU в заголовке статистики
*/
struct _dvmh_stat_header_gpu_info_st {
unsigned long id; /**< идентификатор GPU */
unsigned char name[DVMH_STAT_SIZE_STR + 1]; /**< текстовое описание GPU */
};
/**
* Заголовок DVMH статистики
*/
struct _dvmh_stat_header_st {
unsigned long sizeHeader;
unsigned long sizeIntervalConstPart;
unsigned long threadsAmount;
dvmh_stat_header_gpu_info gpu[DVMH_STAT_MAX_GPU_CNT]; /**< ссылка на массив описателей GPU */
};
/**
* Характеристика/метрика DVMH
*
* Поле `values` не выгружется в файл. Это ведет к избыточному использованию памяти, но упрощает поддержку.
*/
struct _dvmh_stat_interval_gpu_metric_st {
short hasOwnMeasures; /**< если собственные измерения */
short isReduced; /**< значения метрики редуцированы */
#if DVMH_EXTENDED_STAT == 1
dvmh_stat_interval_gpu_metric_value *values; /**< ссылка на массив значений */
#endif
UDvmType countMeasures; /**< количество измерений характеристики */
double timeProductive; /**< полезное время */
double timeLost; /**< потерянное время */
// -- Агрегированные значения (для box-диаграммы)
double min; /**< минимальное значение */
double mean; /**< среднее */
double max; /**< максимальное значение */
double sum; /**< сумма значений */
#if DVMH_EXTENDED_STAT == 1
double q1; /**< Q1 квантиль */
double median; /**< медиана */
double q3; /**< Q3 квантиль */
#endif
};
/**
* Интервальное хранилище статистики для одного GPU
*
* Необходим, для автоматического позиционирования в памяти, а не ручному просчету.
* Ведет к некоторому избыточному использованию памяти, ввиду возможного выравнивания компилятором,
* но упрощает поддерживаемость кода.
*
* Структура избыточна, но введена с целью упрощения понимания кода.
*/
struct _dvmh_stat_interval_gpu_st {
dvmh_stat_interval_gpu_metric metrics[DVMH_STAT_METRIC_FORCE_INT]; /** статистические метрики */
// --
double timeProductive; /**< (+) полезное время */
double timeLost; /**< (+) потерянное время */
};
/**
* Структура для нитей
*/
struct _dvmh_stat_interval_thread_st {
double user_time;
double system_time;
};
/**
* Интервальное хранилище статистики по GPU и нитям
*/
struct _dvmh_stat_interval_st {
unsigned long mask; /**< маска GPU (если GPU задействован, устанавливаем бит в 1 с соотвествующим номером **/
bool threadsUsed;
dvmh_stat_interval_gpu gpu[DVMH_STAT_MAX_GPU_CNT]; /** хранилище метрик для каждого GPU */
dvmh_stat_interval_thread* threads;
// --
double allGPUTimeProductive; /**< (+) полезное время */
double allGPUTimeLost; /**< (+) потерянное время */
double allThreadsUserTime; /**< (+) полезное время нитей */
double allThreadsSystemTime; /**< (+) потерянное время нитей */
};
#endif //DVM_SYS_DVMH_STAT_H