当前位置: 首页 > news >正文

昇腾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&#xff09;先用acl接口申请内存&#xff1b; 2&#xff09; 将数据拷贝到acl申请的内存 3&#xff09;用acl接口将数据拷贝到AI卡 makefile # Copyri…...

‘$store‘ is not defined.

vueX不知道是否发挥作用&#xff1f;this.$store获取不到store/index.js中的数据 原因&#xff1a;版本问题 vuex版本不对&#xff0c;获取不到store 默认版本说明vuevue3vueXvue4vuex4只能在vue3中使用 vue默认vue3版本&#xff0c;vuex默认vuex4版本&#xff0c;vuex4只能…...

如何利用Linux提升工作效率和安全性?

Linux&#xff0c;作为一款自由和开放源代码的操作系统&#xff0c;已经在全球范围内得到了广泛的应用。无论是服务器、云计算、物联网&#xff0c;还是超级计算机&#xff0c;Linux都扮演着重要的角色。本文将深入探讨Linux的应用场景&#xff0c;以及如何利用Linux提升工作效…...

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …...

【稀疏矩阵】使用torch.sparse模块

文章目录 稀疏矩阵的格式coocsrcsc Construction of Sparse COO tensorsConstruction of CSR tensorsLinear Algebra operations&#xff08;稀疏与稠密之间混合运算&#xff09;Tensor methods and sparse&#xff08;与稀疏有关的tensor成员函数&#xff09;coo张量可用的ten…...

如何增加谷歌网站曝光率?

增加谷歌网站曝光率其实就是让更多的人在搜索相关内容时&#xff0c;能看到你的网站。首先你就要搞清楚用户在搜索什么&#xff0c;这样才能把正确的内容呈现在他们面前。首先&#xff0c;你得站在用户的角度思考&#xff0c;想想他们在搜索与你网站相关的信息时&#xff0c;可…...

虚幻中的c++(持续更新)

文章目录 虚幻中的cUPROPERTY参数 UFUNCTION参数 虚幻中的c UPROPERTY 是虚幻中用于声明属性的宏&#xff0c;它用于标记某个属性是一个虚幻托管的属性&#xff0c;并且可以在编辑器中进行访问和操作。其提供了一系列参数&#xff0c;用于定义属性的各种行为&#xff0c;例如是…...

83-MySQL 索引有几种

MySQL中的索引主要有以下几种&#xff1a; 普通索引&#xff1a;最基本的索引类型&#xff0c;没有唯一性的限制&#xff0c;可以通过多个字段创建复合索引。 唯一索引&#xff1a;与普通索引类似&#xff0c;但区别在于唯一索引的每一个索引值只对应唯一的数据记录。 主键索…...

文献解读-The trans-omics landscape of COVID-19

关键词&#xff1a;流行病学&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;The trans-omics landscape of COVID-19 标题&#xff08;中文&#xff09;&#xff1a;COVID-19的跨组学全景 发表期刊&#xff1a…...

Unity核心实践小项目

要源码包的私信我。 简介 衔接Unity核心学习后的实操小项目 需求分析 准备工作 面板基类 为了能够控制一画布整体的透明度&#xff0c;所以需要给每个面板都添加一个 CanvasGroup组件 UI管理器 UGUI方面的参数设置 开始场景 场景搭建 直接用资源包搭建好的场景&#xff1a;…...

Avaloia 实现国产麒麟系统中文显示界面

最近在搞一个国产麒麟系统的接口对接&#xff0c;因为&#xff0c;接口内含复杂的签名验证&#xff0c;而且还是离线环境&#xff0c;所以&#xff0c;postman不是很好用。 就想着哪个方式好一些&#xff0c;主要是有选择图片的操作&#xff0c;所以&#xff0c;在Electron和A…...

pytest 生成allure测试报告

allure的安装 github地址 allure资产列表 windows下载.zip&#xff0c;解压并配置环境变量PATH&#xff1b;linux下载tar.gz&#xff0c;解压配置&#xff1b; allure作为pytest插件 # 安装 pip install allure-pytest# 执行单元测试&#xff0c;生成allure测试数据&…...

查询GPU版本以及PyTorch中使用单GPU和多GPU

文章目录 多GPU介绍GPU可用性及版本检查使用单个GPU使用多个GPU多GPU介绍 多GPU是指使用多个显卡来同时进行计算,以加速深度学习模型的训练和推断。每个GPU都有自己的内存和计算能力,通过同时利用多个GPU可以并行地执行模型的计算,从而提高整体的计算效率。 GPU可用性及版…...

基于SpringBoot+Vue的线上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的线上考试…...

动手学深度学习(pytorch土堆)-02TensorBoard的使用

1.可视化 代码使用了 torch.utils.tensorboard 将数据记录到 TensorBoard 以便可视化。具体来说&#xff0c;它将标量数据记录到目录 logs 中&#xff0c;使用的是 SummaryWriter 类。 代码分解如下&#xff1a; SummaryWriter("logs")&#xff1a;初始化一个 Ten…...

STM3学习记录

一、串口 1.串口定义&#xff0c;将串口相关寄存器的首地址强制转化为串口结构体&#xff0c;方便通过结果体访问串口的寄存器 #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 网络&#xff0c;进行图片和视频的目标检测和实例分割 2、MASR RCNN 网络结构 3、方法实现 # Copyright (C) 2018-2019, BigVision LLC (L…...

通过 Python 使用 Pexels图片库 API 打造个性化壁纸应用

在数字时代&#xff0c;照片不仅仅是回忆的载体&#xff0c;它们还是我们生活的美丽装饰品。想象一下&#xff0c;如果你能轻松地将世界上最美的免费图片应用到你的应用程序中&#xff0c;岂不是让你的程序立刻闪亮起来&#xff1f;好消息是&#xff0c;这不仅仅是一个梦想。今…...

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList&#xff08;一&#xff09; 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList&#xff0c;对其进行的修改操作都是在底层的一个复制的数 组&#xff08;快照&#xff09;上进行的&#xff0…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...