forked from NVIDIA/nccl
-
Notifications
You must be signed in to change notification settings - Fork 0
データ構造
Osamu Ishimura edited this page Aug 3, 2019
·
15 revisions
src/nccl.h.inで
/* Opaque handle to communicator */
typedef struct ncclComm* ncclComm_t;
と定義されており、実体はncclComm構造体のポインタ。
src/include/comm.hに定義されている
struct ncclComm {
struct ncclChannel channels[MAXCHANNELS];
struct ncclPeerInfo* peerInfo;
void* bootstrap;
int rank; // my rank in the communicator
int nRanks; // number of GPUs in communicator
int cudaDev; // my cuda device index
int nvmlDev; // my NVML device number
enum { GROUP, PARALLEL } launchMode;
cudaStream_t userStream;
bool userStreamSet;
cudaEvent_t doneEvent;
bool checkPointers;
// Counter to make sure collectives match (needed for bcast/reduce
// where syncs are not symmetric).
uint64_t opCount;
// Channels for collectives
int nChannels;
int nThreads;
// Low-latency algorithm threshold
ssize_t llThreshold;
ssize_t threadThreshold;
// Tree algorithm threshold
ssize_t treeThreshold;
// An internal CUDA stream for NCCL kernel CGMD launches
int groupCudaStream;
cudaStream_t groupStream;
// Whether there has been a fatal error in this communicator.
ncclResult_t fatalError;
// Error reported by GPU
volatile ncclDevError_t* fatalDevError;
// Flag to ask NCCL kernels to abort
volatile uint32_t *abortFlag;
// Device side of the communicator
struct ncclDevComm *devComm;
// Host copy of the devComm (to free CUDA allocs)
struct ncclDevComm hostDevComm;
// Intra-process sync
int intraRank;
int intraRanks;
int* intraBarrier;
int intraPhase;
// Storage for deferred intra-process launch
struct cudaLaunchParams * intraParams;
struct cudaLaunchParams *myParams;
int* intraCudaDevs;
int* intraCGMode; // Whether we can use CUDA9 CGMD or not
int* intraCC; // Only to check all have the same ComputeCap and disable CGMode if not
struct ncclColl args;
void* argsptr;
// Global proxy thread
pthread_t proxyThread;
struct ncclProxyState proxyState;
};
なお、MAXCHANNELSは16。
当構造体で使われている非標準型は次の通り
- NCCL関連
- ncclChannel構造体
- ncclPeerInfo構造体
- launchMode型: グループモードと並列モードの二つ。違いについては後記。
- ncclResult_t型
- ncclDevComm構造体
- ncclColl構造体
- ncclProxyState構造体
- Cuda関連
- cudaStream_t: Cuda Streamの型。説明略
- cudaEvent_t: Cuda Eventの型。たぶん時間測定用?。説明略。
- cudaLaunchParams構造体: Cudaを起動するための変数群。定義はsrc/include/comm.hの中。説明略。
src/include/devcomm.hに定義されている。
struct ncclDevComm {
int rank;
int nRanks;
// Flag to ask NCCL kernels to abort
volatile uint32_t *abortFlag;
volatile ncclDevError_t *fatalDevError;
// Channels, device side
struct ncclChannel* channels;
};
当構造体で使われている非標準型は次の通り
src/include/devcomm.hに定義されている。
struct ncclChannel {
union {
struct {
struct ncclRing ring;
struct ncclTree tree;
int id;
int nthreads;
int buffSize;
// Communication structures
struct ncclPeer* peers;
struct ncclPeer* devPeers;
// Operation list for aggregation
struct ncclColl* collectives;
struct ncclColl* devCollectives;
int collStart;
int collCount;
int collFifoHead; // Only used by GPU
int collFifoTail; // Only used by CPU
};
int data[0x80];
};
};
当構造体で使われている非標準型は次の通り
src/include/transport.hに定義されている。
struct ncclPeerInfo {
int rank;
int cudaDev;
int nvmlDev;
uint64_t hostHash;
uint64_t pidHash;
char busId[NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE];
};
src/include/transport.hに定義されている。
struct ncclProxyState {
pthread_cond_t cond;
pthread_mutex_t mutex;
bool stop;
struct ncclProxyArgs* ops;
struct ncclProxyArgs* pool;
struct ncclProxyPool* pools;
};
当構造体で使われている非標準型は次の通り
src/include/transport.hに定義されている。
struct ncclProxyArgs {
proxyProgressFunc_t progress;
struct ncclChannel* channel;
struct ncclConnector* connector;
int sliceSteps;
int chunkSteps;
int nsteps;
uint64_t opCount;
int llMode;
int state; // add component before this line -- it is left out during initialization
// Internal state
uint64_t head;
uint64_t tail;
uint64_t end;
void* requests[NCCL_STEPS];
int idle;
// Element linking
pthread_mutex_t mutex;
struct ncclProxyArgs* next;
struct ncclProxyArgs* nextPeer;
};
当構造体で使われている非標準型は次の通り
- proxyProgressFunc_t型: ???
- ncclChannel構造体
- ncclConnector構造体
src/transport.ccに定義されている。
struct ncclProxyPool {
struct ncclProxyPool *next;
struct ncclProxyArgs elems[PROXYARGS_ALLOCATE_SIZE];
};
当構造体で使われている非標準型は次の通り
src/include/devcomm.hに定義されている。
struct ncclRing {
// Shortcuts for userRanks[1] and userRanks[n-1]
int prev;
int next;
// Maps an internal nccl index to user-specified rank order. This is necessary
// since we need to know how the user expects data to be ordered across
// devices. Ordered from current device.
int* userRanks;
int* devUserRanks;
};
src/include/devcomm.hに定義されている。
struct ncclColl {
union {
struct {
struct CollectiveArgs args;
uint16_t funcIndex;
uint16_t nextIndex;
uint8_t active;
};
int data[0x10];
};
};
当構造体で使われている非標準型は次の通り
src/nccl.h.inに定義されている。
次の6つが定義されている
- ncclSuccess: 成功
- ncclUnhandledCudaError: CUDAのエラー
- ncclSystemError: システムエラー
- ncclInternalError: 内部エラー
- ncclInvalidArgument: 正しくない引数
- ncclInvalidUsage: 正しくない用法
- ncclNumResults: ?