@@ -321,8 +321,7 @@ bool ggml_allocr_is_measure(struct ggml_allocr * alloc) {
321
321
//////////// compute graph allocator
322
322
323
323
static bool ggml_is_view (struct ggml_tensor * t ) {
324
- return t -> op == GGML_OP_RESHAPE || t -> op == GGML_OP_VIEW || t -> op == GGML_OP_TRANSPOSE ||
325
- t -> op == GGML_OP_PERMUTE || t -> op == GGML_OP_CPY ;
324
+ return t -> view_src != NULL ;
326
325
}
327
326
328
327
static bool ggml_are_same_layout (const struct ggml_tensor * a , const struct ggml_tensor * b ) {
@@ -340,36 +339,13 @@ static bool ggml_are_same_layout(const struct ggml_tensor * a, const struct ggml
340
339
return true;
341
340
}
342
341
343
- static struct ggml_tensor * get_view_parent (struct ggml_tensor * t ) {
344
- switch (t -> op ) {
345
- case GGML_OP_PERMUTE :
346
- case GGML_OP_RESHAPE :
347
- case GGML_OP_TRANSPOSE :
348
- case GGML_OP_VIEW :
349
- return t -> src [0 ];
350
- case GGML_OP_CPY :
351
- return t -> src [1 ];
352
- default :
353
- return NULL ;
354
- }
355
- }
356
-
357
- static struct ggml_tensor * get_view_source (struct ggml_tensor * t ) {
358
- struct ggml_tensor * parent = t ;
359
- do {
360
- parent = get_view_parent (parent );
361
- } while (ggml_is_view (parent ));
362
- return parent ;
363
- }
364
-
365
342
static bool ggml_op_can_inplace (enum ggml_op op ) {
366
343
switch (op ) {
367
344
case GGML_OP_SCALE :
368
345
case GGML_OP_DIAG_MASK_ZERO :
369
346
case GGML_OP_DIAG_MASK_INF :
370
347
case GGML_OP_ADD :
371
348
case GGML_OP_ADD1 :
372
- case GGML_OP_ACC :
373
349
case GGML_OP_SUB :
374
350
case GGML_OP_MUL :
375
351
case GGML_OP_DIV :
@@ -379,7 +355,6 @@ static bool ggml_op_can_inplace(enum ggml_op op) {
379
355
case GGML_OP_UNARY :
380
356
case GGML_OP_ROPE :
381
357
case GGML_OP_RMS_NORM :
382
- case GGML_OP_SET :
383
358
case GGML_OP_SOFT_MAX :
384
359
case GGML_OP_CONT :
385
360
return true;
@@ -393,24 +368,8 @@ static void allocate_node(struct ggml_allocr * alloc, struct ggml_tensor * node)
393
368
struct hash_node * ht = alloc -> hash_table ;
394
369
if (node -> data == NULL ) {
395
370
if (ggml_is_view (node )) {
396
- size_t offset ;
397
- switch (node -> op ) {
398
- case GGML_OP_VIEW :
399
- memcpy (& offset , node -> op_params , sizeof (size_t ));
400
- node -> data = (char * ) node -> src [0 ]-> data + offset ;
401
- break ;
402
- case GGML_OP_PERMUTE :
403
- case GGML_OP_RESHAPE :
404
- case GGML_OP_TRANSPOSE :
405
- node -> data = node -> src [0 ]-> data ;
406
- break ;
407
- case GGML_OP_CPY :
408
- node -> data = node -> src [1 ]-> data ;
409
- break ;
410
- default :
411
- GGML_ASSERT (!"unknown view op" );
412
- break ;
413
- }
371
+ assert (node -> view_src -> data != NULL );
372
+ node -> data = (char * )node -> view_src -> data + node -> view_offs ;
414
373
} else {
415
374
// see if we can reuse a parent's buffer (inplace)
416
375
if (ggml_op_can_inplace (node -> op )) {
@@ -430,7 +389,7 @@ static void allocate_node(struct ggml_allocr * alloc, struct ggml_tensor * node)
430
389
struct hash_node * p_hn = hash_get (ht , parent );
431
390
if (parent -> data != NULL && p_hn -> n_children == 1 && p_hn -> n_views == 0 && ggml_are_same_layout (node , parent )) {
432
391
if (ggml_is_view (parent )) {
433
- struct ggml_tensor * view_src = get_view_source ( parent ) ;
392
+ struct ggml_tensor * view_src = parent -> view_src ;
434
393
struct hash_node * view_src_hn = hash_get (ht , view_src );
435
394
if (view_src_hn -> n_views == 1 && view_src_hn -> n_children == 0 && view_src -> data == parent -> data ) {
436
395
// TODO: the offset of the view parent must be kept to ensure that the op doesn't overwrite
@@ -472,7 +431,7 @@ static size_t ggml_allocator_alloc_graph_tensors_n(
472
431
struct ggml_tensor * node = gf -> nodes [i ];
473
432
474
433
if (ggml_is_view (node )) {
475
- struct ggml_tensor * view_src = get_view_source ( node ) ;
434
+ struct ggml_tensor * view_src = node -> view_src ;
476
435
hash_get (ht , view_src )-> n_views += 1 ;
477
436
}
478
437
@@ -557,7 +516,7 @@ static size_t ggml_allocator_alloc_graph_tensors_n(
557
516
558
517
if (p_hn -> n_children == 0 && p_hn -> n_views == 0 ) {
559
518
if (ggml_is_view (parent )) {
560
- struct ggml_tensor * view_src = get_view_source ( parent ) ;
519
+ struct ggml_tensor * view_src = parent -> view_src ;
561
520
struct hash_node * view_src_hn = hash_get (ht , view_src );
562
521
view_src_hn -> n_views -= 1 ;
563
522
AT_PRINTF ("view_src %s: %d children, %d views\n" , view_src -> name , view_src_hn -> n_children , view_src_hn -> n_views );
0 commit comments