昇腾310内存拷贝测试
目的
从服务器将数据拷贝到昇腾310 ai卡
结论
数据进入到服务器后的内存不能直接用昇腾acl接口拷贝到AI卡。
需要
1)先用acl接口申请内存;
2) 将数据拷贝到acl申请的内存
3)用acl接口将数据拷贝到AI卡
makefile
# Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.# CMake lowest version requirement
cmake_minimum_required(VERSION 3.5.1)# project information
project(mem310p)set(LIB_PATH $ENV{NPU_HOST_LIB})
# Dynamic libraries in the stub directory can only be used for compilation
if (NOT DEFINED ENV{NPU_HOST_LIB})#set(LIB_PATH "/usr/local/Ascend/ascend-toolkit/latest/CANN-6.4/runtime/lib64/stub/aarch64")set(LIB_PATH "/usr/local/Ascend/nnrt/latest/runtime/lib64/stub/")message(STATUS "set default LIB_PATH: ${LIB_PATH}")
else ()message(STATUS "env LIB_PATH: ${LIB_PATH}")
endif()set(INC_PATH $ENV{NPU_HOST_INC})
# Dynamic libraries in the stub directory can only be used for compilation
if (NOT DEFINED ENV{NPU_HOST_INC})#set(INC_PATH "/usr/local/Ascend/ascend-toolkit/latest/CANN-6.4/runtime/include")# set(INC_PATH "/usr/local/Ascend/nnrt/6.2.RC2/aarch64-linux/include")# set(INC_PATH "/usr/local/Ascend/nnrt/7.0.0/aarch64-linux/include")set(INC_PATH "/usr/local/Ascend/nnrt/latest/aarch64-linux/include")message(STATUS "set default INC_PATH: ${INC_PATH}")
else ()message(STATUS "env INC_PATH: ${INC_PATH}")
endif()link_directories(${LIB_PATH}${LIB_PATH}/stub
)add_executable(mem310p#add_library(zh_sensor SHARED mem310p.c
)include_directories(mem310p${INC_PATH}${INC_PATH}/acl/media)add_compile_options(mem310p-O2-Wall-fpic
)# sns_zhtarget_link_libraries(mem310pacl_dvpp_mpi ascendclpthread
)
测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdint.h>
#include "acl/acl.h"
#define SAMPLE_PRT(fmt...) \do { \printf("[%s]-%d: ", __FUNCTION__, __LINE__); \printf(fmt); \} while (0)int SUCCESS = 0;
int FAILED = 1;
aclrtContext g_context = NULL;
uint32_t g_device_id = 0;typedef uint64_t u64;
typedef uint32_t u32;int32_t setup_acl_device()
{aclError aclRet = aclInit(NULL);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclInit fail with %d.\n", aclRet);return aclRet;}SAMPLE_PRT("aclInit succ.\n");aclRet = aclrtSetDevice(g_device_id);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtSetDevice %u fail with %d.\n", g_device_id, aclRet);aclFinalize();return aclRet;}SAMPLE_PRT("aclrtSetDevice(%u) succ.\n", g_device_id);aclRet = aclrtCreateContext(&g_context, g_device_id);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("acl create context failed with %d.\n", aclRet);aclrtResetDevice(g_device_id);aclFinalize();return aclRet;}SAMPLE_PRT("create context success\n");aclRet = aclrtGetCurrentContext(&g_context);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("get current context failed\n");aclrtDestroyContext(g_context);g_context = NULL;aclrtResetDevice(g_device_id);aclFinalize();return aclRet;}SAMPLE_PRT("get current context success\n");return SUCCESS;
}void destroy_acl_device()
{if (g_context){aclrtDestroyContext(g_context);g_context = NULL;aclrtResetDevice(g_device_id);aclFinalize();}
}struct dev_addr
{u64 phy_addr;void *virt_addr;u32 reg_len;void *mapbase;
};static void *ioremap_system_mem(struct dev_addr *addr)
{void *map_base;int fd;off_t target;target = addr->phy_addr;// if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)if ((fd = open("/dev/mem", O_RDWR | O_NONBLOCK)) == -1){fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno));return NULL ;}fflush(stdout);map_base = mmap(0, addr->reg_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd,target);if (map_base == (void *) -1){fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno));return NULL ;}fflush(stdout);addr->mapbase = map_base;addr->virt_addr = map_base;//(map_base + (target & MAP_MASK));close(fd);return addr->virt_addr;
}//#ifdef __ARM__
#if 1
void neon_memcpy(volatile void *dst, volatile void *src, int sz)
{if (sz & 63){sz = (sz & -64) + 64;}asm volatile("NEONCopyPLD: \n""sub %[dst], %[dst], #64 \n""1: \n""ldnp q0, q1, [%[src]] \n""ldnp q2, q3, [%[src], #32] \n""add %[dst], %[dst], #64 \n""subs %[sz], %[sz], #64 \n""add %[src], %[src], #64 \n""stnp q0, q1, [%[dst]] \n""stnp q2, q3, [%[dst], #32] \n""b.gt 1b \n": [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
}#else#include <arm_neon.h>void *neon_memcpy(void *dest, void *src, size_t count)
{int i;unsigned long *s = (unsigned long *)src;unsigned long *d = (unsigned long *)dest;for (i = 0; i < count / 64; i++){vst1q_u64(&d[0], vld1q_u64(&s[0]));vst1q_u64(&d[2], vld1q_u64(&s[2]));vst1q_u64(&d[4], vld1q_u64(&s[4]));vst1q_u64(&d[6], vld1q_u64(&s[6]));d += 8;s += 8;}return dest;
}#endif
//#endifstruct timeval start_time;
struct timeval end_time;
double elapsed_time = 0.0;static double elapsed(struct timeval start_time, struct timeval end_time)
{elapsed_time = (end_time.tv_sec * 1000000 + end_time.tv_usec - start_time.tv_sec* 1000000 - start_time.tv_usec);return elapsed_time;
}int32_t main(int32_t argc, char *argv[])
{int ret = SUCCESS;aclError aclRet = ACL_SUCCESS;// acl资源初始化ret = setup_acl_device();if (ret != SUCCESS){SAMPLE_PRT("Setup Device failed! ret code:%#x\n", ret);return FAILED;}struct dev_addr atu_addr;//atu_addr.phy_addr = 0x2000000000;atu_addr.phy_addr = 0x2200000000; //0x22 0000 0000atu_addr.virt_addr = 0;atu_addr.reg_len = 0x2000000;size_t g_memory_size = 4752 * 3795;if (NULL == ioremap_system_mem(&atu_addr)){printf("ioremap fail\n");return -1;}void *host_buffer = NULL;void *host_buffer1 = NULL;void *device_buffer = NULL;void *my_host_buffer = NULL;my_host_buffer = malloc(g_memory_size);if (NULL == my_host_buffer){printf("malloc fail\n");return 0;}memset((unsigned char *)my_host_buffer, 0xaa, g_memory_size);memset((unsigned char *)atu_addr.virt_addr, 0x55, g_memory_size);// 申请device内存aclRet = aclrtMalloc(&device_buffer, g_memory_size, ACL_MEM_MALLOC_HUGE_FIRST);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtMalloc failed\n");}// 申请host内存aclRet = aclrtMallocHost(&host_buffer, g_memory_size);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtMallocHost failed\n");}// 申请host内存aclRet = aclrtMallocHost(&host_buffer1, g_memory_size);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtMallocHost failed\n");}gettimeofday(&(start_time), NULL);memcpy(host_buffer1, (unsigned char *)atu_addr.virt_addr, g_memory_size);gettimeofday(&(end_time), NULL);elapsed_time = elapsed(start_time, end_time);// 内存拷贝H2DaclRet = aclrtMemcpy(device_buffer, g_memory_size,host_buffer1 /* atu_addr.virt_addr*/, g_memory_size, ACL_MEMCPY_HOST_TO_DEVICE);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtMemcpy H2D failed\n");}printf("....,dma time %f\n", elapsed_time);// 内存拷贝D2HaclRet = aclrtMemcpy(host_buffer, g_memory_size, device_buffer,g_memory_size, ACL_MEMCPY_DEVICE_TO_HOST);if (aclRet != ACL_SUCCESS){SAMPLE_PRT("aclrtMemcpy D2H failed\n");}SAMPLE_PRT("\data is %x\n", *(unsigned char *)host_buffer);if (munmap(atu_addr.mapbase, atu_addr.reg_len) == -1){printf("un ioremap fail\n");return -1;}// 释放al资源destroy_acl_device();SAMPLE_PRT("run success!\n");return SUCCESS;
}
上述测试代码,测试从mmap映射的内存到acl分配的内存,耗时70几个ms,这是不正确的。
耗时分析
待续。。。。
相关文章:
昇腾310内存拷贝测试
目的 从服务器将数据拷贝到昇腾310 ai卡 结论 数据进入到服务器后的内存不能直接用昇腾acl接口拷贝到AI卡。 需要 1)先用acl接口申请内存; 2) 将数据拷贝到acl申请的内存 3)用acl接口将数据拷贝到AI卡 makefile # Copyri…...
‘$store‘ is not defined.
vueX不知道是否发挥作用?this.$store获取不到store/index.js中的数据 原因:版本问题 vuex版本不对,获取不到store 默认版本说明vuevue3vueXvue4vuex4只能在vue3中使用 vue默认vue3版本,vuex默认vuex4版本,vuex4只能…...
如何利用Linux提升工作效率和安全性?
Linux,作为一款自由和开放源代码的操作系统,已经在全球范围内得到了广泛的应用。无论是服务器、云计算、物联网,还是超级计算机,Linux都扮演着重要的角色。本文将深入探讨Linux的应用场景,以及如何利用Linux提升工作效…...
初始Linux 和 各种常见指令
目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要): 06.rmdir指令 && rm 指令(重要): …...
【稀疏矩阵】使用torch.sparse模块
文章目录 稀疏矩阵的格式coocsrcsc Construction of Sparse COO tensorsConstruction of CSR tensorsLinear Algebra operations(稀疏与稠密之间混合运算)Tensor methods and sparse(与稀疏有关的tensor成员函数)coo张量可用的ten…...
如何增加谷歌网站曝光率?
增加谷歌网站曝光率其实就是让更多的人在搜索相关内容时,能看到你的网站。首先你就要搞清楚用户在搜索什么,这样才能把正确的内容呈现在他们面前。首先,你得站在用户的角度思考,想想他们在搜索与你网站相关的信息时,可…...
虚幻中的c++(持续更新)
文章目录 虚幻中的cUPROPERTY参数 UFUNCTION参数 虚幻中的c UPROPERTY 是虚幻中用于声明属性的宏,它用于标记某个属性是一个虚幻托管的属性,并且可以在编辑器中进行访问和操作。其提供了一系列参数,用于定义属性的各种行为,例如是…...
83-MySQL 索引有几种
MySQL中的索引主要有以下几种: 普通索引:最基本的索引类型,没有唯一性的限制,可以通过多个字段创建复合索引。 唯一索引:与普通索引类似,但区别在于唯一索引的每一个索引值只对应唯一的数据记录。 主键索…...
文献解读-The trans-omics landscape of COVID-19
关键词:流行病学;基因测序;变异检测; 文献简介 标题(英文):The trans-omics landscape of COVID-19 标题(中文):COVID-19的跨组学全景 发表期刊:…...
Unity核心实践小项目
要源码包的私信我。 简介 衔接Unity核心学习后的实操小项目 需求分析 准备工作 面板基类 为了能够控制一画布整体的透明度,所以需要给每个面板都添加一个 CanvasGroup组件 UI管理器 UGUI方面的参数设置 开始场景 场景搭建 直接用资源包搭建好的场景:…...
Avaloia 实现国产麒麟系统中文显示界面
最近在搞一个国产麒麟系统的接口对接,因为,接口内含复杂的签名验证,而且还是离线环境,所以,postman不是很好用。 就想着哪个方式好一些,主要是有选择图片的操作,所以,在Electron和A…...
pytest 生成allure测试报告
allure的安装 github地址 allure资产列表 windows下载.zip,解压并配置环境变量PATH;linux下载tar.gz,解压配置; allure作为pytest插件 # 安装 pip install allure-pytest# 执行单元测试,生成allure测试数据&…...
查询GPU版本以及PyTorch中使用单GPU和多GPU
文章目录 多GPU介绍GPU可用性及版本检查使用单个GPU使用多个GPU多GPU介绍 多GPU是指使用多个显卡来同时进行计算,以加速深度学习模型的训练和推断。每个GPU都有自己的内存和计算能力,通过同时利用多个GPU可以并行地执行模型的计算,从而提高整体的计算效率。 GPU可用性及版…...
基于SpringBoot+Vue的线上考试系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的线上考试…...
动手学深度学习(pytorch土堆)-02TensorBoard的使用
1.可视化 代码使用了 torch.utils.tensorboard 将数据记录到 TensorBoard 以便可视化。具体来说,它将标量数据记录到目录 logs 中,使用的是 SummaryWriter 类。 代码分解如下: SummaryWriter("logs"):初始化一个 Ten…...
STM3学习记录
一、串口 1.串口定义,将串口相关寄存器的首地址强制转化为串口结构体,方便通过结果体访问串口的寄存器 #define __IO volatile /*!< Defines read / write permissions */ typedef struct {__IO uint32_t SR; /*!< US…...
【网络】应用层协议-http协议
应用层协议-http协议 文章目录 1.Http协议1.1什么是http协议1.2认识URL1.3urlencode和urldecode1.4HTTP请求协议格式1.5HTTP响应协议格式1.6HTTP常见的Header1.7HTTP常见状态码1.8HTTP的方法1.8根据url调取对应的服务 2.cookie和session2.1cookie2.2session 3.HTTPS协议3.1对称…...
【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation
文章目录 1、任务描述2、MASR RCNN 网络结构3、方法实现4、结果展示5、涉及到的库getPerfProfile 6、参考 1、任务描述 利用 mask rcnn 网络,进行图片和视频的目标检测和实例分割 2、MASR RCNN 网络结构 3、方法实现 # Copyright (C) 2018-2019, BigVision LLC (L…...
通过 Python 使用 Pexels图片库 API 打造个性化壁纸应用
在数字时代,照片不仅仅是回忆的载体,它们还是我们生活的美丽装饰品。想象一下,如果你能轻松地将世界上最美的免费图片应用到你的应用程序中,岂不是让你的程序立刻闪亮起来?好消息是,这不仅仅是一个梦想。今…...
多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)
一、CopyOnWriteArrayList(一) 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数 组(快照)上进行的࿰…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
