Unit Test: support ncclAvg

[ROCm/rccl commit: 1faff323b4]
This commit is contained in:
Wenkai Du
2021-08-25 12:01:49 -07:00
parent da7ac55e6f
commit bd03ec2a45
8 changed files with 80 additions and 36 deletions
+36 -4
View File
@@ -22,6 +22,7 @@
#include <vector>
#include <gtest/gtest.h>
#include <math.h>
#include "rccl.h"
#include "../include/rccl_bfloat16.h"
@@ -558,7 +559,8 @@ dropback:
{ncclSum, "sum"},
{ncclProd, "prod"},
{ncclMax, "max"},
{ncclMin, "min"}
{ncclMin, "min"},
{ncclAvg, "avg"}
};
std::map<ncclDataType_t, std::string> dataTypeStrings
{
@@ -735,6 +737,36 @@ dropback:
}
}
static void Average(Dataset const& dataset, int8_t* resultI1)
{
uint8_t* resultU1 = (uint8_t *)resultI1;
int32_t* resultI4 = (int32_t *)resultI1;
uint32_t* resultU4 = (uint32_t *)resultI1;
int64_t* resultI8 = (int64_t *)resultI1;
uint64_t* resultU8 = (uint64_t *)resultI1;
float* resultF4 = (float *)resultI1;
double* resultF8 = (double *)resultI1;
rccl_bfloat16* resultB2 = (rccl_bfloat16 *)resultI1;
for (int j = 0; j < dataset.numElements; j++)
{
switch (dataset.dataType)
{
case ncclInt8: resultI1[j] = resultI1[j]/dataset.numDevices; break;
case ncclUint8: resultU1[j] = resultU1[j]/dataset.numDevices; break;
case ncclInt32: resultI4[j] = resultI4[j]/dataset.numDevices; break;
case ncclUint32: resultU4[j] = resultU4[j]/dataset.numDevices; break;
case ncclInt64: resultI8[j] = resultI8[j]/dataset.numDevices; break;
case ncclUint64: resultU8[j] = resultU8[j]/dataset.numDevices; break;
case ncclFloat32: resultF4[j] = resultF4[j]/dataset.numDevices; break;
case ncclFloat64: resultF8[j] = resultF8[j]/dataset.numDevices; break;
case ncclBfloat16: resultB2[j] = rccl_bfloat16((float)(resultB2[j])/dataset.numDevices); break;
default:
fprintf(stderr, "[ERROR] Unsupported datatype\n");
exit(0);
}
}
}
void ValidateResults(Dataset const& dataset, int root = 0) const
{
int8_t* outputI1 = (int8_t *)malloc(dataset.NumBytes(ncclOutputBuffer));
@@ -778,9 +810,9 @@ dropback:
case ncclUint32: isMatch &= (outputU4[j] == expectedU4[j]); break;
case ncclInt64: isMatch &= (outputI8[j] == expectedI8[j]); break;
case ncclUint64: isMatch &= (outputU8[j] == expectedU8[j]); break;
case ncclFloat32: isMatch &= (outputF4[j] == expectedF4[j]); break;
case ncclFloat64: isMatch &= (outputF8[j] == expectedF8[j]); break;
case ncclBfloat16: isMatch &= (outputB2[j] == expectedB2[j]); break;
case ncclFloat32: isMatch &= (fabs(outputF4[j] - expectedF4[j]) < 1e-5); break;
case ncclFloat64: isMatch &= (fabs(outputF8[j] - expectedF8[j]) < 1e-12); break;
case ncclBfloat16: isMatch &= (fabs((float)outputB2[j] - (float)expectedB2[j]) < 1e-2); break;
default:
fprintf(stderr, "[ERROR] Unsupported datatype\n");
exit(0);