add cgraph evaluation order member and corresponding enum type
this controls in which order ggml_build_forward visits source nodes. by default the nodes are visited left to right, i.e. src[0] first. in some cases it is beneficial for ggml-alloc to visit in a different order. two possible orders are supported: left-to-right (src[0] first) and right-to-left (src[0] last).
This commit is contained in:
parent
d3f1b438a8
commit
917d2870b4
2 changed files with 16 additions and 2 deletions
10
ggml.c
10
ggml.c
|
@ -17398,8 +17398,12 @@ static void ggml_visit_parents(struct ggml_cgraph * cgraph, struct ggml_tensor *
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < GGML_MAX_SRC; ++i) {
|
for (int i = 0; i < GGML_MAX_SRC; ++i) {
|
||||||
if (node->src[i]) {
|
const int k =
|
||||||
ggml_visit_parents(cgraph, node->src[i]);
|
(cgraph->order == GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT) ? i :
|
||||||
|
(cgraph->order == GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT) ? (GGML_MAX_SRC-1-i) :
|
||||||
|
/* unknown order, just fall back to using i*/ i;
|
||||||
|
if (node->src[k]) {
|
||||||
|
ggml_visit_parents(cgraph, node->src[k]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17458,6 +17462,7 @@ struct ggml_cgraph ggml_build_forward(struct ggml_tensor * tensor) {
|
||||||
/*.grads =*/ { NULL },
|
/*.grads =*/ { NULL },
|
||||||
/*.leafs =*/ { NULL },
|
/*.leafs =*/ { NULL },
|
||||||
/*.hash_table =*/ { NULL },
|
/*.hash_table =*/ { NULL },
|
||||||
|
/*.order =*/ GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT,
|
||||||
/*.perf_runs =*/ 0,
|
/*.perf_runs =*/ 0,
|
||||||
/*.perf_cycles =*/ 0,
|
/*.perf_cycles =*/ 0,
|
||||||
/*.perf_time_us =*/ 0,
|
/*.perf_time_us =*/ 0,
|
||||||
|
@ -17531,6 +17536,7 @@ struct ggml_cgraph * ggml_new_graph(struct ggml_context * ctx) {
|
||||||
/*.grads =*/ { NULL },
|
/*.grads =*/ { NULL },
|
||||||
/*.leafs =*/ { NULL },
|
/*.leafs =*/ { NULL },
|
||||||
/*.hash_table =*/ { NULL },
|
/*.hash_table =*/ { NULL },
|
||||||
|
/*.order =*/ GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT,
|
||||||
/*.perf_runs =*/ 0,
|
/*.perf_runs =*/ 0,
|
||||||
/*.perf_cycles =*/ 0,
|
/*.perf_cycles =*/ 0,
|
||||||
/*.perf_time_us =*/ 0,
|
/*.perf_time_us =*/ 0,
|
||||||
|
|
8
ggml.h
8
ggml.h
|
@ -516,6 +516,12 @@ extern "C" {
|
||||||
// #define GGML_GRAPH_HASHTABLE_SIZE 16411
|
// #define GGML_GRAPH_HASHTABLE_SIZE 16411
|
||||||
#define GGML_GRAPH_HASHTABLE_SIZE 32771
|
#define GGML_GRAPH_HASHTABLE_SIZE 32771
|
||||||
|
|
||||||
|
enum ggml_cgraph_eval_order {
|
||||||
|
GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT = 0,
|
||||||
|
GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT,
|
||||||
|
GGML_CGRAPH_EVAL_ORDER_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
// computation graph
|
// computation graph
|
||||||
struct ggml_cgraph {
|
struct ggml_cgraph {
|
||||||
int n_nodes;
|
int n_nodes;
|
||||||
|
@ -527,6 +533,8 @@ extern "C" {
|
||||||
|
|
||||||
void * visited_hash_table[GGML_GRAPH_HASHTABLE_SIZE];
|
void * visited_hash_table[GGML_GRAPH_HASHTABLE_SIZE];
|
||||||
|
|
||||||
|
enum ggml_cgraph_eval_order order;
|
||||||
|
|
||||||
// performance
|
// performance
|
||||||
int perf_runs;
|
int perf_runs;
|
||||||
int64_t perf_cycles;
|
int64_t perf_cycles;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue