Add all_reduce_bias_perf to support All Reduce with Bias (#130)
Use dynamic symbol loading of ncclAllReduceWithBias
Co-authored-by: mberenjk <146776561+mberenjk@users.noreply.github.com>
[ROCm/rccl-tests commit: db6ea5a594]
此提交包含在:
@@ -364,6 +364,11 @@ testResult_t InitDataReduce(void* data, const size_t count, const size_t offset,
|
||||
return testSuccess;
|
||||
}
|
||||
|
||||
testResult_t InitDataApplyBias(void* expected, void* bias, const size_t count, const size_t offset, ncclDataType_t type, ncclRedOp_t op) {
|
||||
ncclVerifiableApplyBias(expected, bias, count, (int)type, (int)op, offset, cudaStreamDefault);
|
||||
return testSuccess;
|
||||
}
|
||||
|
||||
testResult_t InitData(void* data, const size_t count, size_t offset, ncclDataType_t type, ncclRedOp_t op, uint64_t seed, int nranks, int rank) {
|
||||
CUDACHECK(ncclVerifiablePrepareInput(data, count, (int)type, (int)op, nranks, rank, seed, offset, cudaStreamDefault));
|
||||
return testSuccess;
|
||||
@@ -469,7 +474,7 @@ testResult_t CheckData(struct threadArgs* args, ncclDataType_t type, ncclRedOp_t
|
||||
|
||||
TESTCHECK(CheckDelta(data, args->expected[i], count, 0, type, op, 0, nranks, wrongPerGpu+i));
|
||||
|
||||
#if 1 && DEBUG_PRINT
|
||||
#if 1 && defined(DEBUG_PRINT)
|
||||
if (args->reportErrors && wrongPerGpu[i] != 0) {
|
||||
printf("rank=%d #wrong=%d\n", rank, (int)wrongPerGpu[i]);
|
||||
char *expectedHost = (char*)malloc(args->expectedBytes);
|
||||
@@ -582,6 +587,7 @@ testResult_t startColl(struct threadArgs* args, ncclDataType_t type, ncclRedOp_t
|
||||
int rank = ((args->proc*args->nThreads + args->thread)*args->nGpus + i);
|
||||
char* recvBuff = ((char*)args->recvbuffs[i]) + shift;
|
||||
char* sendBuff = ((char*)args->sendbuffs[i]) + shift;
|
||||
char* bias = ((char*)args->bias[i]) + shift;
|
||||
ncclRedOp_t op;
|
||||
|
||||
if(opIndex < ncclNumOps) {
|
||||
@@ -629,7 +635,7 @@ testResult_t startColl(struct threadArgs* args, ncclDataType_t type, ncclRedOp_t
|
||||
TESTCHECK(args->collTest->runColl(
|
||||
(void*)(in_place ? recvBuff + args->sendInplaceOffset*rank : sendBuff),
|
||||
(void*)(in_place ? recvBuff + args->recvInplaceOffset*rank : recvBuff),
|
||||
count, type, op, root, args->comms[i], args->streams[i]));
|
||||
count, type, op, root, args->comms[i], args->streams[i], bias));
|
||||
|
||||
#if NCCL_VERSION_CODE >= NCCL_VERSION(2,11,0)
|
||||
if(opIndex >= ncclNumOps) {
|
||||
@@ -1060,7 +1066,7 @@ testResult_t threadLaunch(struct testThread* thread) {
|
||||
return testSuccess;
|
||||
}
|
||||
|
||||
testResult_t AllocateBuffs(void **sendbuff, size_t sendBytes, void **recvbuff, size_t recvBytes, void **expected, size_t nbytes) {
|
||||
testResult_t AllocateBuffs(void **sendbuff, size_t sendBytes, void **recvbuff, size_t recvBytes, void **expected, size_t nbytes, void **bias) {
|
||||
if(enable_rotating_tensor) {
|
||||
recvBytes = recvBytes + cache_bytes;
|
||||
nbytes = nbytes + cache_bytes;
|
||||
@@ -1069,22 +1075,26 @@ testResult_t AllocateBuffs(void **sendbuff, size_t sendBytes, void **recvbuff, s
|
||||
if(HIP_VERSION >= 50700000) {
|
||||
CUDACHECK(hipExtMallocWithFlags(sendbuff, nbytes, hipDeviceMallocUncached));
|
||||
CUDACHECK(hipExtMallocWithFlags(recvbuff, nbytes, hipDeviceMallocUncached));
|
||||
if (bias) CUDACHECK(hipExtMallocWithFlags(bias, nbytes, hipDeviceMallocUncached));
|
||||
if (datacheck) CUDACHECK(hipExtMallocWithFlags(expected, recvBytes, hipDeviceMallocUncached));
|
||||
}
|
||||
else {
|
||||
CUDACHECK(hipExtMallocWithFlags(sendbuff, nbytes, hipDeviceMallocFinegrained));
|
||||
CUDACHECK(hipExtMallocWithFlags(recvbuff, nbytes, hipDeviceMallocFinegrained));
|
||||
if (bias) CUDACHECK(hipExtMallocWithFlags(bias, nbytes, hipDeviceMallocFinegrained));
|
||||
if (datacheck) CUDACHECK(hipExtMallocWithFlags(expected, recvBytes, hipDeviceMallocFinegrained));
|
||||
}
|
||||
}
|
||||
else if (memorytype == ncclHost) {
|
||||
CUDACHECK(hipHostMalloc(sendbuff, nbytes));
|
||||
CUDACHECK(hipHostMalloc(recvbuff, nbytes));
|
||||
if (bias) CUDACHECK(hipHostMalloc(bias, nbytes));
|
||||
if (datacheck) CUDACHECK(hipHostMalloc(expected, recvBytes));
|
||||
}
|
||||
else if (memorytype == ncclManaged) {
|
||||
CUDACHECK(cudaMallocManaged(sendbuff, nbytes));
|
||||
CUDACHECK(cudaMallocManaged(recvbuff, nbytes));
|
||||
if (bias) CUDACHECK(cudaMallocManaged(bias, nbytes));
|
||||
if (datacheck) CUDACHECK(cudaMallocManaged(expected, recvBytes));
|
||||
#if 0
|
||||
CUDACHECK(cudaMemset(*sendbuff, 0, nbytes));
|
||||
@@ -1096,14 +1106,17 @@ testResult_t AllocateBuffs(void **sendbuff, size_t sendBytes, void **recvbuff, s
|
||||
#if NCCL_VERSION_CODE >= NCCL_VERSION(2,19,0)
|
||||
NCCLCHECK(ncclMemAlloc(sendbuff, nbytes));
|
||||
NCCLCHECK(ncclMemAlloc(recvbuff, nbytes));
|
||||
if (bias) CUDACHECK(cudaMalloc(bias, nbytes));
|
||||
if (datacheck) NCCLCHECK(ncclMemAlloc(expected, recvBytes));
|
||||
#else
|
||||
CUDACHECK(cudaMalloc(sendbuff, nbytes));
|
||||
CUDACHECK(cudaMalloc(recvbuff, nbytes));
|
||||
if (bias) CUDACHECK(cudaMalloc(bias, nbytes));
|
||||
if (datacheck) CUDACHECK(cudaMalloc(expected, recvBytes));
|
||||
#endif
|
||||
}
|
||||
CUDACHECK(hipMemset(*sendbuff, 1, nbytes));
|
||||
if (bias) CUDACHECK(hipMemset(*bias, 1, nbytes));
|
||||
if (datacheck) CUDACHECK(hipMemset(*expected, 1, recvBytes));
|
||||
return testSuccess;
|
||||
}
|
||||
@@ -1554,6 +1567,7 @@ testResult_t run() {
|
||||
std::vector<cudaStream_t> streams(nGpus*nThreads);
|
||||
std::vector<void*> sendbuffs(nGpus*nThreads);
|
||||
std::vector<void*> recvbuffs(nGpus*nThreads);
|
||||
std::vector<void*> bias(nGpus*nThreads);
|
||||
std::vector<void*> expected(nGpus*nThreads);
|
||||
size_t sendBytes, recvBytes;
|
||||
|
||||
@@ -1564,7 +1578,7 @@ testResult_t run() {
|
||||
for (int i=0; i<nGpus*nThreads; i++) {
|
||||
gpus[i] = ((gpu0 != -1 ? gpu0 : localRank*nThreads*nGpus) + i)%numDevices;
|
||||
CUDACHECK(cudaSetDevice(gpus[i]));
|
||||
TESTCHECK(AllocateBuffs(sendbuffs.data()+i, sendBytes, recvbuffs.data()+i, recvBytes, expected.data()+i, (size_t)maxBytes));
|
||||
TESTCHECK(AllocateBuffs(sendbuffs.data()+i, sendBytes, recvbuffs.data()+i, recvBytes, expected.data()+i, (size_t)maxBytes, bias.data()+i));
|
||||
if (streamnull) {
|
||||
streams[i] = NULL;
|
||||
}
|
||||
@@ -1699,6 +1713,7 @@ testResult_t run() {
|
||||
threads[t].args.gpus=gpus.data()+t*nGpus;
|
||||
threads[t].args.sendbuffs = sendbuffs.data()+t*nGpus;
|
||||
threads[t].args.recvbuffs = recvbuffs.data()+t*nGpus;
|
||||
threads[t].args.bias = bias.data()+t*nGpus;
|
||||
threads[t].args.expected = expected.data()+t*nGpus;
|
||||
threads[t].args.ncclId = ncclId;
|
||||
threads[t].args.comms=comms+t*nGpus;
|
||||
@@ -1764,6 +1779,7 @@ testResult_t run() {
|
||||
#else
|
||||
if (sendbuffs[i]) CUDACHECK(cudaFree((char*)sendbuffs[i]));
|
||||
if (recvbuffs[i]) CUDACHECK(cudaFree((char*)recvbuffs[i]));
|
||||
if (bias[i]) CUDACHECK(cudaFree((char*)bias[i]));
|
||||
if (datacheck) CUDACHECK(cudaFree(expected[i]));
|
||||
#endif
|
||||
}
|
||||
|
||||
新增問題並參考
封鎖使用者