diff --git a/projects/rccl/CHANGELOG.md b/projects/rccl/CHANGELOG.md index 745717bf29..5eb92eb485 100644 --- a/projects/rccl/CHANGELOG.md +++ b/projects/rccl/CHANGELOG.md @@ -2,6 +2,12 @@ Full documentation for RCCL is available at [https://rccl.readthedocs.io](https://rccl.readthedocs.io) +## Unreleased + +### Added + +* `RCCL_SOCKET_REUSEADDR` and `RCCL_SOCKET_LINGER` environment parameters + ## RCCL 2.21.5 for ROCm 6.3.1 ### Added diff --git a/projects/rccl/src/misc/socket.cc b/projects/rccl/src/misc/socket.cc index 4f87c1807f..2c26440be4 100644 --- a/projects/rccl/src/misc/socket.cc +++ b/projects/rccl/src/misc/socket.cc @@ -15,6 +15,9 @@ #include #include "param.h" +RCCL_PARAM(SocketReuseAddr, "SOCKET_REUSEADDR", 0); +RCCL_PARAM(SocketLinger, "SOCKET_LINGER", -1); + static ncclResult_t socketProgressOpt(int op, struct ncclSocket* sock, void* ptr, int size, int* offset, int block, int* closed) { int bytes = 0; *closed = 0; @@ -727,6 +730,17 @@ ncclResult_t ncclSocketInit(struct ncclSocket* sock, union ncclSocketAddress* ad ret = ncclSystemError; goto fail; } + + // [RCCL] Runtime socket options + if (rcclParamSocketReuseAddr()) { + int opt = 1; + SYSCHECKGOTO(setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)), ret, fail); + } + int lingerParam = (int)rcclParamSocketLinger(); + if (lingerParam > -1) { + linger linger_opt = { 1, lingerParam }; + SYSCHECKGOTO(setsockopt(sock->fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)), ret, fail); + } } else { memset(&sock->addr, 0, sizeof(union ncclSocketAddress)); }