| 1397 | } |
| 1398 | |
| 1399 | static bool ggml_is_contiguous_n(const struct ggml_tensor * tensor, int n) { |
| 1400 | size_t next_nb = ggml_type_size(tensor->type); |
| 1401 | if (tensor->ne[0] != ggml_blck_size(tensor->type) && tensor->nb[0] != next_nb) { |
| 1402 | return false; |
| 1403 | } |
| 1404 | next_nb *= tensor->ne[0]/ggml_blck_size(tensor->type); |
| 1405 | for (int i = 1; i < GGML_MAX_DIMS; i++) { |
| 1406 | if (tensor->ne[i] != 1) { |
| 1407 | if (i > n) { |
| 1408 | if (tensor->nb[i] != next_nb) { |
| 1409 | return false; |
| 1410 | } |
| 1411 | next_nb *= tensor->ne[i]; |
| 1412 | } else { |
| 1413 | // this dimension does not need to be contiguous |
| 1414 | next_nb = tensor->ne[i]*tensor->nb[i]; |
| 1415 | } |
| 1416 | } |
| 1417 | } |
| 1418 | return true; |
| 1419 | } |
| 1420 | |
| 1421 | bool ggml_is_contiguous(const struct ggml_tensor * tensor) { |
| 1422 | return ggml_is_contiguous_0(tensor); |
no test coverage detected