profiler: make profiler optional with GGML_GRAPH_PROFILER

This commit is contained in:
Max Krasnyansky 2024-09-25 15:42:46 -07:00
parent b7ae2d176e
commit 4578c37a92
6 changed files with 83 additions and 18 deletions

View file

@ -75,6 +75,7 @@ option(GGML_CCACHE "ggml: use ccache if available" ON)
option(GGML_ALL_WARNINGS "ggml: enable all compiler warnings" ON)
option(GGML_ALL_WARNINGS_3RD_PARTY "ggml: enable all compiler warnings in 3rd party libs" OFF)
option(GGML_GPROF "ggml: enable gprof" OFF)
option(GGML_GRAPH_PROFILER "ggml: enable internal Graph and Op profiler" OFF)
# build
option(GGML_FATAL_WARNINGS "ggml: enable -Werror flag" OFF)

View file

@ -9,6 +9,10 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux")
add_compile_definitions($<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>)
endif()
if (GGML_GRAPH_PROFILER)
add_compile_definitions(GGML_GRAPH_PROFILER)
endif()
if (NOT MSVC)
if (GGML_SANITIZE_THREAD)
add_compile_options(-fsanitize=thread)

View file

@ -157,17 +157,6 @@ static size_t ggml_hash_find_or_insert(struct ggml_hash_set * hash_set, struct g
GGML_ABORT("fatal error");
}
// op profile data (per op / per thread)
enum ggml_profile_event {
GGML_PROF_OP_START,
GGML_PROF_OP_SYNC,
GGML_PROF_OP_END
};
struct ggml_profile_data {
uint64_t nsec[GGML_PROF_OP_END + 1]; // event times in nsec
};
// computation graph
enum ggml_cgraph_eval_order {
@ -176,6 +165,8 @@ enum ggml_cgraph_eval_order {
GGML_CGRAPH_EVAL_ORDER_COUNT
};
struct ggml_profile_data;
struct ggml_cgraph {
int size;
int n_nodes;
@ -194,12 +185,6 @@ struct ggml_cgraph {
struct ggml_cgraph ggml_graph_view(struct ggml_cgraph * cgraph, int i0, int i1);
void ggml_profile_graph_init(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_start(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_finish(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_free(struct ggml_cgraph *cg);
void ggml_profile_op_event(const struct ggml_cgraph *cg, enum ggml_profile_event e, int node_n, int ith);
#ifdef __cplusplus
}
#endif

View file

@ -1,9 +1,12 @@
#include "ggml-impl.h"
#include "ggml-profile.h"
#include <stdint.h>
#include <stdlib.h>
#include <chrono>
#ifdef GGML_GRAPH_PROFILER
extern "C" void ggml_profile_graph_init(struct ggml_cgraph *cg, int n_threads)
{
if (!getenv("GGML_GRAPH_PROFILE")) { return; }
@ -138,3 +141,5 @@ extern "C" void ggml_profile_op_event(const struct ggml_cgraph *cg, enum ggml_pr
using clock = std::chrono::high_resolution_clock;
cg->prof[node_n][ith].nsec[e] = std::chrono::nanoseconds(clock::now().time_since_epoch()).count();
}
#endif // GGML_GRAPH_PROFILER

69
ggml/src/ggml-profile.h Normal file
View file

@ -0,0 +1,69 @@
#pragma once
#include "ggml-impl.h"
// GGML internal header
#ifdef __cplusplus
extern "C" {
#endif
// op profile data (per op / per thread)
enum ggml_profile_event {
GGML_PROF_OP_START,
GGML_PROF_OP_SYNC,
GGML_PROF_OP_END
};
struct ggml_profile_data {
uint64_t nsec[GGML_PROF_OP_END + 1]; // event times in nsec
};
#ifndef GGML_GRAPH_PROFILER
// Stub out all profiler functions
static inline void ggml_profile_graph_init(struct ggml_cgraph *cg, int n_threads)
{
GGML_UNUSED(cg);
GGML_UNUSED(n_threads);
}
static inline void ggml_profile_graph_start(struct ggml_cgraph *cg, int n_threads)
{
GGML_UNUSED(cg);
GGML_UNUSED(n_threads);
}
static inline void ggml_profile_graph_finish(struct ggml_cgraph *cg, int n_threads)
{
GGML_UNUSED(cg);
GGML_UNUSED(n_threads);
}
static inline void ggml_profile_graph_free(struct ggml_cgraph *cg)
{
GGML_UNUSED(cg);
}
static inline void ggml_profile_op_event(const struct ggml_cgraph *cg, enum ggml_profile_event e, int node_n, int ith)
{
GGML_UNUSED(cg);
GGML_UNUSED(e);
GGML_UNUSED(node_n);
GGML_UNUSED(ith);
}
#else
void ggml_profile_graph_init(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_start(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_finish(struct ggml_cgraph *cg, int n_threads);
void ggml_profile_graph_free(struct ggml_cgraph *cg);
void ggml_profile_op_event(const struct ggml_cgraph *cg, enum ggml_profile_event e, int node_n, int ith);
#endif // GGML_GRAPH_PROFILER
#ifdef __cplusplus
}
#endif

View file

@ -7,6 +7,7 @@
#include "ggml-quants.h"
#include "ggml.h"
#include "ggml-aarch64.h"
#include "ggml-profile.h"
#if defined(_MSC_VER) || defined(__MINGW32__)
#include <malloc.h> // using malloc.h with MSC/MINGW