@@ -77,8 +77,6 @@ mca_spml_ucx_t mca_spml_ucx = {
77
77
.get_mkey_slow = NULL
78
78
};
79
79
80
- OBJ_CLASS_INSTANCE (mca_spml_ucx_ctx_list_item_t , opal_list_item_t , NULL , NULL );
81
-
82
80
mca_spml_ucx_ctx_t mca_spml_ucx_ctx_default = {
83
81
.ucp_worker = NULL ,
84
82
.ucp_peers = NULL ,
@@ -243,7 +241,7 @@ int mca_spml_ucx_add_procs(ompi_proc_t** procs, size_t nprocs)
243
241
goto error ;
244
242
}
245
243
246
- opal_progress_register (spml_ucx_progress );
244
+ opal_progress_register (spml_ucx_default_progress );
247
245
248
246
mca_spml_ucx .remote_addrs_tbl = (char * * )calloc (nprocs , sizeof (char * ));
249
247
memset (mca_spml_ucx .remote_addrs_tbl , 0 , nprocs * sizeof (char * ));
@@ -511,9 +509,45 @@ int mca_spml_ucx_deregister(sshmem_mkey_t *mkeys)
511
509
return OSHMEM_SUCCESS ;
512
510
}
513
511
512
+ static inline void _ctx_add (mca_spml_ucx_ctx_array_t * array , mca_spml_ucx_ctx_t * ctx )
513
+ {
514
+ int i ;
515
+
516
+ if (array -> ctxs_count < array -> ctxs_num ) {
517
+ array -> ctxs [array -> ctxs_count ] = ctx ;
518
+ } else {
519
+ array -> ctxs = realloc (array -> ctxs , (array -> ctxs_num + MCA_SPML_UCX_CTXS_ARRAY_INC ) * sizeof (mca_spml_ucx_ctx_t * ));
520
+ opal_atomic_wmb ();
521
+ for (i = array -> ctxs_num ; i < array -> ctxs_num + MCA_SPML_UCX_CTXS_ARRAY_INC ; i ++ ) {
522
+ array -> ctxs [i ] = NULL ;
523
+ }
524
+ array -> ctxs [array -> ctxs_num ] = ctx ;
525
+ array -> ctxs_num += MCA_SPML_UCX_CTXS_ARRAY_INC ;
526
+ }
527
+
528
+ opal_atomic_wmb ();
529
+ array -> ctxs_count ++ ;
530
+ }
531
+
532
+ static inline void _ctx_remove (mca_spml_ucx_ctx_array_t * array , mca_spml_ucx_ctx_t * ctx )
533
+ {
534
+ int i ;
535
+
536
+ for (i = 0 ; i < array -> ctxs_count ; i ++ ) {
537
+ if (array -> ctxs [i ] == ctx ) {
538
+ array -> ctxs [i ] = array -> ctxs [array -> ctxs_count - 1 ];
539
+ array -> ctxs [array -> ctxs_count - 1 ] = NULL ;
540
+ break ;
541
+ }
542
+ }
543
+
544
+ array -> ctxs_count -- ;
545
+ opal_atomic_wmb ();
546
+ }
547
+
514
548
int mca_spml_ucx_ctx_create (long options , shmem_ctx_t * ctx )
515
549
{
516
- mca_spml_ucx_ctx_list_item_t * ctx_item ;
550
+ mca_spml_ucx_ctx_t * ucx_ctx ;
517
551
ucp_worker_params_t params ;
518
552
ucp_ep_params_t ep_params ;
519
553
size_t i , j , nprocs = oshmem_num_procs ();
@@ -524,8 +558,8 @@ int mca_spml_ucx_ctx_create(long options, shmem_ctx_t *ctx)
524
558
sshmem_mkey_t * mkey ;
525
559
int rc = OSHMEM_ERROR ;
526
560
527
- ctx_item = OBJ_NEW ( mca_spml_ucx_ctx_list_item_t );
528
- ctx_item -> ctx . options = options ;
561
+ ucx_ctx = malloc ( sizeof ( mca_spml_ucx_ctx_t ) );
562
+ ucx_ctx -> options = options ;
529
563
530
564
params .field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE ;
531
565
if (oshmem_mpi_thread_provided == SHMEM_THREAD_SINGLE || options & SHMEM_CTX_PRIVATE || options & SHMEM_CTX_SERIALIZED ) {
@@ -535,22 +569,26 @@ int mca_spml_ucx_ctx_create(long options, shmem_ctx_t *ctx)
535
569
}
536
570
537
571
err = ucp_worker_create (mca_spml_ucx .ucp_context , & params ,
538
- & ctx_item -> ctx . ucp_worker );
572
+ & ucx_ctx -> ucp_worker );
539
573
if (UCS_OK != err ) {
540
- OBJ_RELEASE ( ctx_item );
574
+ free ( ucx_ctx );
541
575
return OSHMEM_ERROR ;
542
576
}
543
577
544
- ctx_item -> ctx . ucp_peers = (ucp_peer_t * ) calloc (nprocs , sizeof (* (ctx_item -> ctx . ucp_peers )));
545
- if (NULL == ctx_item -> ctx . ucp_peers ) {
578
+ ucx_ctx -> ucp_peers = (ucp_peer_t * ) calloc (nprocs , sizeof (* (ucx_ctx -> ucp_peers )));
579
+ if (NULL == ucx_ctx -> ucp_peers ) {
546
580
goto error ;
547
581
}
548
582
583
+ if (mca_spml_ucx .active_array .ctxs_count == 0 ) {
584
+ opal_progress_register (spml_ucx_ctx_progress );
585
+ }
586
+
549
587
for (i = 0 ; i < nprocs ; i ++ ) {
550
588
ep_params .field_mask = UCP_EP_PARAM_FIELD_REMOTE_ADDRESS ;
551
589
ep_params .address = (ucp_address_t * )(mca_spml_ucx .remote_addrs_tbl [i ]);
552
- err = ucp_ep_create (ctx_item -> ctx . ucp_worker , & ep_params ,
553
- & ctx_item -> ctx . ucp_peers [i ].ucp_conn );
590
+ err = ucp_ep_create (ucx_ctx -> ucp_worker , & ep_params ,
591
+ & ucx_ctx -> ucp_peers [i ].ucp_conn );
554
592
if (UCS_OK != err ) {
555
593
SPML_ERROR ("ucp_ep_create(proc=%d/%d) failed: %s" , i , nprocs ,
556
594
ucs_status_string (err ));
@@ -559,68 +597,55 @@ int mca_spml_ucx_ctx_create(long options, shmem_ctx_t *ctx)
559
597
560
598
for (j = 0 ; j < MCA_MEMHEAP_SEG_COUNT ; j ++ ) {
561
599
mkey = & memheap_map -> mem_segs [j ].mkeys_cache [i ][0 ];
562
- ucx_mkey = & ctx_item -> ctx . ucp_peers [i ].mkeys [j ].key ;
563
- err = ucp_ep_rkey_unpack (ctx_item -> ctx . ucp_peers [i ].ucp_conn ,
600
+ ucx_mkey = & ucx_ctx -> ucp_peers [i ].mkeys [j ].key ;
601
+ err = ucp_ep_rkey_unpack (ucx_ctx -> ucp_peers [i ].ucp_conn ,
564
602
mkey -> u .data ,
565
603
& ucx_mkey -> rkey );
566
604
if (UCS_OK != err ) {
567
605
SPML_UCX_ERROR ("failed to unpack rkey" );
568
606
goto error2 ;
569
607
}
570
- mca_spml_ucx_cache_mkey (& ctx_item -> ctx , mkey , j , i );
608
+ mca_spml_ucx_cache_mkey (ucx_ctx , mkey , j , i );
571
609
}
572
610
}
573
611
574
612
SHMEM_MUTEX_LOCK (mca_spml_ucx .internal_mutex );
575
-
576
- opal_list_append (& (mca_spml_ucx .ctx_list ), & ctx_item -> super );
577
-
613
+ _ctx_add (& mca_spml_ucx .active_array , ucx_ctx );
578
614
SHMEM_MUTEX_UNLOCK (mca_spml_ucx .internal_mutex );
579
615
580
- (* ctx ) = (shmem_ctx_t )(& ctx_item -> ctx );
581
-
616
+ (* ctx ) = (shmem_ctx_t )ucx_ctx ;
582
617
return OSHMEM_SUCCESS ;
583
618
584
619
error2 :
585
620
for (i = 0 ; i < nprocs ; i ++ ) {
586
- if (ctx_item -> ctx . ucp_peers [i ].ucp_conn ) {
587
- ucp_ep_destroy (ctx_item -> ctx . ucp_peers [i ].ucp_conn );
621
+ if (ucx_ctx -> ucp_peers [i ].ucp_conn ) {
622
+ ucp_ep_destroy (ucx_ctx -> ucp_peers [i ].ucp_conn );
588
623
}
589
624
}
590
625
591
- if (ctx_item -> ctx . ucp_peers )
592
- free (ctx_item -> ctx . ucp_peers );
626
+ if (ucx_ctx -> ucp_peers )
627
+ free (ucx_ctx -> ucp_peers );
593
628
594
629
error :
595
- ucp_worker_destroy (ctx_item -> ctx . ucp_worker );
596
- OBJ_RELEASE ( ctx_item );
630
+ ucp_worker_destroy (ucx_ctx -> ucp_worker );
631
+ free ( ucx_ctx );
597
632
rc = OSHMEM_ERR_OUT_OF_RESOURCE ;
598
633
SPML_ERROR ("ctx create FAILED rc=%d" , rc );
599
634
return rc ;
600
635
}
601
636
602
637
void mca_spml_ucx_ctx_destroy (shmem_ctx_t ctx )
603
638
{
604
- mca_spml_ucx_ctx_list_item_t * ctx_item , * next ;
605
- size_t i , j , nprocs = oshmem_num_procs ();
606
-
607
639
MCA_SPML_CALL (quiet (ctx ));
608
640
609
- oshmem_shmem_barrier ();
610
-
611
641
SHMEM_MUTEX_LOCK (mca_spml_ucx .internal_mutex );
642
+ _ctx_remove (& mca_spml_ucx .active_array , (mca_spml_ucx_ctx_t * )ctx );
643
+ _ctx_add (& mca_spml_ucx .idle_array , (mca_spml_ucx_ctx_t * )ctx );
644
+ SHMEM_MUTEX_UNLOCK (mca_spml_ucx .internal_mutex );
612
645
613
- /* delete context object from list */
614
- OPAL_LIST_FOREACH_SAFE (ctx_item , next , & (mca_spml_ucx .ctx_list ),
615
- mca_spml_ucx_ctx_list_item_t ) {
616
- if ((shmem_ctx_t )(& ctx_item -> ctx ) == ctx ) {
617
- opal_list_remove_item (& (mca_spml_ucx .ctx_list ), & ctx_item -> super );
618
- opal_list_append (& (mca_spml_ucx .idle_ctx_list ), & ctx_item -> super );
619
- break ;
620
- }
646
+ if (!mca_spml_ucx .active_array .ctxs_count ) {
647
+ opal_progress_unregister (spml_ucx_ctx_progress );
621
648
}
622
-
623
- SHMEM_MUTEX_UNLOCK (mca_spml_ucx .internal_mutex );
624
649
}
625
650
626
651
int mca_spml_ucx_get (shmem_ctx_t ctx , void * src_addr , size_t size , void * dst_addr , int src )
0 commit comments