-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[tsuji] 読み進めメモ #3
Comments
ncclCollstruct ncclColl {
union {
struct {
struct CollectiveArgs args;
uint16_t funcIndex;
uint16_t nextIndex;
uint8_t active;
};
int data[0x10];
};
}; |
ncclInfostruct ncclInfo {
ncclColl_t coll;
const char* opName;
// NCCL Coll Args
const void* sendbuff;
void* recvbuff;
size_t count;
ncclDataType_t datatype;
ncclRedOp_t op;
int root;
ncclComm_t comm;
cudaStream_t stream;
// Algorithm details
int chunkSteps;
int sliceSteps;
// Computed later
ncclPattern_t pattern;
size_t nBytes;
int nstepsPerLoop;
int nchunksPerLoop;
}; |
CollectiveArgsstruct CollectiveArgs {
struct ncclDevComm* comm;
uint64_t opCount;
// local and remote input, output, and buffer
const void * ThisInput;
void * ThisOutput;
// general parameters
size_t N;
uint32_t root;
uint8_t bid;
uint8_t nChannels;
uint16_t nThreads;
int lastChunkSize;
}; |
今までのを整理
次は |
|
9/1
理由: |
init.cc:576: params->blockDim.x = 0; params->blockDim.y = params->blockDim.z = 1; 変更されるのは init.cc:577: params->gridDim.x = 0; params->gridDim.y = params->gridDim.z = 1; 変更されるのは |
ncclChannelstruct 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];
};
};
static_assert(sizeof(struct ncclChannel) == 0x80*sizeof(int), "ncclChannel must have a pow2 size"); |
For 文の中身を呼んでいるが、 struct ncclChannel* channel = info->comm->channels+(info->comm->myParams->gridDim.x % info->comm->nChannels); ここで、同じ |
ncclProxyArgsstruct 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;
}; |
煮詰まってきたのでここまでのを整理 AllReduce (mode=PARALLEL) の全体の流れ
saveKernel の流れ
次読むもの
|
疑問
ncclAsyncMode
とはNCCL_MAX_OPS
とはAllReduce の動作
AllReduce の main
ncclCommInitRank
ncclAllReduce
info = ncclCommInfo(...)
collectives/all_reduce.cc#L14ncclEnqueueCheck(&info)
ncclCommDestroy
ncclEnqueueCheck
enqueue.cc#L409ncclAsyncModel
ArgsCheck(info)
saveKernel(info)
ncclBarrierEnqueue(info->comm)
ncclBarrierEnqueueWait(info->comm)
ncclEnqueueEvents(info->comm)
saveKernel(info)
enqueue.cc#L356computeColl(info, &coll, &proxyArgs)
→ 何をしている?blockDim.x
を指定 → 何をしている?for (int bid=0; bid<coll.args.nChannels, bid++)
For 文の中身
まだ良くわからない
nChannels
だけ → 何を意味している?computeColl(info, &coll, &proxyArgs)
info
からcoll
へ情報(root, count, send/recv buffers, devComm, opCount)をコピーinfo
からproxyArgs
へ情報(nsteps, sliceSteps, chunkSteps, llMode, opCount)を計算及びコピーncclBarrierEnqueue(info->comm)
基本的には User stream (nccl の通信を呼び出すストリーミ?、デフォルトストリーミかな)、とパラメータで指定されたストリーム(グループの場合もある)の違いによって、
cudaStreamWaitEvent
を呼び出すようになっているncclCpuBarrierIn
→ わからないncclCpuBarrierLast
→ わからないこのあとに
if(isLast)
があるので、intra のプロセスを待ち、最後のプロセスが処理をするようになっているこんな処理
ncclBarrierEnqueueWait(info->comm)
ncclCpuBarrierOut(comm)
ncclBarrierEnqueue
でカーネルが呼びされていだが、 PARALLEL の場合はここで呼び出されるcomm->channels
に格納されている各 channel に対して次の二つのを定義collStart = channel->collFifiTail
collCount = 0
NCCLCHECK(transportStartProxy(comm));
ncclEnqueueEvents(comm)
必要ならストリームを待つのと、
userStreamSet
を初期化するけっこう単純な関数
The text was updated successfully, but these errors were encountered: