File size: 2,183 Bytes
c59fd93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#pragma once

#include "ggml-backend.h"
#include "ggml-cpp.h"
#include "ggml.h"

#include <cstdint>
#include <functional>
#include <vector>

// A prebuilt graph replicated to amortize dispatch and synchronization overhead.
struct perf_cell {
    ggml_context_ptr        ctx;
    ggml_backend_buffer_ptr buf;
    ggml_cgraph *           gf     = nullptr;
    int                     n_runs = 0;
};

using build_graph_fn  = std::function<ggml_tensor *(ggml_context *)>;
using init_tensors_fn = std::function<void(ggml_context *)>;
using op_flops_fn     = std::function<uint64_t(ggml_tensor *)>;

perf_cell build_perf_cell(ggml_backend_t          backend,
                          const build_graph_fn &  build,
                          const init_tensors_fn & init,
                          const op_flops_fn &     flops);

double time_cell_median(ggml_backend_t backend, const perf_cell & cell, int reps);

struct cooldown_opts {
    bool   enabled   = true;
    double drift     = 0.10;  // anchor drift that triggers a cooldown
    double eps       = 0.03;  // anchor tolerance to call the GPU cool again
    int    max_wait  = 120;  // seconds of cooling per cell before giving up
    int    max_retry = 2;    // re-measure rounds per cell before giving up
};

using set_candidate_fn   = std::function<void(int)>;
using clear_candidate_fn = std::function<void()>;

struct cell_result {
    std::vector<double> t;
    bool                trusted    = true;
    double              anchor_min = 0.0;
    double              anchor_max = 0.0;
};

// Times candidates in order while using baseline_cand as a thermal-drift anchor.
cell_result measure_cell(ggml_backend_t             backend,
                         const perf_cell &          cell,
                         int                        reps,
                         const std::vector<int> &   order,
                         const set_candidate_fn &   set_cand,
                         const clear_candidate_fn & clear_cand,
                         int                        baseline_cand,
                         const cooldown_opts &      cool,
                         const char *               cell_label);