@@ -567,74 +567,61 @@ flagcxResult_t flagcxHeteroRmaProxyStart(flagcxHeteroComm_t comm) {
567567 flagcxIntruQueueConstruct (&proxy->inProgressQueues [p]);
568568 }
569569
570- // Allocate GPU-visible memory for doneSeqsDev (stream-based synchronization).
571- // Use GDR to get CPU-mappable device memory.
570+ // Allocate device memory for stream-based synchronization.
572571 proxy->doneSeqsDev = NULL ;
573572 proxy->doneSeqsCpu = NULL ;
574- proxy->doneSeqsGdrHandle = NULL ;
575- flagcxResult_t memRes =
576- deviceAdaptor->memHandleInit (comm->cudaDev , &proxy->doneSeqsGdrHandle );
577- if (memRes == flagcxSuccess && proxy->doneSeqsGdrHandle != NULL ) {
578- memRes = deviceAdaptor->gdrMemAlloc ((void **)&proxy->doneSeqsDev ,
579- nRanks * sizeof (uint64_t ),
580- proxy->doneSeqsGdrHandle );
581- if (memRes == flagcxSuccess) {
582- // Map device memory to CPU address space for progress thread writes
583- memRes = deviceAdaptor->gdrPtrMmap ((void **)&proxy->doneSeqsCpu ,
584- proxy->doneSeqsDev ,
585- nRanks * sizeof (uint64_t ));
586- if (memRes == flagcxSuccess) {
587- // Zero-initialize doneSeqsDev
588- memset ((void *)proxy->doneSeqsCpu , 0 , nRanks * sizeof (uint64_t ));
589- } else {
590- WARN (" flagcxHeteroRmaProxyStart: gdrPtrMmap failed, stream sync "
591- " unavailable" );
592- deviceAdaptor->gdrMemFree (proxy->doneSeqsDev , proxy->doneSeqsGdrHandle );
593- proxy->doneSeqsDev = NULL ;
594- }
595- } else {
596- WARN (" flagcxHeteroRmaProxyStart: gdrMemAlloc failed, stream sync "
597- " unavailable" );
598- }
599- } else {
600- WARN (" flagcxHeteroRmaProxyStart: memHandleInit failed, stream sync "
601- " unavailable" );
602- }
603-
604- // Allocate GPU-visible memory for readySeqsDev (stream→proxy handshake).
605- // Same pattern as doneSeqs: GDR-mapped device memory for CPU polling.
606573 proxy->readySeqsDev = NULL ;
607574 proxy->readySeqsCpu = NULL ;
608- proxy->readySeqsGdrHandle = NULL ;
609- memRes =
610- deviceAdaptor->memHandleInit (comm->cudaDev , &proxy->readySeqsGdrHandle );
611- if (memRes == flagcxSuccess && proxy->readySeqsGdrHandle != NULL ) {
575+ if (deviceAdaptor->gdrMemAlloc != NULL ) {
576+ flagcxResult_t memRes = deviceAdaptor->gdrMemAlloc (
577+ (void **)&proxy->doneSeqsDev , nRanks * sizeof (uint64_t ), NULL );
578+ if (memRes != flagcxSuccess)
579+ proxy->doneSeqsDev = NULL ;
612580 memRes = deviceAdaptor->gdrMemAlloc ((void **)&proxy->readySeqsDev ,
613- nRanks * sizeof (uint64_t ),
614- proxy->readySeqsGdrHandle );
615- if (memRes == flagcxSuccess) {
616- memRes = deviceAdaptor->gdrPtrMmap ((void **)&proxy->readySeqsCpu ,
617- proxy->readySeqsDev ,
618- nRanks * sizeof (uint64_t ));
619- if (memRes == flagcxSuccess) {
620- memset ((void *)proxy->readySeqsCpu , 0 , nRanks * sizeof (uint64_t ));
621- } else {
622- WARN (" flagcxHeteroRmaProxyStart: gdrPtrMmap for readySeqs failed" );
623- deviceAdaptor->gdrMemFree (proxy->readySeqsDev ,
624- proxy->readySeqsGdrHandle );
625- proxy->readySeqsDev = NULL ;
626- }
627- } else {
628- WARN (" flagcxHeteroRmaProxyStart: gdrMemAlloc for readySeqs failed" );
581+ nRanks * sizeof (uint64_t ), NULL );
582+ if (memRes != flagcxSuccess)
583+ proxy->readySeqsDev = NULL ;
584+ }
585+
586+ // Map device memory to CPU if adaptor supports gdrPtrMmap (e.g. kunlunxin).
587+ // This gives the proxy thread direct CPU access to the device buffers.
588+ if (deviceAdaptor->gdrPtrMmap != NULL ) {
589+ if (proxy->doneSeqsDev != NULL ) {
590+ if (deviceAdaptor->gdrPtrMmap ((void **)&proxy->doneSeqsCpu ,
591+ proxy->doneSeqsDev ,
592+ nRanks * sizeof (uint64_t )) != flagcxSuccess)
593+ proxy->doneSeqsCpu = NULL ;
594+ }
595+ if (proxy->readySeqsDev != NULL ) {
596+ if (deviceAdaptor->gdrPtrMmap ((void **)&proxy->readySeqsCpu ,
597+ proxy->readySeqsDev ,
598+ nRanks * sizeof (uint64_t )) != flagcxSuccess)
599+ proxy->readySeqsCpu = NULL ;
629600 }
630- } else {
631- WARN (" flagcxHeteroRmaProxyStart: memHandleInit for readySeqs failed" );
632601 }
633602
634- // Determine sync method: STREAM_OPS if env enabled AND GDR buffers available
603+ // If no CPU mapping available, allocate separate host memory for HOST_FUNC.
604+ if (proxy->doneSeqsCpu == NULL )
605+ proxy->doneSeqsCpu = (volatile uint64_t *)calloc (nRanks, sizeof (uint64_t ));
606+ if (proxy->readySeqsCpu == NULL )
607+ proxy->readySeqsCpu = (volatile uint64_t *)calloc (nRanks, sizeof (uint64_t ));
608+
609+ // Zero-init device buffers
610+ if (proxy->doneSeqsDev != NULL )
611+ deviceAdaptor->deviceMemset (proxy->doneSeqsDev , 0 ,
612+ nRanks * sizeof (uint64_t ), flagcxMemDevice,
613+ NULL );
614+ if (proxy->readySeqsDev != NULL )
615+ deviceAdaptor->deviceMemset (proxy->readySeqsDev , 0 ,
616+ nRanks * sizeof (uint64_t ), flagcxMemDevice,
617+ NULL );
618+
619+ // STREAM_OPS requires: device buffers AND CPU mapping of those same buffers
620+ // (so proxy thread can write doneSeqsDev from CPU). Only possible when
621+ // gdrPtrMmap is available (doneSeqsCpu points into doneSeqsDev).
635622 proxy->useStreamOps =
636- (flagcxParamRmaStreamOps () == 1 && proxy->readySeqsDev != NULL &&
637- proxy->doneSeqsDev != NULL )
623+ (flagcxParamRmaStreamOps () == 1 && proxy->doneSeqsDev != NULL &&
624+ proxy->readySeqsDev != NULL && deviceAdaptor-> gdrPtrMmap != NULL )
638625 ? 1
639626 : 0 ;
640627 INFO (FLAGCX_INIT , " RMA proxy sync method: %s" ,
@@ -646,28 +633,21 @@ flagcxResult_t flagcxHeteroRmaProxyStart(flagcxHeteroComm_t comm) {
646633 if (pthread_create (&proxy->thread , NULL , flagcxRmaProxyProgressThread,
647634 proxy) != 0 ) {
648635 WARN (" flagcxHeteroRmaProxyStart: pthread_create failed" );
649- // Free GDR memory for stream-based sync (doneSeqs)
650- if (proxy->doneSeqsCpu != NULL ) {
651- deviceAdaptor->gdrPtrMunmap ((void *)proxy->doneSeqsCpu ,
652- nRanks * sizeof (uint64_t ));
653- }
654- if (proxy->doneSeqsDev != NULL && proxy->doneSeqsGdrHandle != NULL ) {
655- deviceAdaptor->gdrMemFree (proxy->doneSeqsDev , proxy->doneSeqsGdrHandle );
656- }
657- if (proxy->doneSeqsGdrHandle != NULL ) {
658- deviceAdaptor->memHandleDestroy (comm->cudaDev , proxy->doneSeqsGdrHandle );
659- }
660- // Free GDR memory for readySeqs
661- if (proxy->readySeqsCpu != NULL ) {
662- deviceAdaptor->gdrPtrMunmap ((void *)proxy->readySeqsCpu ,
663- nRanks * sizeof (uint64_t ));
664- }
665- if (proxy->readySeqsDev != NULL && proxy->readySeqsGdrHandle != NULL ) {
666- deviceAdaptor->gdrMemFree (proxy->readySeqsDev , proxy->readySeqsGdrHandle );
667- }
668- if (proxy->readySeqsGdrHandle != NULL ) {
669- deviceAdaptor->memHandleDestroy (comm->cudaDev , proxy->readySeqsGdrHandle );
636+ if (deviceAdaptor->gdrPtrMunmap != NULL ) {
637+ if (proxy->doneSeqsCpu != NULL )
638+ deviceAdaptor->gdrPtrMunmap ((void *)proxy->doneSeqsCpu ,
639+ nRanks * sizeof (uint64_t ));
640+ if (proxy->readySeqsCpu != NULL )
641+ deviceAdaptor->gdrPtrMunmap ((void *)proxy->readySeqsCpu ,
642+ nRanks * sizeof (uint64_t ));
643+ } else {
644+ free ((void *)proxy->doneSeqsCpu );
645+ free ((void *)proxy->readySeqsCpu );
670646 }
647+ if (proxy->doneSeqsDev != NULL )
648+ deviceAdaptor->gdrMemFree (proxy->doneSeqsDev , NULL );
649+ if (proxy->readySeqsDev != NULL )
650+ deviceAdaptor->gdrMemFree (proxy->readySeqsDev , NULL );
671651 for (int p = 0 ; p < nRanks; p++)
672652 pthread_mutex_destroy (&proxy->peerProducerMutexes [p]);
673653 free (proxy->circularBuffers );
@@ -702,29 +682,24 @@ flagcxResult_t flagcxHeteroRmaProxyStop(flagcxHeteroComm_t comm) {
702682 for (int p = 0 ; p < proxy->nRanks ; p++)
703683 pthread_mutex_destroy (&proxy->peerProducerMutexes [p]);
704684
705- // Free GDR memory for stream-based sync (doneSeqs)
706- if (proxy->doneSeqsCpu != NULL ) {
707- deviceAdaptor->gdrPtrMunmap ((void *)proxy->doneSeqsCpu ,
708- proxy->nRanks * sizeof (uint64_t ));
709- }
710- if (proxy->doneSeqsDev != NULL && proxy->doneSeqsGdrHandle != NULL ) {
711- deviceAdaptor->gdrMemFree (proxy->doneSeqsDev , proxy->doneSeqsGdrHandle );
712- }
713- if (proxy->doneSeqsGdrHandle != NULL ) {
714- deviceAdaptor->memHandleDestroy (comm->cudaDev , proxy->doneSeqsGdrHandle );
685+ // Free CPU mappings / host memory
686+ if (deviceAdaptor->gdrPtrMunmap != NULL ) {
687+ if (proxy->doneSeqsCpu != NULL )
688+ deviceAdaptor->gdrPtrMunmap ((void *)proxy->doneSeqsCpu ,
689+ proxy->nRanks * sizeof (uint64_t ));
690+ if (proxy->readySeqsCpu != NULL )
691+ deviceAdaptor->gdrPtrMunmap ((void *)proxy->readySeqsCpu ,
692+ proxy->nRanks * sizeof (uint64_t ));
693+ } else {
694+ free ((void *)proxy->doneSeqsCpu );
695+ free ((void *)proxy->readySeqsCpu );
715696 }
716697
717- // Free GDR memory for readySeqs
718- if (proxy->readySeqsCpu != NULL ) {
719- deviceAdaptor->gdrPtrMunmap ((void *)proxy->readySeqsCpu ,
720- proxy->nRanks * sizeof (uint64_t ));
721- }
722- if (proxy->readySeqsDev != NULL && proxy->readySeqsGdrHandle != NULL ) {
723- deviceAdaptor->gdrMemFree (proxy->readySeqsDev , proxy->readySeqsGdrHandle );
724- }
725- if (proxy->readySeqsGdrHandle != NULL ) {
726- deviceAdaptor->memHandleDestroy (comm->cudaDev , proxy->readySeqsGdrHandle );
727- }
698+ // Free device memory
699+ if (proxy->doneSeqsDev != NULL )
700+ deviceAdaptor->gdrMemFree (proxy->doneSeqsDev , NULL );
701+ if (proxy->readySeqsDev != NULL )
702+ deviceAdaptor->gdrMemFree (proxy->readySeqsDev , NULL );
728703
729704 free (proxy->circularBuffers );
730705 free ((void *)proxy->pis );
0 commit comments