/**
* Файл содержит типы и функции для сбора статистики DVMH
* Файл не полностью совпадает с файлом из RTS! Соотвествующие места помечены как (+)
* @author Aleksei Shubert
*/
#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