| 1124 | } |
| 1125 | |
| 1126 | static bool alloc_tensor_range(struct ggml_context * ctx, |
| 1127 | struct ggml_tensor * first, struct ggml_tensor * last, |
| 1128 | ggml_backend_buffer_type_t buft, size_t size, |
| 1129 | ggml_backend_buffer_t ** buffers, size_t * n_buffers) { |
| 1130 | |
| 1131 | ggml_backend_buffer_t buffer = ggml_backend_buft_alloc_buffer(buft, size); |
| 1132 | if (buffer == NULL) { |
| 1133 | GGML_LOG_ERROR("%s: failed to allocate %s buffer of size %zu\n", __func__, ggml_backend_buft_name(buft), size); |
| 1134 | free_buffers(buffers, n_buffers); |
| 1135 | return false; |
| 1136 | } |
| 1137 | |
| 1138 | *buffers = realloc(*buffers, sizeof(ggml_backend_buffer_t) * (*n_buffers + 1)); |
| 1139 | (*buffers)[(*n_buffers)++] = buffer; |
| 1140 | |
| 1141 | struct ggml_tallocr tallocr = ggml_tallocr_new(buffer); |
| 1142 | |
| 1143 | for (struct ggml_tensor * t = first; t != last; t = ggml_get_next_tensor(ctx, t)) { |
| 1144 | enum ggml_status status = GGML_STATUS_SUCCESS; |
| 1145 | if (t->data == NULL) { |
| 1146 | if (t->view_src == NULL) { |
| 1147 | status = ggml_tallocr_alloc(&tallocr, t); |
| 1148 | } else if (t->buffer == NULL) { |
| 1149 | status = ggml_backend_view_init(t); |
| 1150 | } |
| 1151 | } else { |
| 1152 | if (t->view_src != NULL && t->buffer == NULL) { |
| 1153 | // view of a pre-allocated tensor |
| 1154 | status = ggml_backend_view_init(t); |
| 1155 | } |
| 1156 | } |
| 1157 | if (status != GGML_STATUS_SUCCESS) { |
| 1158 | GGML_LOG_ERROR("%s: failed to initialize tensor %s\n", __func__, t->name); |
| 1159 | free_buffers(buffers, n_buffers); |
| 1160 | return false; |
| 1161 | } |
| 1162 | } |
| 1163 | |
| 1164 | return true; |
| 1165 | } |
| 1166 | |
| 1167 | static ggml_backend_buffer_t ggml_backend_alloc_ctx_tensors_from_buft_impl( |
| 1168 | struct ggml_context * ctx, ggml_backend_buffer_type_t buft, size_t * nbytes_total, bool no_alloc) { |
no test coverage detected