1. 版本历史¶
文档版本 |
版本 |
作者 |
---|---|---|
V2.0 |
ECCL API参考 |
Enflame Tech |
2. ECCL API参考¶
以下内容描述了ECCL集合通信库的对外接口以及相关的参数信息。包括了通信域生成与管理类接口、通信算子类接口、组操作接口以及点对点通信接口
2.1. 通信域生成与管理类接口¶
下列接口主要负责生成通信域并进行管理
ecclGetVersion¶
ecclResult_t ecclGetVersion(int *version)
ecclGetVersion接口返回目前eccl通信库的版本。目前返回的通信库都是最新版本,其余功能有待以后实现。
ecclGetUniqueId¶
ecclResult_t ecclGetUniqueId(ecclUniqueId* uniqueId)
ecclGetUniqueId接口返回通信域的独有身份信息用于接下来的初始化通信域。每创建一个新的通信域根GCU卡都应该调用此函数,并将身份信息广播给域内所有的卡。
ecclCommInitRank¶
ecclResult_t ecclCommInitRank(ecclComm_t* comret, int nranks, ecclUniqueId commId, int rank)
ecclCommInitRank接口负责初始化指定的通信域,并返回对应的通信域信息给上层用户,上层用户将使用通信域信息调用集合通信接口。
ecclCommDestroy¶
ecclResult_t ecclCommDestroy(ecclComm_t comm)
ecclCommDestroy会在所有操作结束后释放相应通信域内的所有资源。
ecclGetErrorString¶
const char* ecclGetErrorString(ecclResult_t result);
ecclGetErrorString接口将程序的返回值转换成可读的字符串。
ecclCommCount¶
ecclResult_t ecclCommCount(const ecclComm_t comm, int* count);
ecclCommCount将会获取通信域内总的进程数量,并将结果保存在参数count中。
ecclCommDevice¶
ecclResult_t ecclCommDevice(const ecclComm_t comm, int* device);
ecclCommDevice接口负责获取通信域内某张GCU卡的设备号,并将结果保存在参数device中。
ecclCommUserRank¶
ecclResult_t ecclCommUserRank(const ecclComm_t comm, int* rank);
ecclCommUserRank接口负责获取通信域内某个进程的进程号,并将结果保存在参数rank中。
参数描述¶
参数 |
意义 |
---|---|
int nranks |
通信域内参与集合通信的进程(rank)数量,取值范围: 1 - n |
ecclUniqueId commId |
通信域的身份标号,总是唯一地标识一个通信域 |
int rank |
本进程(rank)在集合通信共nranks个进程中的编号,取值范围: 0 - nrank-1 |
ecclcomm_t* comret |
通信域创建成功后返回的通信域描述符 |
2.2. 通信算子类接口¶
下列接口实现了常见的集合通信操作
ecclBroadcast¶
ecclResult_t ecclBroadcast(const void* sendbuff, void* recvbuff, size_t count, ecclDataType_t datatype, int root, ecclComm_t comm, ecclStream_t stream)
ecclBroadcast将通信域内根GCU卡输出内存的数据广播到其他卡的输入内存上。输出内存只对根GCU卡起作用,其余GCU卡会忽略。输出内存和输入内存可以是同一块内存,此情况下不做任何处理。
ecclAllReduce¶
ecclResult_t ecclAllReduce(const void* sendbuff, void* recvbuff, size_t count, ecclDataType_t datatype, ecclRedOp_t op,ecclComm_t comm, ecclStream_t stream)
ecclAllReduce将通信域内所有GCU卡上输出内存的数据按照算子类型做规约操作,而每个卡的输入内存将会保存规约后的结果。输出内存和输入内存可以是同一块内存,此情况下不做任何处理。
ecclReduceScatter¶
ecclResult_t ecclReduceScatter(const void* sendbuff, void* recvbuff, size_t recvcount, ecclDataType_t datatype, ecclRedOp_t op, ecclComm_t comm, ecclStream_t stream);
ecclReduceScatter将通信域内所有GCU卡上输出内存的数据按照算子类型做规约操作,并将得到的结果均匀分片后分发到每一张卡的输入内存上,第i张卡上保存规约后的第i片数据。 此集合通信方式要求输出内存上数据大小为输入内存数据大小的nranks倍。
ecclAllGather¶
ecclResult_t ecclAllGather(const void* sendbuff, void* recvbuff, size_t sendcount, ecclDataType_t datatype, ecclComm_t comm, ecclStream_t stream);
ecclAllGather将通信域内所有GCU卡上输出内存的数据做聚合操作,而每个卡的输入内存将会保存聚合后的结果。每张卡上数据大小需要一致,输入内存上第i个位置保存第i张卡的数据。输出内存和输入内存可以是同一块内存,此情况下不做任何处理。 此集合通信方式要求输入内存上数据大小为输出内存数据大小的nranks倍。
ecclAllGatherv¶
ecclResult_t ecclAllGatherv(const void* sendbuff, size_t sendcount, ecclDataType_t sendtype, void* recvbuff, const size_t* recvcounts, const size_t* displs, ecclDataType_t recvtype, ecclComm_t comm, ecclStream_t stream);
ecclAllGatherv将通信域内所有GCU卡输出内存的数据做聚合操作,每张卡输入内存上第i个位置保存第i张卡的数据,每张卡上数据大小允许不同。但是第i张卡上发送数据的个数和类型需要跟其余卡上接受数据的个数(recvcounts[i])和类型一致。 每张卡上都保存了一份偏移量参数displs,参数记录了接收数据在输入内存上的偏移。
2.3. 组操作接口¶
组操作定义了当前线程的行为以避免阻塞,因此可以在多个独立线程上使用该接口
ecclGroupStart¶
ecclResult_t ecclGroupStart();
ecclGroupStart开启组操作,接下的通信操作不会因为CPU之间的同步而阻塞。
ecclGroupEnd¶
ecclResult_t ecclGroupEnd();
ecclGroupEnd结束组操作。当从上个ecclGroupStart之间的通信操作都被处理后返回。这意味着通信算子都被排入了流中,并不代表通信操作已经完成。
Attention
ecclGroupStart/End目前只支持send/recv的组操作,暂不支持其他集合通信的组操作
2.4. 点对点通信接口¶
通信域内指定多张卡之间进行数据接发
ecclSend¶
ecclResult_t ecclSend(const void* sendbuff, size_t count, ecclDataType_t datatype, int peer, ecclComm_t comm, ecclStream_t stream);
ecclSend将输出内存上的数据传输给指定的卡,同时被指定的卡需要运行ecclRecv来接受数据(数据类型和位数需要一致)。
ecclRecv¶
ecclResult_t ecclRecv(void* recvbuff, size_t count, ecclDataType_t datatype, int peer, ecclComm_t comm, ecclStream_t stream);
ecclRecv将从指定的卡上接收到的数据存入输入内存中,同时被指定的卡需要运行ecclSend来发送数据(数据类型和位数需要一致)。
ecclGather¶
ecclResult_t ecclGather(const void* sendbuff, void* recvbuff, size_t sendcount, ecclDataType_t datatype, int root, ecclComm_t comm, ecclStream_t stream);
ecclGather将通信域中非根GCU卡的数据都传输给根GCU卡。根GCU卡上第i个位置保存第i张卡的数据。如果根GCU卡想要接收全部的数据,需要保证接收数据个数是发送数据个数的nranks倍。
ecclScatter¶
ecclResult_t ecclScatter(const void* sendbuff, void* recvbuff, size_t recvcount, ecclDataType_t datatype, int root, ecclComm_t comm, ecclStream_t stream);
ecclScatter将根GCU卡上的数据均匀分片后传输给通信域中的每一张卡。第i张卡上保存的是根GCU卡上第i个分片的数据。如果根GCU卡想要发送全部的数据,需要保证发送数据个数是接收数据个数的nranks倍。
ecclAllToAll¶
ecclResult_t ecclAllToAll(const void* sendbuff, void* recvbuff, size_t count, ecclDataType_t datatype, ecclComm_t comm, ecclStream_t stream);
ecclAllToAll将每张卡上第i个分片的数据聚合到第i张卡上。第i张卡将输出内存中的第j块数据发送给第j张卡,而第j张卡将来自第i张卡的数据存入输入内存中的第i块位置。
2.5. 接口参数描述¶
参数 |
意义 |
---|---|
const void* sendbuff |
输出内存区地址 |
void* recvbuff |
输入内存区地址 |
size_t count |
需要进行通信运算的元素个数 |
size_t sendcount |
输出数据元素个数 |
size_t recvcount |
输入数据元素个数 |
ecclDataType_t datatype |
需要进行通信运算的元素数据类型 |
ecclRedOp_t op |
规约通信算子的类型 |
ecclComm_t comm |
本次通信域的描述符,ecclCommInitRank完成后得到该描述符 |
int peer |
点对点通信指定卡的rank号 |
const size_t* displs |
记录接收数据在输入内存上的偏移 |
2.6. 返回值以及枚举类参数取值¶
ecclResult_t¶
下表枚举了ecclResult_t可能的返回值
返回值 |
对应数值 |
返回值描述 |
---|---|---|
ecclSuccess |
0 |
集合通信初始化成功,或者算子下发完成 |
ecclUnhandledSdkError |
1 |
调用SDK或者驱动接口返回失败 |
ecclSystemError |
2 |
操作系统的功能返回失败。如初始化socket失败,读写文件失败等 |
ecclInternalError |
3 |
ECCL内部流程失败 |
ecclInvalidArgument |
4 |
上层输入无效的参数 |
ecclInvalidUsage |
5 |
上层使用方式有误 |
ecclNoResources |
6 |
申请资源失败。如HBM内存等资源 |
ecclNumResults |
7 |
无效的返回值 |
ecclRedOp_t¶
下表枚举了Reduce算子可能出现的类型
通信类型 |
对应数值 |
类型描述 |
---|---|---|
ecclSum |
0 |
实现加(+)操作 |
ecclProd |
1 |
实现乘(*)操作 |
ecclMax |
2 |
实现取最大值操作 |
ecclMin |
3 |
实现取最小值操作 |
ecclNumOps |
4 |
无效的类型 |
ecclDataType_t¶
下表枚举了ecclDataType_t可能出现的类型
数据类型 |
对应数值 |
类型描述 |
---|---|---|
ecclInt8,ecclChar |
0 |
8位符号整数 |
ecclUint8 |
1 |
8位无符号整数 |
ecclInt32,ecclInt |
2 |
32位符号整数 |
ecclUint32 |
3 |
32位无符号整数 |
ecclInt64 |
4 |
64位符号整数 |
ecclUint64 |
5 |
64位无符号整数 |
ecclFloat16,ecclHalf |
6 |
16位浮点数 |
ecclFloat32,ecclFloat |
7 |
32位浮点数 |
ecclFloat64,ecclDouble |
8 |
64位浮点数 |
ecclBFloat16 |
9 |
16位截断浮点数 |
ecclNumTypes |
10 |
无效的类型 |
Attention
ecclBroadcast算子支持任意类型的数据输入。ecclReduce和ecclALLReduce算子在T10板卡上仅支持ecclFloat32的数据,在T20板卡上支持ecclFloat32,ecclFloat16,ecclInt8,ecclInt32,ecclBFloat16的数据输入。