TIK C++
是一种使用C/C++
作为前端语言的算子开发工具,通过四层接口抽象、并行编程范式、孪生调试等技术,极大提高算子开发效率,助力Al开发者低成本完成算子开发和模型调优部署
核函数
核函数 (Kernel Function)
是TIK C++
算子设备侧的入口。TIK C++
允许用户使用核函数这种C/C++函数的语法扩展来管理设备仅的运行代码,用户在核函数中实现算子透辑的编写,例如自定义算子类及其成员函数以实现该算子的所有功能。核函数是主机侧和设备侧连接的桥梁
调用核函数
核函数的调用语句是C/C++
函数调用语句的一种扩展
常见的C/C++函数调用方式是如下的形式:
function_name(argument list);
核函数使用内核调用符 <<<...>>>
这种语法形式,来规定核函数的执行配置:
kernel_name<<<blockDim, l2ctrl, stream>>>(argument list);
blockDim
,规定了核函数将会在几个核上执行,每个执行该核函数的核会被分配一个逻辑ID,表现为内置变量*block_idx
*,编号从0开始,可为不同的逻辑核定义不同的行为,可以在算子实现中使用l2ctrl
,保留参数,暂时设置为固定值*nullptr
*stream
,类型为*aclrtStream
,stream
是一个任务队列,应用程序通过stream
*来管理任务的并行
使用内核调用符 <<<…>>>
调用核函数:
HelloWorld<<<8, nullptr, stream>>>(fooDevice);
blockDim设置为8,表示在8个核上调用了HelloWorld核函数,每个核都会独立且并行地执行该核函数
Stream可以通过aclrtCreateStream来创建,它的作用是在当前进程或线程中显式创建一个aclrtStream
argument list设置为fooDevice这1个入参
核函数的调用是异步的,核函数的调用结束后,控制权立刻返回给主机侧
强制主机侧程序等待所有核函数执行完毕的API
(阻塞应用程序运行,直到指定Stream
中的所有任务都完成,同步接口)为*aclrtSynchronizeStream
*
aclError aclrtSynchronizeStream(aclrtStream stream);