Files
rocm-systems/src/ring.cu
T
Gilbert Lee 55a4b22ad7 Updating RCCL based on NCCL 2.3.7
- Contains modifications to support AMD hardware
- Adds unit tests
2019-05-16 16:16:18 +00:00

74 строки
2.7 KiB
Plaintext

/*************************************************************************
* Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
* Modifications Copyright (c) 2019 Advanced Micro Devices, Inc. All rights reserved.
*
* See LICENSE.txt for license information
************************************************************************/
#include "ring.h"
#include "param.h"
extern bool useFineGrainVramPcie;
NCCL_PARAM(Buffsize, "BUFFSIZE", DEFAULT_BUFFER_SIZE_BYTES);
ncclResult_t initRing(struct ncclComm* comm, int ringid) {
struct ncclRing* ring = comm->rings+ringid;
ring->id = ringid;
// Setup intermediate buffering
ring->buffSize = ncclParamBuffsize();
const int sendSize = ring->devMemSendSize = sizeof(struct ncclSendMem);
struct ncclSendMem* sendMem;
NCCLCHECK(ncclCudaCalloc((char**)&sendMem, sendSize, useFineGrainVramPcie));
ring->devMemSend = sendMem;
const int recvSize = ring->devMemRecvSize = offsetof(struct ncclRecvMem, buff)+ring->buffSize;
struct ncclRecvMem* recvMem;
NCCLCHECK(ncclCudaCalloc((char**)&recvMem, recvSize, useFineGrainVramPcie));
ring->devMemRecv = recvMem;
TRACE(NCCL_INIT,"sendMem %p size %d recvMem %p size %d", sendMem, sendSize, recvMem, recvSize);
// Pre-configure send/recv pointers. Those are the default, they may change later.
ring->recv.conn.buff = recvMem->buff;
ring->recv.conn.llBuff = recvMem->llBuff;
ring->recv.conn.tail = &recvMem->tail;
ring->recv.conn.opCount = &recvMem->opCount;
ring->recv.conn.direct = 0;
ring->send.conn.head = &sendMem->head;
ring->send.conn.llHead = &sendMem->llHead;
ring->send.conn.direct = 0;
ring->send.conn.llStep = 0;
ring->send.conn.llLastCleaning = 0;
// Ring index to user rank table.
NCCLCHECK(ncclCudaCalloc(&ring->devUserRanks, comm->nRanks));
NCCLCHECK(ncclCalloc(&ring->userRanks, comm->nRanks));
// Per-ring operation list.
NCCLCHECK(ncclCudaHostAlloc((void**)&ring->collectives, (void**)&ring->devCollectives, sizeof(struct ncclColl)*NCCL_MAX_OPS));
return ncclSuccess;
}
ncclResult_t freeRing(struct ncclRing* ring) {
// Intermediate buffering
CUDACHECK(hipFree(ring->devMemSend));
CUDACHECK(hipFree(ring->devMemRecv));
// Index to rank table
free(ring->userRanks);
CUDACHECK(hipFree(ring->devUserRanks));
// Operation list
NCCLCHECK(ncclCudaHostFree(ring->collectives));
// Free transport proxy resources
if (ring->send.transportResources) NCCLCHECK(ring->send.transport->send.free(ring->send.transportResources));
NCCLCHECK(transportDestroyProxy(&ring->send));
if (ring->recv.transportResources) NCCLCHECK(ring->recv.transport->recv.free(ring->recv.transportResources));
NCCLCHECK(transportDestroyProxy(&ring->recv));
return ncclSuccess;
}