ggml : add a set of functions for checking contiguity of inner tensor dimensions (#25650)

Co-authored-by: Stanisław Szymczyk <sszymczy@gmail.com>
This commit is contained in:
fairydreaming
2026-07-14 14:37:52 +02:00
committed by GitHub
co-authored by Stanisław Szymczyk
parent 657e01125a
commit a7312ae94f
2 changed files with 22 additions and 6 deletions
+4
View File
@@ -780,6 +780,10 @@ extern "C" {
GGML_API bool ggml_is_contiguous_1(const struct ggml_tensor * tensor); // contiguous for dims >= 1
GGML_API bool ggml_is_contiguous_2(const struct ggml_tensor * tensor); // contiguous for dims >= 2
GGML_API bool ggml_is_contiguous_to_1(const struct ggml_tensor * tensor); // contiguous for dims < 1
GGML_API bool ggml_is_contiguous_to_2(const struct ggml_tensor * tensor); // contiguous for dims < 2
GGML_API bool ggml_is_contiguous_to_3(const struct ggml_tensor * tensor); // contiguous for dims < 3
// returns whether the tensor elements are allocated as one contiguous block of memory (no gaps, but permutation ok)
GGML_API bool ggml_is_contiguously_allocated(const struct ggml_tensor * tensor);
+18 -6
View File
@@ -1464,14 +1464,14 @@ bool ggml_is_transposed(const struct ggml_tensor * tensor) {
return tensor->nb[0] > tensor->nb[1];
}
static bool ggml_is_contiguous_n(const struct ggml_tensor * tensor, int n) {
static bool ggml_is_contiguous_m_n(const struct ggml_tensor * tensor, int m, int n) {
size_t next_nb = ggml_type_size(tensor->type);
if (tensor->ne[0] != ggml_blck_size(tensor->type) && tensor->nb[0] != next_nb) {
return false;
}
next_nb *= tensor->ne[0]/ggml_blck_size(tensor->type);
for (int i = 1; i < GGML_MAX_DIMS; i++) {
if (i > n) {
for (int i = 1; i < n; i++) {
if (i > m) {
if (tensor->ne[i] != 1 && tensor->nb[i] != next_nb) {
return false;
}
@@ -1489,15 +1489,27 @@ bool ggml_is_contiguous(const struct ggml_tensor * tensor) {
}
bool ggml_is_contiguous_0(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_n(tensor, 0);
return ggml_is_contiguous_m_n(tensor, 0, GGML_MAX_DIMS);
}
bool ggml_is_contiguous_1(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_n(tensor, 1);
return ggml_is_contiguous_m_n(tensor, 1, GGML_MAX_DIMS);
}
bool ggml_is_contiguous_2(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_n(tensor, 2);
return ggml_is_contiguous_m_n(tensor, 2, GGML_MAX_DIMS);
}
bool ggml_is_contiguous_to_1(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_m_n(tensor, 0, 1);
}
bool ggml_is_contiguous_to_2(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_m_n(tensor, 0, 2);
}
bool ggml_is_contiguous_to_3(const struct ggml_tensor * tensor) {
return ggml_is_contiguous_m_n(tensor, 0, 3);
}
bool ggml_is_contiguously_allocated(const struct ggml_tensor * tensor) {