Fichiers
rocm-systems/src/include/socket.h
T

99 lignes
4.0 KiB
C
Brut Vue normale Historique

2018-09-24 16:06:59 -07:00
/*************************************************************************
2022-01-07 06:39:55 -08:00
* Copyright (c) 2016-2022, NVIDIA CORPORATION. All rights reserved.
2018-09-24 16:06:59 -07:00
*
* See LICENSE.txt for license information
************************************************************************/
#ifndef NCCL_SOCKET_H_
#define NCCL_SOCKET_H_
2022-01-07 06:39:55 -08:00
#include "nccl.h"
2018-09-24 16:06:59 -07:00
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <netdb.h>
2022-01-07 06:39:55 -08:00
#include <fcntl.h>
#include <poll.h>
2018-09-24 16:06:59 -07:00
2018-10-24 14:44:59 -07:00
#define MAX_IFS 16
2018-09-24 16:06:59 -07:00
#define MAX_IF_NAME_SIZE 16
2019-03-14 19:39:20 -07:00
#define SLEEP_INT 1000 // connection retry sleep interval in usec
#define RETRY_REFUSED_TIMES 2e4 // connection refused retry times before reporting a timeout (20 sec)
#define RETRY_TIMEDOUT_TIMES 3 // connection timed out retry times (each one can take 20s)
2020-09-04 14:35:05 -07:00
#define SOCKET_NAME_MAXLEN (NI_MAXHOST+NI_MAXSERV)
2022-11-29 04:27:46 -08:00
#define NCCL_SOCKET_MAGIC 0x564ab9f2fc4b9d6cULL
2018-09-24 16:06:59 -07:00
/* Common socket address storage structure for IPv4/IPv6 */
2022-01-07 06:39:55 -08:00
union ncclSocketAddress {
2018-09-24 16:06:59 -07:00
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
};
2022-01-07 06:39:55 -08:00
enum ncclSocketState {
2022-11-29 04:27:46 -08:00
ncclSocketStateNone = 0,
ncclSocketStateInitialized = 1,
ncclSocketStateAccepting = 2,
ncclSocketStateAccepted = 3,
ncclSocketStateConnecting = 4,
ncclSocketStateConnectPolling = 5,
ncclSocketStateConnected = 6,
ncclSocketStateReady = 7,
ncclSocketStateClosed = 8,
ncclSocketStateError = 9,
ncclSocketStateNum = 10
};
enum ncclSocketType {
ncclSocketTypeUnknown = 0,
ncclSocketTypeBootstrap = 1,
ncclSocketTypeProxy = 2,
ncclSocketTypeNetSocket = 3,
ncclSocketTypeNetIb = 4
};
2022-01-07 06:39:55 -08:00
struct ncclSocket {
int fd;
2022-11-29 04:27:46 -08:00
int acceptFd;
int timedOutRetries;
int refusedRetries;
2022-01-07 06:39:55 -08:00
union ncclSocketAddress addr;
volatile uint32_t* abortFlag;
int asyncFlag;
enum ncclSocketState state;
2022-11-29 04:27:46 -08:00
int salen;
uint64_t magic;
enum ncclSocketType type;
2022-01-07 06:39:55 -08:00
};
2018-09-24 16:06:59 -07:00
2022-03-30 02:25:49 -07:00
const char *ncclSocketToString(union ncclSocketAddress *addr, char *buf, const int numericHostForm = 1);
2022-11-29 04:27:46 -08:00
ncclResult_t ncclSocketGetAddrFromString(union ncclSocketAddress* ua, const char* ip_port_pair);
2022-01-07 06:39:55 -08:00
int ncclFindInterfaceMatchSubnet(char* ifNames, union ncclSocketAddress* localAddrs, union ncclSocketAddress* remoteAddr, int ifNameMaxSize, int maxIfs);
int ncclFindInterfaces(char* ifNames, union ncclSocketAddress *ifAddrs, int ifNameMaxSize, int maxIfs);
2022-11-29 04:27:46 -08:00
// Initialize a socket
ncclResult_t ncclSocketInit(struct ncclSocket* sock, union ncclSocketAddress* addr = NULL, uint64_t magic = NCCL_SOCKET_MAGIC, enum ncclSocketType type = ncclSocketTypeUnknown, volatile uint32_t* abortFlag = NULL, int asyncFlag = 0);
2022-01-07 06:39:55 -08:00
// Create a listening socket. sock->addr can be pre-filled with IP & port info. sock->fd is set after a successful call
ncclResult_t ncclSocketListen(struct ncclSocket* sock);
2022-11-29 04:27:46 -08:00
ncclResult_t ncclSocketGetAddr(struct ncclSocket* sock, union ncclSocketAddress* addr);
2022-01-07 06:39:55 -08:00
// Connect to sock->addr. sock->fd is set after a successful call.
ncclResult_t ncclSocketConnect(struct ncclSocket* sock);
// Return socket connection state.
2022-11-29 04:27:46 -08:00
ncclResult_t ncclSocketReady(struct ncclSocket* sock, int *running);
// Accept an incoming connection from listenSock->fd and keep the file descriptor in sock->fd, with the remote side IP/port in sock->addr.
ncclResult_t ncclSocketAccept(struct ncclSocket* sock, struct ncclSocket* ulistenSock);
ncclResult_t ncclSocketGetFd(struct ncclSocket* sock, int* fd);
ncclResult_t ncclSocketSetFd(int fd, struct ncclSocket* sock);
2018-09-24 16:06:59 -07:00
2018-11-19 17:43:50 -08:00
#define NCCL_SOCKET_SEND 0
#define NCCL_SOCKET_RECV 1
2018-09-24 16:06:59 -07:00
2022-01-07 06:39:55 -08:00
ncclResult_t ncclSocketProgress(int op, struct ncclSocket* sock, void* ptr, int size, int* offset);
ncclResult_t ncclSocketWait(int op, struct ncclSocket* sock, void* ptr, int size, int* offset);
ncclResult_t ncclSocketSend(struct ncclSocket* sock, void* ptr, int size);
ncclResult_t ncclSocketRecv(struct ncclSocket* sock, void* ptr, int size);
2024-03-26 06:08:55 -07:00
ncclResult_t ncclSocketSendRecv(struct ncclSocket* sendSock, void* sendPtr, int sendSize, struct ncclSocket* recvSock, void* recvPtr, int recvSize);
2023-02-27 02:48:21 -08:00
ncclResult_t ncclSocketTryRecv(struct ncclSocket* sock, void* ptr, int size, int* closed, bool blocking);
2022-11-29 04:27:46 -08:00
ncclResult_t ncclSocketClose(struct ncclSocket* sock);
2018-09-24 16:06:59 -07:00
#endif