昇腾 - 快速理解AscendCL(Ascend Computing Language)基础概念的HelloWord

news2024/11/16 16:28:42

昇腾 - 快速理解AscendCL(Ascend Computing Language)基础概念的HelloWord

flyfish

AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络应用的C语言API库,提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等API,能够实现利用昇腾硬件计算资源、在昇腾CANN平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。

目录结构
在这里插入图片描述

源码

#include <iostream>
#include "acl/acl.h"
# define INFO_LOG(fmt, args...) fprintf(stdout, "[INFO] " fmt "\n", ##args)
# define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "\n", ##args)
# define ERROR_LOG(fmt, args...) fprintf(stdout, "[ERROR] " fmt "\n", ##args)
using namespace std;

int main(int argc, char *argv[])
{
    uint32_t deviceId = 0;
    aclrtContext context = nullptr;
    aclrtStream stream = nullptr;
    const char *aclConfigPath = "acl.json";
    aclError ret = aclInit(aclConfigPath);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Init Failed");
        return 1;
    }
    INFO_LOG("Acl Init Success");

    ret = aclrtSetDevice(deviceId);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Set Device Failed");
        return 1;
    }
    INFO_LOG( "Acl Set Device Success,Current DeviceID:%d", deviceId);

    ret = aclrtCreateContext(&context, deviceId);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Create Context Failed");
        return 1;
    }
    INFO_LOG("Acl Create Context Success");

    ret = aclrtCreateStream(&stream);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Create Stream Failed");
        return 1;
    }
    INFO_LOG("Acl Create Stream Success");
    /*
    * 业务执行
    */
    ret = aclrtDestroyStream(stream);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Destroy Stream Failed");
        return 1;
    }
    INFO_LOG("Acl Destroy Stream Success");

    ret = aclrtDestroyContext(context);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Destroy Context Failed");
        return 1;
    }
    INFO_LOG("Acl Destroy Context success");

    ret = aclrtResetDevice(deviceId);
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Reset Device Failed");
        return 1;
    }
    INFO_LOG("Acl Reset Device Success");

    ret = aclFinalize();
    if (ret != ACL_ERROR_NONE){
        ERROR_LOG("Acl Finalize Failed");
        return 1;
    }
    INFO_LOG("Acl Finalize Success");
    return 0;
}

与源码所在位置是相同目录的cmakelist.txt

cmake_minimum_required(VERSION 3.5.1)

project(ACLHelloWorld)

add_compile_options(-std=c++11)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY  "../../../out")
set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")

set(INC_PATH $ENV{DDK_PATH})
if (NOT DEFINED ENV{DDK_PATH})
    set(INC_PATH "/usr/local/Ascend/ascend-toolkit/latest")
    message(STATUS "set default INC_PATH: ${INC_PATH}")
else()
    message(STATUS "set INC_PATH: ${INC_PATH}")
endif ()

set(LIB_PATH $ENV{NPU_HOST_LIB})
if (NOT DEFINED ENV{NPU_HOST_LIB})
    set(LIB_PATH "/usr/local/Ascend/ascend-toolkit/lastest/runtime/lib64/stub")
    message(STATUS "set default LIB_PATH: ${LIB_PATH}")
else()
    message(STATUS "set LIB_PATH: ${LIB_PATH}")
endif ()

include_directories(
   ${INC_PATH}/runtime/include/
)

link_directories(
    ${LIB_PATH}
)

add_executable(main
        main.cpp)

target_link_libraries(main ascendcl stdc++)

外层cmakelist.txt

cmake_minimum_required(VERSION 3.5.1)

# project information


project(untitled2)
include(set_env.cmake)

set(MX_SDK_HOME $ENV{MX_SDK_HOME})

if (NOT DEFINED ENV{MX_SDK_HOME})
    set(MX_SDK_HOME "/usr/local/Ascend/mindx_sdk")
    message(STATUS "set default MX_SDK_HOME: ${MX_SDK_HOME}")
else ()
    message(STATUS "env MX_SDK_HOME: ${MX_SDK_HOME}")
endif()

add_subdirectory("./src")

set_env.cmake

# This file is used to configure DDK-related environment variables. 
# It is generated or updated in the following two scenarios:
# 1. This file does not exist or does not contain "ENV{DDK_PATH}".
# 2. The CANN version has been changed.

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux") 
    set(ENV{DDK_PATH} /usr/local/Ascend/ascend-toolkit/7.0.0)
    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine OUTPUT_VARIABLE arch)
    string(FIND ${arch} "x86" res)
    if(NOT ${res} MATCHES "-1")
        set(ENV{NPU_HOST_LIB} /usr/local/Ascend/ascend-toolkit/7.0.0/x86_64-linux/runtime/lib64/stub)
    else()
        set(ENV{NPU_HOST_LIB} /usr/local/Ascend/ascend-toolkit/7.0.0/aarch64-linux/runtime/lib64/stub)
    endif()
    set(ENV{MX_SDK_HOME} /usr/local/Ascend/mxVision-5.0.RC3)
else()
    if (NOT EXISTS "C:/Program Files/HuaWei/Ascend")
        set(ENV{DDK_PATH} C:/Users/bobod/.mindstudio/huawei/adk/remote/7.0.0)
    endif()
endif()

编译结果输出

(base) root@orangepiaipro:~/MindStudio-WorkSpace/untitled2_731bdeb2/out# ./main
[INFO] Acl Init Success
[INFO] Acl Set Device Success,Current DeviceID:0
[INFO] Acl Create Context Success
[INFO] Acl Create Stream Success
[INFO] Acl Destroy Stream Success
[INFO] Acl Destroy Context success
[INFO] Acl Reset Device Success
[INFO] Acl Finalize Success

Device

Device就是用来计算的硬件设备。第一次用 aclrtSetDevice 这个接口把设备指定好之后,设备就“上线了”。
每次用 aclrtSetDevice 选这个设备,系统会给它加1个“使用次数”;当用 aclrtResetDevice 把设备“重置”时,系统就减1个“使用次数”。
当“使用次数”变成0时,这个设备在当前程序里就不能用了。

Context

Context是一个执行环境,所有操作都在这个环境里运行。它是和一个设备绑定的,不能在多个设备间共用。
有两种方式可以创建Context:一种是系统自动创建,这叫隐式创建;另一种是自己手动创建,这叫显式创建。
隐式创建的Context(默认的),在用 aclrtSetDevice 选定设备时就会自动生成。当用 aclrtResetDevice 把设备“重置”到0次时,Context也会自动消失。系统只会创建一个隐式的Context,后面再用 aclrtSetDevice 选同一个设备,只是增加这个默认Context的“使用次数”。
显式创建的Context,得自己用 aclrtCreateContext 创建,然后再用 aclrtDestroyContext 销毁它。
如果在一个程序里创建了多个Context,那每次只能在一个Context里工作。建议明确指定当前线程要用哪个Context,这样代码维护起来更方便。

Stream

Stream就是设备上的“执行管道”,它能保证任务按照写的顺序一个接一个地执行。
和Context一样,Stream也分为隐式和显式两种创建方式。
每个Context都会有一个默认的Stream,这个Stream是系统自动创建的,生命周期和它归属的Context一样长。
也可以显式地创建多个Stream,用 aclrtCreateStream 创建,用 aclrtDestroyStream 销毁。显式创建的Stream是和某个Context绑定的,当这个Context被销毁后,Stream虽然还在,但已经不能用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

ArcGIS Pro基础:软件的常用设置:中文语言、自动保存、默认底图

上图所示&#xff0c;在【选项】&#xff08;Options&#xff09;里找到【语言】设置&#xff0c;将语言切换为中文选项&#xff0c;记得在安装软件时&#xff0c;需要提前安装好ArcGIS语言包。 上图所示&#xff0c;在【选项】里找到【编辑】设置&#xff0c;可以更改软件默认…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

ISA95 企业控制集成标准

ANSI/ISA-95 企业控制系统集成介绍及其全系列最新标准下载&#xff08;转&#xff09;https://www.cnblogs.com/TonyJia/p/17616347.html ANSI 1. 综述 ISA-95 简称S95&#xff0c;也有称作SP95。ISA-95 是企业系统与控制系统集成国际标准&#xff0c;由国际自动化学会(ISA…

react最好用的swiper插件和拖动插件 react-tiny-slider react-draggable

react移动端项目&#xff0c;其实有挺多的ui框架的&#xff0c;但是我们公司的项目&#xff0c;都是自己封装的ui库&#xff0c;又不可能为了一个轮播图就去再安装一个ui库 所以找了很多的轮播插件&#xff0c;都是不能满足需求 最后找到了它&#xff0c;react-tiny-slider&…

1 什么是linux驱动

1 目录 1 一、什么是linux驱动&#xff1f; 1、驱动的作用 2、 3、驱动的分类 4、linux源码 5、最简单的linux驱动 二、如何编译驱动程序 -- 有两种编译方法&#xff1a; -- 什么是Linux内核模块&#xff1f; -- Linux内核模块的编译 一、什么是linux驱动&#xff…

原生HTML5、CSS、JavaScript实现简易网易云音乐播放

1.效果图 2.源码 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网易云音乐</title><link rel"stylesheet" href"../CSS/index.css"> </head>…

C++:新枚举与新结构

一、枚举 &#xff08;一&#xff09;C枚举&#xff1f;真整数&#xff01; 考虑下面的程序 #include <stdio.h> #include <stdlib.h>typedef enum {spring, summer, autumn, winter} Season;void printSeason(Season season){switch(season){case spring:print…

【Java学习】实现图书管理系统

所属专栏&#xff1a;Java学习 &#x1f341;1. 功能演示 用户分为普通用户和管理员&#xff0c;登录进系统之后可以对图书进行一系列操作&#xff0c;此时我们要明白&#xff0c;对图书的操作是通过书架来执行的&#xff0c;我们平常在图书馆上借书就是在书架上 &#x1f…

简简单单用用perf

实践前提&#xff1a;正确安装 perf 和 FlameGrap。若没安装&#xff0c;心领神会亦可。 1 示例程序 #define m_loop() ({ for(int i0; i < 1000000; i); })void fb(void) {m_loop(); }void fj(void) {fb(); }void fy(void) {m_loop(); }void loop(void) {for (;;) {fy();…

实习教训,永远铭记

1.毕了业宁宁可收入低一点&#xff0c;但一定去那种开发产品有规章制度&#xff0c;有流程规范的公司。 永远不接受小公司&#xff0c;没有任何规范可言的小公司&#xff01;&#xff01;&#xff01;&#xff01; 永远不接受小公司&#xff0c;没有任何规范可言的小公司&…

Docker手动在虚拟机上部署前端、后端和数据库

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、项目准备 二、MySQL数据库部署 三、SpringBoot后端部署 四、Vue前端部署 一、项目准备 准备数据库、前端项目、后端项目。 准备一…

YOLOv8跑通POSE分类--姿态检测coco8-pos数据集

目录 1.数据集格式如下 2.训练的代码如下 3.训练的网络如下 4.训练的结果如下 简单留个备注&#xff0c;方便自己以后查找 1.数据集格式如下 txt里面的格式 类别 中心点x,y 宽高 姿态1的x,姿态1的y,姿态可见度。。。。 <class-index> <x> <y> <widt…

使用dockerDesktop下载x86,amd64,arm64镜像

开启梯子 修改dockerDesktop配置&#xff0c;将experimental的值设置成 true&#xff0c;意思是&#xff1a;开启manifest实验特性 重启docker后下载镜像 –platform后面就是架构版本&#xff0c;x86,amd64,arm64 C:\Users\dell> docker pull --platformarm64 nginx:late…

Linux--C语言之指针

文章目录 一、指针的引入二、指针概述三、指针变量&#xff08;一&#xff09;指针变量的定义语法&#xff1a;举例&#xff1a;注意&#xff1a; &#xff08;二&#xff09;指针变量的使用1. 指针变量的赋值2. 操作指针变量的值3. 操作指针变量指向的值4. 两个有关运算符的使…

【DA】《Augmentation for small object detection》

arXiv-2019 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Oversampling4.2 Augmentation4.3 Copy-Pasting Strategies 5 Experiments5.1 Datasets and Metrics5.2 Oversampling5.3 Augmentation5.4 Copy-Pasting strategies5.4…

Python入门级[ 基础语法 函数... ] 笔记 例题较多

本文是刚学习Python的笔记&#xff0c;当时使用的编辑器是交互式编程&#xff0c;所以很多代码可能在你们的编译器上面不能运行&#xff0c;我用快引用引起来了&#xff0c;还需要大家自己动手试一试。 内容涉及的比较简单&#xff0c;主要还是Python的语法部分&#xff1a;三…

Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Solidworks二次开发:变螺距螺旋线

在帮助文档中&#xff0c;找到变螺距螺旋线的VBA代码&#xff0c;如下&#xff1a; --------------------------------------------------------------Preconditions: Verify that the specified part document template exists.Postconditions:1. Creates a variable-pitch h…