1#ifndef OP_DESC_H
  2#define OP_DESC_H
  3
  4#define GGML_COMMON_IMPL_CPP
  5#include "ggml-backend-impl.h"
  6#include "ggml-common.h"
  7
  8#include <string>
  9#include <stdio.h>
 10
 11struct op_desc {
 12    char strides[64 * GGML_MAX_SRC];
 13    char dims[64 * GGML_MAX_SRC];
 14    char types[16 * GGML_MAX_SRC];
 15    char buffs[64 * GGML_MAX_SRC];
 16    char names[64 * GGML_MAX_SRC];
 17
 18    int format_tensor_dims(char * str, const struct ggml_tensor * t) {
 19        if (t->ne[2] == 1 && t->ne[3] == 1) {
 20            return sprintf(str, "%d:%d", (int) t->ne[0], (int) t->ne[1]);
 21        } else {
 22            return sprintf(str, "%d:%d:%d:%d", (int) t->ne[0], (int) t->ne[1], (int) t->ne[2], (int) t->ne[3]);
 23        }
 24    }
 25
 26    void format_op_dims(char * str, const struct ggml_tensor * t) {
 27        char * p = str;
 28
 29        // append src0 and src1 (if any)
 30        if (t->src[0]) {
 31            p += format_tensor_dims(p, t->src[0]);
 32
 33            for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) {
 34                p += sprintf(p, " x ");
 35                p += format_tensor_dims(p, t->src[i]);
 36            }
 37
 38            p += sprintf(p, " -> ");
 39        }
 40
 41        // format self dims separately for better visual alignment
 42        char self[64];
 43        format_tensor_dims(self, t);
 44
 45        p += sprintf(p, "%s", self);
 46    }
 47
 48    int format_tensor_strides(char * str, const struct ggml_tensor * t) {
 49        const char * c = ggml_is_contiguous(t) ? "" : "!";
 50
 51        if (t->ne[2] == 1 && t->ne[3] == 1) {
 52            return sprintf(str, "%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], c);
 53        } else {
 54            return sprintf(str, "%zu:%zu:%zu:%zu%s", (size_t) t->nb[0], (size_t) t->nb[1], (size_t) t->nb[2], (size_t) t->nb[3], c);
 55        }
 56    }
 57
 58    void format_op_strides(char * str, const struct ggml_tensor * t) {
 59        char * p = str;
 60
 61        // append src0 and src1 (if any)
 62        if (t->src[0]) {
 63            p += format_tensor_strides(p, t->src[0]);
 64
 65            for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) {
 66                p += sprintf(p, " x ");
 67                p += format_tensor_strides(p, t->src[i]);
 68            }
 69
 70            p += sprintf(p, " -> ");
 71        }
 72
 73        // format self dims separately for better visual alignment
 74        char self[64];
 75        format_tensor_strides(self, t);
 76
 77        p += sprintf(p, "%s", self);
 78    }
 79
 80    void format_op_types(char * str, const struct ggml_tensor * t) {
 81        char * p = str;
 82
 83        // append src0 and src1 (if any)
 84        if (t->src[0]) {
 85            p += sprintf(p, "%s", ggml_type_name(t->src[0]->type));
 86
 87            for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) {
 88                p += sprintf(p, " x ");
 89                p += sprintf(p, "%s", ggml_type_name(t->src[i]->type));
 90            }
 91
 92            p += sprintf(p, " -> ");
 93        }
 94
 95        p += sprintf(p, "%s", ggml_type_name(t->type));
 96    }
 97
 98    const char * tensor_buff_name(const struct ggml_tensor * t) {
 99        if (t->buffer) {
100            return ggml_backend_buffer_name(t->buffer);
101        }
102        return "NONE";
103    }
104
105    void format_op_buffs(char * str, const struct ggml_tensor * t) {
106        char * p = str;
107
108        // append src0 and src1 (if any)
109        if (t->src[0]) {
110            p += sprintf(p, "%s", tensor_buff_name(t->src[0]));
111
112            for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) {
113                p += sprintf(p, " x ");
114                p += sprintf(p, "%s", tensor_buff_name(t->src[i]));
115            }
116
117            p += sprintf(p, " -> ");
118        }
119
120        p += sprintf(p, "%s", tensor_buff_name(t));
121    }
122
123    void format_op_names(char * str, const struct ggml_tensor * t) {
124        char * p = str;
125
126        // append src0 and src1 (if any)
127        if (t->src[0]) {
128            p += sprintf(p, "%s", t->src[0]->name);
129
130            for (int i = 1; i < GGML_MAX_SRC && t->src[i]; i++) {
131                p += sprintf(p, " x ");
132                p += sprintf(p, "%s", t->src[i]->name);
133            }
134
135            p += sprintf(p, " -> ");
136        }
137
138        p += sprintf(p, "%s", t->name);
139    }
140
141    void format(const ggml_tensor * op) {
142        format_op_dims(dims, op);
143        format_op_strides(strides, op);
144        format_op_types(types, op);
145        format_op_buffs(buffs, op);
146        format_op_names(names, op);
147    }
148
149    op_desc() {}
150    op_desc(const ggml_tensor * op) { format(op); }
151};
152
153#endif // OP_DESC_H