@@ -443,7 +443,7 @@ void ggml_gallocr_free(ggml_gallocr_t galloc) {
443443 }
444444 }
445445
446- free ( galloc -> hash_set . keys );
446+ ggml_hash_set_free ( & galloc -> hash_set );
447447 free (galloc -> hash_values );
448448 free (galloc -> bufts );
449449 free (galloc -> buffers );
@@ -456,7 +456,7 @@ void ggml_gallocr_free(ggml_gallocr_t galloc) {
456456typedef struct ggml_gallocr * ggml_gallocr_t ;
457457
458458static struct hash_node * ggml_gallocr_hash_get (ggml_gallocr_t galloc , struct ggml_tensor * t ) {
459- size_t i = ggml_hash_find_or_insert (galloc -> hash_set , t );
459+ size_t i = ggml_hash_find_or_insert (& galloc -> hash_set , t );
460460 return & galloc -> hash_values [i ];
461461}
462462
@@ -565,8 +565,8 @@ static int get_node_buffer_id(const int * node_buffer_ids, int i) {
565565
566566static void ggml_gallocr_alloc_graph_impl (ggml_gallocr_t galloc , struct ggml_cgraph * graph , const int * node_buffer_ids , const int * leaf_buffer_ids ) {
567567 // clear hash tables
568- memset ( galloc -> hash_set . keys , 0 , galloc -> hash_set . size * sizeof ( struct ggml_tensor * ) );
569- memset (galloc -> hash_values , 0 , galloc -> hash_set . size * sizeof (struct hash_node ));
568+ ggml_hash_set_reset ( & galloc -> hash_set );
569+ memset (galloc -> hash_values , 0 , sizeof (struct hash_node ) * galloc -> hash_set . size );
570570
571571 // allocate leafs
572572 // these may be tensors that the application is not using in the graph, but may still want to allocate for other purposes
@@ -671,21 +671,19 @@ static void ggml_gallocr_alloc_graph_impl(ggml_gallocr_t galloc, struct ggml_cgr
671671}
672672
673673bool ggml_gallocr_reserve_n (ggml_gallocr_t galloc , struct ggml_cgraph * graph , const int * node_buffer_ids , const int * leaf_buffer_ids ) {
674- size_t hash_size = graph -> visited_hash_table .size ;
674+ size_t min_hash_size = graph -> n_nodes + graph -> n_leafs ;
675+ // add 25% margin to avoid hash collisions
676+ min_hash_size += min_hash_size / 4 ;
675677
676678 // initialize hash table
677- if (galloc -> hash_set .size < hash_size ) {
678- free (galloc -> hash_set .keys );
679- free (galloc -> hash_values );
680- galloc -> hash_set .size = hash_size ;
681- galloc -> hash_set .keys = calloc (hash_size , sizeof (struct ggml_tensor * ));
682- galloc -> hash_values = calloc (hash_size , sizeof (struct hash_node ));
679+ if (galloc -> hash_set .size < min_hash_size ) {
680+ ggml_hash_set_free (& galloc -> hash_set );
681+ galloc -> hash_set = ggml_hash_set_new (min_hash_size );
683682 GGML_ASSERT (galloc -> hash_set .keys != NULL );
683+
684+ free (galloc -> hash_values );
685+ galloc -> hash_values = malloc (sizeof (struct hash_node ) * galloc -> hash_set .size );
684686 GGML_ASSERT (galloc -> hash_values != NULL );
685- } else {
686- // reset hash table
687- memset (galloc -> hash_set .keys , 0 , sizeof (struct ggml_tensor * ) * galloc -> hash_set .size );
688- memset (galloc -> hash_values , 0 , sizeof (struct hash_node ) * galloc -> hash_set .size );
689687 }
690688
691689 // reset allocators
@@ -817,8 +815,7 @@ static void ggml_gallocr_init_tensor(ggml_gallocr_t galloc, struct ggml_tensor *
817815}
818816
819817static bool ggml_gallocr_node_needs_realloc (ggml_gallocr_t galloc , struct ggml_tensor * node , struct tensor_alloc * talloc ) {
820- ggml_backend_buffer_type_t buft = talloc -> buffer_id != -1 ? galloc -> bufts [talloc -> buffer_id ] : NULL ;
821- size_t node_size = (node -> data || node -> view_src ) ? 0 : ggml_backend_buft_get_alloc_size (buft , node );
818+ size_t node_size = (node -> data || node -> view_src ) ? 0 : ggml_backend_buft_get_alloc_size (galloc -> bufts [talloc -> buffer_id ], node );
822819 return talloc -> size_max >= node_size ;
823820}
824821
0 commit comments