@@ -443,7 +443,7 @@ void ggml_gallocr_free(ggml_gallocr_t galloc) {
443
443
}
444
444
}
445
445
446
- free ( galloc -> hash_set . keys );
446
+ ggml_hash_set_free ( & galloc -> hash_set );
447
447
free (galloc -> hash_values );
448
448
free (galloc -> bufts );
449
449
free (galloc -> buffers );
@@ -456,7 +456,7 @@ void ggml_gallocr_free(ggml_gallocr_t galloc) {
456
456
typedef struct ggml_gallocr * ggml_gallocr_t ;
457
457
458
458
static 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 );
460
460
return & galloc -> hash_values [i ];
461
461
}
462
462
@@ -565,8 +565,8 @@ static int get_node_buffer_id(const int * node_buffer_ids, int i) {
565
565
566
566
static void ggml_gallocr_alloc_graph_impl (ggml_gallocr_t galloc , struct ggml_cgraph * graph , const int * node_buffer_ids , const int * leaf_buffer_ids ) {
567
567
// 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 );
570
570
571
571
// allocate leafs
572
572
// 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
671
671
}
672
672
673
673
bool 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 ;
675
677
676
678
// 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 );
683
682
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 );
684
686
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 );
689
687
}
690
688
691
689
// reset allocators
@@ -817,7 +815,7 @@ static void ggml_gallocr_init_tensor(ggml_gallocr_t galloc, struct ggml_tensor *
817
815
}
818
816
819
817
static 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 ;
818
+ ggml_backend_buffer_type_t buft = galloc -> bufts [talloc -> buffer_id ];
821
819
size_t node_size = (node -> data || node -> view_src ) ? 0 : ggml_backend_buft_get_alloc_size (buft , node );
822
820
return talloc -> size_max >= node_size ;
823
821
}
0 commit comments