Kernel Launch调用方式
在核函数章节,介绍了核函数的定义规则和通过内核调用符进行核函数调用的方式。ACLRT_LAUNCH_KERNEL调用方式对内核调用符方式进行了功能加强,按照核函数定义章节介绍的规则进行定义的核函数均可以通过ACLRT_LAUNCH_KERNEL调用。
ACLRT_LAUNCH_KERNEL调用接口的使用方法如下:
ACLRT_LAUNCH_KERNEL(kernel_name)(blockDim, stream, argument list);
- kernel_name:算子核函数的名称。
- blockDim:规定了核函数将会在几个核上执行。每个执行该核函数的核会被分配一个逻辑ID,即block_idx,可以在核函数的实现中调用GetBlockIdx来获取block_idx。
- stream,类型为aclrtStream,stream是一个任务队列,应用程序通过stream来管理任务的并行。stream的定义和用法具体可参考《CANN AscendCL应用软件开发指南(C&C++)》“AscendCL API参考”章节。
- argument list:参数列表,与核函数的参数列表保持一致。
考虑名为add_custom的核函数调用的例子,该函数实现两个矢量的相加:
// blockDim设置为8表示在8个核上调用了add_custom核函数,每个核都会独立且并行地执行该核函数,该核函数的参数列表为x,y,z。 ACLRT_LAUNCH_KERNEL(add_custom)(8, stream, x, y, z)
核函数的调用是异步的,核函数的调用结束后,控制权立刻返回给主机端,可以调用以下函数来强制主机端程序等待所有核函数执行完毕。
aclError aclrtSynchronizeStream(aclrtStream stream);
aclrtSynchronizeStream的具体用法参考《CANN AscendCL应用软件开发指南(C&C++)》“AscendCL API参考” - 同步等待 - aclrtSynchronizeStream章节。
父主题: Kernel Launch开放式编程