| 499 | }; |
| 500 | |
| 501 | ggml_gallocr_t ggml_gallocr_new_n(ggml_backend_buffer_type_t * bufts, int n_bufs) { |
| 502 | ggml_gallocr_t galloc = (ggml_gallocr_t)calloc(1, sizeof(struct ggml_gallocr)); |
| 503 | GGML_ASSERT(galloc != NULL); |
| 504 | |
| 505 | galloc->bufts = calloc(n_bufs, sizeof(ggml_backend_buffer_type_t)); |
| 506 | GGML_ASSERT(galloc->bufts != NULL); |
| 507 | |
| 508 | galloc->buffers = calloc(n_bufs, sizeof(struct vbuffer *)); |
| 509 | GGML_ASSERT(galloc->buffers != NULL); |
| 510 | |
| 511 | galloc->buf_tallocs = calloc(n_bufs, sizeof(struct ggml_dyn_tallocr *)); |
| 512 | GGML_ASSERT(galloc->buf_tallocs != NULL); |
| 513 | |
| 514 | for (int i = 0; i < n_bufs; i++) { |
| 515 | galloc->bufts[i] = bufts[i]; |
| 516 | galloc->buffers[i] = NULL; |
| 517 | |
| 518 | // check if the same buffer type is used multiple times and reuse the same allocator |
| 519 | for (int j = 0; j < i; j++) { |
| 520 | if (bufts[i] == bufts[j]) { |
| 521 | galloc->buf_tallocs[i] = galloc->buf_tallocs[j]; |
| 522 | break; |
| 523 | } |
| 524 | } |
| 525 | |
| 526 | if (galloc->buf_tallocs[i] == NULL) { |
| 527 | size_t alignment = ggml_backend_buft_get_alignment(bufts[i]); |
| 528 | size_t max_size = ggml_backend_buft_get_max_size(bufts[i]); |
| 529 | galloc->buf_tallocs[i] = ggml_dyn_tallocr_new(alignment, max_size); |
| 530 | } |
| 531 | } |
| 532 | galloc->n_buffers = n_bufs; |
| 533 | |
| 534 | return galloc; |
| 535 | } |
| 536 | |
| 537 | ggml_gallocr_t ggml_gallocr_new(ggml_backend_buffer_type_t buft) { |
| 538 | return ggml_gallocr_new_n(&buft, 1); |