昇腾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,对其进行的修改操作都是在底层的一个复制的数 组(快照)上进行的࿰…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
