33
44#include " registered_memory.hpp"
55
6+ #include < sys/syscall.h>
7+ #include < unistd.h>
8+
69#include < algorithm>
710#include < mscclpp/gpu_utils.hpp>
811
2427 } while (false )
2528
2629namespace {
27- CUmemAllocationHandleType getNvlsCompatibleMemHandleType () {
30+ CUmemAllocationHandleType getNvlsMemHandleType () {
2831#if (CUDA_NVLS_SUPPORTED)
29- return CU_MEM_HANDLE_TYPE_FABRIC;
32+ if (mscclpp::detail::nvlsCompatibleMemHandleType & CU_MEM_HANDLE_TYPE_FABRIC) {
33+ return CU_MEM_HANDLE_TYPE_FABRIC;
34+ } else {
35+ return CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR;
36+ }
3037#else
3138 throw mscclpp::Error (" Only support GPU with NVLS support" , mscclpp::ErrorCode::InvalidUsage);
3239#endif
@@ -72,8 +79,16 @@ RegisteredMemory::Impl::Impl(void* data, size_t size, TransportFlags transports,
7279 if (this ->isCuMemMapAlloc ) {
7380 CUmemGenericAllocationHandle handle;
7481 MSCCLPP_CUTHROW (cuMemRetainAllocationHandle (&handle, baseDataPtr));
75- MSCCLPP_CUTHROW (
76- cuMemExportToShareableHandle (transportInfo.shareableHandle , handle, getNvlsCompatibleMemHandleType (), 0 ));
82+ if (getNvlsMemHandleType () == CU_MEM_HANDLE_TYPE_FABRIC) {
83+ MSCCLPP_CUTHROW (cuMemExportToShareableHandle (transportInfo.shareableHandle , handle, getNvlsMemHandleType (), 0 ));
84+ } else {
85+ transportInfo.rootPid = getpid ();
86+ if (transportInfo.rootPid < 0 ) {
87+ throw mscclpp::SysError (" getpid() failed" , errno);
88+ }
89+ MSCCLPP_CUTHROW (cuMemExportToShareableHandle (&transportInfo.fileDesc , handle, getNvlsMemHandleType (), 0 ));
90+ this ->fileDesc = transportInfo.fileDesc ;
91+ }
7792 transportInfo.offsetFromBase = (char *)data - (char *)baseDataPtr;
7893 MSCCLPP_CUTHROW (cuMemRelease (handle));
7994 } else {
@@ -138,8 +153,13 @@ MSCCLPP_API_CPP std::vector<char> RegisteredMemory::serialize() {
138153 std::copy_n (reinterpret_cast <char *>(&entry.transport ), sizeof (entry.transport ), std::back_inserter (result));
139154 if (entry.transport == Transport::CudaIpc) {
140155 if (pimpl_->isCuMemMapAlloc ) {
141- std::copy_n (reinterpret_cast <char *>(&entry.shareableHandle ), sizeof (entry.shareableHandle ),
142- std::back_inserter (result));
156+ if (getNvlsMemHandleType () == CU_MEM_HANDLE_TYPE_FABRIC) {
157+ std::copy_n (reinterpret_cast <char *>(&entry.shareableHandle ), sizeof (entry.shareableHandle ),
158+ std::back_inserter (result));
159+ } else {
160+ std::copy_n (reinterpret_cast <char *>(&entry.rootPid ), sizeof (entry.rootPid ), std::back_inserter (result));
161+ std::copy_n (reinterpret_cast <char *>(&entry.fileDesc ), sizeof (entry.fileDesc ), std::back_inserter (result));
162+ }
143163 std::copy_n (reinterpret_cast <char *>(&entry.offsetFromBase ), sizeof (entry.offsetFromBase ),
144164 std::back_inserter (result));
145165 } else {
@@ -184,8 +204,16 @@ RegisteredMemory::Impl::Impl(const std::vector<char>& serialization) {
184204 it += sizeof (transportInfo.transport );
185205 if (transportInfo.transport == Transport::CudaIpc) {
186206 if (this ->isCuMemMapAlloc ) {
187- std::copy_n (it, sizeof (transportInfo.shareableHandle ), reinterpret_cast <char *>(&transportInfo.shareableHandle ));
188- it += sizeof (transportInfo.shareableHandle );
207+ if (getNvlsMemHandleType () == CU_MEM_HANDLE_TYPE_FABRIC) {
208+ std::copy_n (it, sizeof (transportInfo.shareableHandle ),
209+ reinterpret_cast <char *>(&transportInfo.shareableHandle ));
210+ it += sizeof (transportInfo.shareableHandle );
211+ } else {
212+ std::copy_n (it, sizeof (transportInfo.rootPid ), reinterpret_cast <char *>(&transportInfo.rootPid ));
213+ it += sizeof (transportInfo.rootPid );
214+ std::copy_n (it, sizeof (transportInfo.fileDesc ), reinterpret_cast <char *>(&transportInfo.fileDesc ));
215+ it += sizeof (transportInfo.fileDesc );
216+ }
189217 std::copy_n (it, sizeof (transportInfo.offsetFromBase ), reinterpret_cast <char *>(&transportInfo.offsetFromBase ));
190218 it += sizeof (transportInfo.offsetFromBase );
191219 } else {
@@ -220,7 +248,23 @@ RegisteredMemory::Impl::Impl(const std::vector<char>& serialization) {
220248 if (this ->isCuMemMapAlloc ) {
221249#if (CUDA_NVLS_SUPPORTED)
222250 CUmemGenericAllocationHandle handle;
223- MSCCLPP_CUTHROW (cuMemImportFromShareableHandle (&handle, entry.shareableHandle , getNvlsCompatibleMemHandleType ()));
251+ if (getNvlsMemHandleType () == CU_MEM_HANDLE_TYPE_FABRIC) {
252+ MSCCLPP_CUTHROW (cuMemImportFromShareableHandle (&handle, entry.shareableHandle , getNvlsMemHandleType ()));
253+ } else {
254+ int rootPidFd = syscall (SYS_pidfd_open, entry.rootPid , 0 );
255+ if (rootPidFd < 0 ) {
256+ throw mscclpp::SysError (" pidfd_open() failed" , errno);
257+ }
258+ int fd = syscall (SYS_pidfd_getfd, rootPidFd, entry.fileDesc , 0 );
259+ if (fd < 0 ) {
260+ throw mscclpp::SysError (" pidfd_getfd() failed" , errno);
261+ }
262+ INFO (MSCCLPP_P2P, " Get file descriptor %d from pidfd %d on peer 0x%lx" , fd, rootPidFd, hostHash);
263+ MSCCLPP_CUTHROW (cuMemImportFromShareableHandle (&handle, reinterpret_cast <void *>(fd),
264+ CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR));
265+ close (rootPidFd);
266+ close (fd);
267+ }
224268 size_t minGran = detail::getMulticastGranularity (size, CU_MULTICAST_GRANULARITY_MINIMUM);
225269 size_t recommendedGran = detail::getMulticastGranularity (size, CU_MULTICAST_GRANULARITY_RECOMMENDED);
226270 size_t size = (this ->size + recommendedGran - 1 ) / recommendedGran * recommendedGran;
@@ -257,6 +301,9 @@ RegisteredMemory::Impl::~Impl() {
257301 MSCCLPP_CULOG_WARN (cuMemUnmap ((CUdeviceptr)base, size));
258302 MSCCLPP_CULOG_WARN (cuMemRelease (handle));
259303 MSCCLPP_CULOG_WARN (cuMemAddressFree ((CUdeviceptr)base, size));
304+ if (getNvlsMemHandleType () == CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR && fileDesc >= 0 ) {
305+ close (fileDesc);
306+ }
260307 } else {
261308 cudaError_t err = cudaIpcCloseMemHandle (base);
262309 if (err != cudaSuccess) {
@@ -266,6 +313,7 @@ RegisteredMemory::Impl::~Impl() {
266313 }
267314 }
268315 data = nullptr ;
316+ fileDesc = -1 ;
269317 }
270318}
271319
0 commit comments