Kernel Primitive API¶
Kernel Primitive API 对算子 Kernel 实现中的底层代码进行了抽象与功能封装,提供高性能的 Block 级 IO 运算和 Compute 运算。使用 Kernel Primitive API 进行 Kernel 开发可以更加专注计算逻辑的实现,在保证性能的同时大幅减少代码量,同时实现了算子计算与硬件解耦。
本部分为 PaddlePaddle 高级开发人员提供了用于 Kernel 开发的 CUDA Kernel Primitive API,该类 API 能够帮助开发者在提升开发效率的同时收获较好的性能。Kernel Primitive API 主要包括 IO API、Compute API 以及 OpFunc,IO API 能够高效的完成全局内存与寄存器间的数据读写操作。Compute API 为通用计算函数,如ElementwiseBinary、ElementwiseUnary 等;OpFunc 用于定义 Compute API 中的计算规则,例如实现 Add 操作则需要定义 AddFunctor 用于 ElementwiseBinary 调用,开发者可以直接使用默认的 OpFunc 也可以根据需要进行自定义,具体的实现规则将在 OpFunc 小节中进行详细介绍。当前 API 均是 Block 级别的多线程 API,开发者可以直接传入当前 Block 的数据指针以及操作类型完成相应的计算,目前仅支持全局数据指针和寄存器指针。
API 列表¶
API 名称 |
功能简介 |
---|---|
ReadData |
IO,将数据从全局内存读取到寄存器中。 |
ReadDataBc |
IO,Broadcast 形式的数据读取, 根据当前 Block 的数据偏移和原始输入指针计算输入坐标, 并将输入数据读取到寄存器中。 |
ReadDataReduce |
IO,Reduce 形式的数据读取, 将需要进行规约的数据从全局内存读取到寄存器中。 |
WriteData |
IO,将数据从寄存器写入全局内存中。 |
ElementwiseUnary |
Compute API,输入与输出 Shape 相同的一元计算 API,根据 OpFunc 计算规则完成一元逐元素运算。 |
ElementwiseBinary |
Compute API,输入与输出 Shape 相同的二元计算 API,根据 OpFunc 计算规则完成二元逐元素运算。 |
ElementwiseTernary |
Compute API,输入与输出 Shape 相同的三元计算 API,根据 OpFunc 计算规则完成三元逐元素运算。 |
ElementwiseAny |
Compute API,输入与输出 Shape 相同的多元计算 API,根据 OpFunc 计算规则完成多元逐元素运算。 |
CycleBinary |
Compute API,input1 和 input2 具有不同 Shape, input2 和 output 具有相同 Shape, 根据 OpFunc 计算规则完成二元循环操作。 |
Reduce |
Compute API,根据 Reduce 模式完成数据规约。 |
OpFunc 列表¶
Functor 名称 |
功能简介 |
---|---|
ExpFunctor |
一元 Functor,对输入数据进行 Exp 操作。 |
IdentityFunctor |
一元 Functor,对输入数据进行类型转换操作。 |
DivideFunctor |
一元 Functor,对输入数据除以固定值。 |
SquareFunctor |
一元 Functor,对数据进行 Square 操作。 |
MinFunctor |
二元 Functor,返回输入中的最小值。 |
MaxFunctor |
二元 Functor,返回输入中的最大值。 |
AddFunctor |
二元 Functor,返回输入之和。 |
MulFunctor |
二元 Functor,返回输入的乘积。 |
LogicalOrFunctor |
二元 Functor,返回输入的逻辑或的操作结果。 |
LogicalAndFunctor |
二元 Functor,返回输入的逻辑与的操作结果。 |
DivFunctor |
二元 Functor,返回两数相除的结果。 |
FloorDivFunctor |
二元 Functor,返回两数相除的结果。 |
API 介绍¶
IO API : 介绍 IO 类 API 的定义和功能。
Compute API : 介绍 Compute 类 API 的定义和功能。
OpFunc : 介绍 Kernel Primitive API 提供的 Functor。