From 9fdd415367244ab63a2150dbf4a12c2bc4ac3b97 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Tue, 12 Sep 2023 20:10:53 +0300 Subject: [PATCH] ggml : fix ggml_nbytes (probably temp solution) --- ggml.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/ggml.c b/ggml.c index 2b4d3455..f1e847b1 100644 --- a/ggml.c +++ b/ggml.c @@ -4303,10 +4303,43 @@ int64_t ggml_nrows(const struct ggml_tensor * tensor) { } size_t ggml_nbytes(const struct ggml_tensor * tensor) { - size_t nbytes = tensor->ne[0]*tensor->nb[0]/ggml_blck_size(tensor->type); - for (int i = 1; i < GGML_MAX_DIMS; ++i) { - nbytes += (tensor->ne[i] - 1)*tensor->nb[i]; + // original: + //size_t nbytes = tensor->ne[0]*tensor->nb[0]/ggml_blck_size(tensor->type); + //for (int i = 1; i < GGML_MAX_DIMS; ++i) { + // nbytes += (tensor->ne[i] - 1)*tensor->nb[i]; + //} + //return nbytes; + + // TODO: the imlpementation below is stupid - need something better + + // sort ne and nb + int64_t sne[GGML_MAX_DIMS]; + size_t snb[GGML_MAX_DIMS]; + + for (int i = 0; i < GGML_MAX_DIMS; ++i) { + sne[i] = tensor->ne[i]; + snb[i] = tensor->nb[i]; } + + for (int i = 0; i < GGML_MAX_DIMS; ++i) { + for (int j = i + 1; j < GGML_MAX_DIMS; ++j) { + if ((snb[i] > snb[j]) || (snb[i] == snb[j] && sne[i] < sne[j])) { + size_t tmp = snb[i]; + snb[i] = snb[j]; + snb[j] = tmp; + + int64_t tmp2 = sne[i]; + sne[i] = sne[j]; + sne[j] = tmp2; + } + } + } + + size_t nbytes = (sne[0]/ggml_blck_size(tensor->type))*snb[0]; + for (int i = 1; i < GGML_MAX_DIMS; ++i) { + nbytes += (sne[i] - 1)*snb[i]; + } + return nbytes; }