核函数

核函数的定义

Ascend C支持开发者自定义核函数来扩展C++,核函数在AI处理器上执行时实际是若干线程在并行执行,每个线程有独立的寄存器和栈,共同完成数据计算任务。

核函数的定义示例如下:

1
 __global__ void kernel_name(argument list)

定义核函数时需要遵循以下规则:

核函数的调用

算子程序中的函数可以分为三类:host侧执行函数、核函数(device侧执行)、device侧执行函数(除核函数之外)。下图以Kernel直调算子开发方式为例,描述三者的调用关系:

图1 算子程序中三种函数间的调用关系

Host侧通过内核调用符<<<...>>>的语法形式调用核函数,如下所示:

1
kernel_name<<<numBlocks, threadsPerBlock, dynUBufSize, stream>>>(args...)
执行配置由4个参数决定:
  • numBlocks:为核函数配置的线程块的个数,即启用的核数, 支持int32_t和dim3类型;
  • threadsPerBlock:每个线程块内并发执行的线程数量,支持int32_t和dim3类型;
  • dynUBufSize:动态申请内存空间总大小,一般情况设置为0;
  • stream:用于host侧和device侧的流同步。