NPU侧的运行验证当前分为三种方式,使用Kernel Launch接口调用,使用<<<>>>内核调用符调用或者使用Pybind调用。开发者完成算子核函数的开发和Tiling实现后,即可通过任意一种方式以及AscendCL运行时接口,完成算子的调用并实现自己的推理应用;同时提供简易的kernel开发工程,开发者仅需提供kernel侧实现,基于工程框架可以快速实现任意一种方式的调用。
ACLRT_LAUNCH_KERNEL调用接口的使用方法如下:
ACLRT_LAUNCH_KERNEL(kernel_name)(blockDim, stream, argument list);
考虑名为add_custom的核函数调用的例子,该函数实现两个矢量的相加,调用示例如下:
// blockDim设置为8表示在8个核上调用了add_custom核函数,每个核都会独立且并行地执行该核函数,该核函数的参数列表为x,y,z。 ACLRT_LAUNCH_KERNEL(add_custom)(8, stream, x, y, z)
核函数可以使用内核调用符<<<...>>>这种语法形式,来规定核函数的执行配置:
kernel_name<<<blockDim, l2ctrl, stream>>>(argument list);
BlockDim是逻辑核的概念,取值范围为[1,65535]。为了充分利用硬件资源,一般设置为物理核的核数或其倍数。对于耦合架构和分离架构,BlockDim在运行时的意义和设置规则有一些区别,具体说明如下:
考虑名为add_custom的核函数调用的例子,该函数实现两个矢量的相加,调用示例如下:
// blockDim设置为8表示在8个核上调用了add_custom核函数,每个核都会独立且并行地执行该核函数,该核函数的参数列表为x,y,z。 add_custom<<<8, nullptr, stream>>>(x, y, z);
内核调用符进行核函数调用的详细示例可参见核函数调用。
核函数的调用是异步的,核函数的调用结束后,控制权立刻返回给主机端,可以调用以下aclrtSynchronizeStream函数来强制主机端程序等待所有核函数执行完毕。
aclError aclrtSynchronizeStream(aclrtStream stream);
aclrtSynchronizeStream的具体用法参考《CANN AscendCL应用软件开发指南(C&C++)》中的“AscendCL API参考 > 同步&异步API说明 > aclrtSynchronizeStream”章节。