HelloWorld
下面是一个简单的Ascend C的"Hello World"样例,展示了一个Ascend C核函数(设备侧实现的入口函数)的基本写法,及其如何被调用的流程。
- 包含核函数的Kernel实现文件hello_world.cpp代码如下:核函数hello_world的核心逻辑为打印"Hello World"字符串。hello_world_do封装了核函数的调用程序,通过<<<>>>内核调用符对核函数进行调用。
#include "kernel_operator.h" using namespace AscendC; extern "C" __global__ __aicore__ void hello_world() { printf("Hello World!!!\n"); } void hello_world_do(uint32_t blockDim, void* stream) { hello_world<<<blockDim, nullptr, stream>>>(); }
- 调用核函数的应用程序main.cpp代码如下(您可以通过代码注释了解其主要的流程):
#include "acl/acl.h" extern void hello_world_do(uint32_t coreDim, void* stream); int32_t main(int argc, char const *argv[]) { // AscendCL初始化 aclInit(nullptr); // 运行管理资源申请 int32_t deviceId = 0; aclrtSetDevice(deviceId); aclrtStream stream = nullptr; aclrtCreateStream(&stream); // 设置参与运算的核数为8 constexpr uint32_t blockDim = 8; // 用内核调用符<<<>>>调用核函数,hello_world_do中封装了<<<>>>调用 hello_world_do(blockDim, stream); aclrtSynchronizeStream(stream); // 资源释放和AscendCL去初始化 aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }
通过如下的代码工程对上述文件进行组织,您可以通过LINK获取样例工程,并参考README完成CMakeLists中的AI处理器的型号、软件包安装路径配置。
|-- CMakeLists.txt // CMake编译配置文件 |-- hello_world.cpp // Kernel实现 |-- main.cpp // 调用核函数的主程序 |-- run.sh // 一键式编译运行脚本
通过执行如下脚本实现样例程序的编译和运行:
bash run.sh -v <soc_version>
如果无法确定具体的<soc_version>,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy,实际配置的<soc_version>值为Ascendxxxyy。
本样例共调度八个核,分别打印了每个核的核号和"Hello World"信息。
父主题: 快速入门