summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ggml/include/ggml.h2
-rw-r--r--ggml/src/ggml.c7
2 files changed, 9 insertions, 0 deletions
diff --git a/ggml/include/ggml.h b/ggml/include/ggml.h
index b9b0284b..026993db 100644
--- a/ggml/include/ggml.h
+++ b/ggml/include/ggml.h
@@ -749,6 +749,8 @@ extern "C" {
GGML_API GGML_CALL const char * ggml_op_name (enum ggml_op op);
GGML_API const char * ggml_op_symbol(enum ggml_op op);
+ GGML_API GGML_CALL bool ggml_is_noop(const struct ggml_tensor * tensor);
+
GGML_API const char * ggml_unary_op_name(enum ggml_unary_op op);
GGML_API GGML_CALL const char * ggml_op_desc(const struct ggml_tensor * t); // unary or op name
diff --git a/ggml/src/ggml.c b/ggml/src/ggml.c
index 73054bfe..e7f1ae61 100644
--- a/ggml/src/ggml.c
+++ b/ggml/src/ggml.c
@@ -3581,6 +3581,11 @@ GGML_CALL bool ggml_is_empty(const struct ggml_tensor * tensor) {
return false;
}
+GGML_CALL bool ggml_is_noop(const struct ggml_tensor * tensor) {
+ return tensor->op == GGML_OP_NONE || tensor->op == GGML_OP_RESHAPE || tensor->op == GGML_OP_VIEW || tensor->op == GGML_OP_PERMUTE || tensor->op == GGML_OP_TRANSPOSE ||
+ ggml_is_empty(tensor) ? true : false;
+}
+
bool ggml_are_same_shape(const struct ggml_tensor * t0, const struct ggml_tensor * t1) {
static_assert(GGML_MAX_DIMS == 4, "GGML_MAX_DIMS is not 4 - update this function");
@@ -19208,6 +19213,8 @@ static thread_ret_t ggml_graph_compute_thread(void * data) {
for (int node_n = 0; node_n < cgraph->n_nodes; node_n++) {
struct ggml_tensor * node = cgraph->nodes[node_n];
+ if (ggml_is_noop(node)) continue;
+
ggml_compute_forward(&params, node);
if (state->ith == 0 && cplan->abort_callback && cplan->abort_callback(cplan->abort_callback_data)) {