Files
rocm-systems/src/include/info.h
T

120 lines
3.2 KiB
C
Raw Normal View History

2019-03-14 19:39:20 -07:00
/*************************************************************************
2022-01-07 06:39:55 -08:00
* Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved.
2019-03-14 19:39:20 -07:00
*
* See LICENSE.txt for license information
************************************************************************/
#ifndef NCCL_INFO_H_
#define NCCL_INFO_H_
#include "nccl.h"
2020-05-12 14:40:18 -07:00
#include "devcomm.h"
2021-09-08 13:56:25 -07:00
#include "collectives.h"
2022-05-24 02:02:31 -07:00
#include "core.h"
#include "utils.h"
#include "strongstream.h"
2019-03-14 19:39:20 -07:00
2022-01-07 06:39:55 -08:00
typedef enum : uint8_t {
2019-03-14 19:39:20 -07:00
ncclPatternRing,
ncclPatternRingTwice,
ncclPatternPipelineFrom,
ncclPatternPipelineTo,
ncclPatternTreeUp,
ncclPatternTreeDown,
2020-01-16 16:02:42 -08:00
ncclPatternTreeUpDown,
2022-08-18 02:53:17 -07:00
ncclPatternCollnetChain,
ncclPatternCollnetDirect,
2022-01-07 06:39:55 -08:00
ncclPatternSend,
ncclPatternRecv
2019-03-14 19:39:20 -07:00
} ncclPattern_t;
// Used to pass NCCL call information between functions
struct ncclInfo {
2019-11-19 14:57:39 -08:00
ncclFunc_t coll;
2019-03-14 19:39:20 -07:00
const char* opName;
// NCCL Coll Args
const void* sendbuff;
void* recvbuff;
size_t count;
ncclDataType_t datatype;
ncclRedOp_t op;
2022-01-07 06:39:55 -08:00
int root; // peer for p2p operations
2019-03-14 19:39:20 -07:00
ncclComm_t comm;
cudaStream_t stream;
// Algorithm details
int chunkSteps;
int sliceSteps;
// Computed later
2021-09-08 13:56:25 -07:00
ncclDevRedOpFull opFull;
2019-11-19 14:57:39 -08:00
int algorithm;
int protocol;
2019-03-14 19:39:20 -07:00
ncclPattern_t pattern;
2019-11-19 14:57:39 -08:00
int nChannels;
int nThreads;
2019-03-14 19:39:20 -07:00
size_t nBytes;
int nstepsPerLoop;
int nchunksPerLoop;
2022-01-07 06:39:55 -08:00
int chunkSize;
2020-05-12 14:40:18 -07:00
int channelId;
2019-03-14 19:39:20 -07:00
};
2022-05-24 02:02:31 -07:00
inline ncclResult_t ncclInfoSetDerived(struct ncclInfo* info, int nRanks) {
info->nBytes = info->count * ncclTypeSize(info->datatype);
if (info->coll == ncclFuncAllGather || info->coll == ncclFuncBroadcast) {
info->count = info->nBytes;
info->datatype = ncclInt8;
}
if (info->coll == ncclFuncAllGather || info->coll == ncclFuncReduceScatter) info->nBytes *= nRanks; // count is per rank
return ncclSuccess;
}
struct ncclTaskColl {
struct ncclTaskColl* next;
ncclFunc_t func;
void const* sendbuff;
void* recvbuff;
size_t count;
int root;
ncclDataType_t datatype;
ncclDevRedOpFull op;
int chunkSteps, sliceSteps;
};
struct ncclTaskP2p {
ncclTaskP2p *next;
void *buff;
size_t bytes;
// Stateful chunk index. If a p2p gets "cut" over two plans this keeps track
// of where it left off.
int chunk;
};
struct ncclCudaStreamList {
struct ncclCudaStreamList *next;
cudaStream_t stream;
};
struct ncclTasks {
struct Peer {
bool sendSeen, recvSeen;
struct ncclIntruQueue<struct ncclTaskP2p, &ncclTaskP2p::next> sendQueue;
struct ncclIntruQueue<struct ncclTaskP2p, &ncclTaskP2p::next> recvQueue;
};
struct ncclIntruQueue<ncclTaskColl, &ncclTaskColl::next> collQueue;
size_t collBytesTotal;
struct Peer* peers/*[nRanks]*/;
int *p2pSendOrder/*[nRanks]*/, *p2pRecvOrder/*[nRanks]*/;
int nTasksColl, nTasksP2p;
// The list of user streams aggregated over all tasks present.
struct ncclCudaStreamList* streams;
// The most recent user stream. Ignored if streams==nullptr
cudaStream_t streamRecent;
// The graph capturing all user streams or invalid if none. Thus we restrict the
// user that all streams must be captured in the same graph or not captured
// at all. Technically we could probably relax this, but that would mean
// collecting a different `ncclTasks` per graph and one for non-graph.
struct ncclCudaGraph capturingGraph;
};
2019-03-14 19:39:20 -07:00
#endif