Android显存到内存拷贝耗时,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升...

封面出自:板栗懒得很

memcpy是C/C++的一个标准函数,原型void *memcpy(void *dest, const void *src, size_t n),用于从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。neon支持一次指令处理多个数据,比如处理8个8-bit、4个16-bit、2个32-bit或1个64-bit。正是这个特性可以用于加速内存拷贝。

在正常情况下memcpy的性能已经足够使用了,但是当我们因为某些原因在拷贝大内存遇到瓶颈的时候,可以考虑使用neon来加速内存拷贝。比如我在使用glMapBufferRange把PBO从GPU内存映射到CPU内存的时候遇到了耗时问题,拷贝921600字节的数据需要30ms,在使用neon后,内存拷贝耗时直接降低到了4ms,相差将近8倍。事实上,在arm平台上使用neon指令可以高效提升数据并行处理性能,而不仅仅局限于内存拷贝。google开源的libyuv内部也使用了neon指令来并行处理数据。

使用neon指令

#ifdef __ARM__

static void neon_memcpy(volatile unsigned char *dst, volatile unsigned char *src, int sz)

{

if (sz & 63)

sz = (sz & -64) + 64;

asm volatile (

"NEONCopyPLD: \n"

" VLDM %[src]!,{d0-d7} \n"

" VSTM %[dst]!,{d0-d7} \n"

" SUBS %[sz],%[sz],#0x40 \n"

" BGT NEONCopyPLD \n"

: [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");

}

#endif

由于并不是所有的armv7架构cpu都支持neon,所以这里增加cpufeatures库用来判断是否支持neon。下面是正确的使用方式。

#ifdef __ARM__

if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&

(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0){//支持NEON

neon_memcpy(destBuffer, src, length);

}else{

memcpy(destBuffer, src, length);

}

#else

//其它架构使用memcpy

memcpy(destBuffer, src, length);

#endif

Android mk开启neon

#arm架构增加neon支持

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

LOCAL_CFLAGS := -D__cpusplus -g -mfloat-abi=softfp -mfpu=neon -march=armv7-a -mtune=cortex-a8 -DHAVE_NEON=1

endif

#开启两个架构的neon支持(x86可以通过将neon转为sse间接支持)

ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86))

LOCAL_ARM_NEON := true

endif

LOCAL_STATIC_LIBRARIES := cpufeatures

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/cpufeatures)

Cmake开启neon

# 引入cpufeatures模块

include_directories(${ANDROID_NDK}/sources/android/cpufeatures)

if (${ANDROID_ABI} STREQUAL "armeabi-v7a")

set_property(SOURCE ${SOURCES} APPEND_STRING PROPERTY COMPILE_FLAGS " -mfpu=neon")

add_definitions("-DHAVE_NEON=1")

elseif (${ANDROID_ABI} STREQUAL "x86")

set_property(SOURCE ${SOURCES} APPEND_STRING PROPERTY COMPILE_FLAGS

" -mssse3 -Wno-unknown-attributes \

-Wno-deprecated-declarations \

-Wno-constant-conversion \

-Wno-static-in-inline")

add_definitions(-DHAVE_NEON_X86=1 -DHAVE_NEON=1)

endif ()

add_library(

yourLibrary

SHARED

${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c

)

事实上并不是只有arm架构才支持SIMD,x86也是支持的(SSE),并且Android也提供了适用于x86的NEON_2_SSE.h。x86并不直接支持neon指令,而是通过这个头文件将其转为sse指令,以提供与neon相同的api。有兴趣的同学可以研究一下。

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

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

相关文章

python中字典的常用操作命令及注意事项

目录 1、 使用update()合并字典 2、 使用del删除具有指定键的元素 3、 使用clear清除所有元素 4、 使用in判断是否存在 5、 使用[key]获取元素 6、 使用keys()获取所有键 7、 使用values()获取所有值 8、 使用items()获取所有键值对 9、运算符 1、 使用update()合并字…

[转载]MVVM、MVVMLight、MVVMLight Toolkit之我见

本文转自 陈希章-MVVM、MVVMLight、MVVMLight Toolkit之我见 MVVM、MVVMLight、MVVMLight Toolkit之我见 我想,现在已经有不少朋友在项目中使用了MVVMLight了吧,如果你正在做WPF,Silverlight,Windows Phone的开发,那么…

LeetCode 1058. 最小化舍入误差以满足目标(排序+贪心)

文章目录1. 题目2. 解题1. 题目 给定一系列价格 [p1,p2…,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn(pn)] 之和达到给定的目标值 target。每次舍入操作 Roundi(pi) 可以是向下舍 Floor(pi) 也可以是…

python中文件打开与关闭操作命令

1.文件打开与关闭 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件 open(文件名,访问模式)。 f open(test.txt, w) 文件打开模式: 访问模式 说明 r 以只读方式打开文件。文件的指针将会放在文件的开…

贪吃蛇html一维坐标,html贪吃蛇

HTML>var cdocument.getElementById("myCanvas");var time 160 ; //蛇的速度var cxtc.getContext("2d");var x y 8;var a 0; //食物坐标var t 20; //舍身长var map []; //记录蛇运行路径var size 8; //蛇身单元大小var direction 2; // 1 向上 …

LeetCode 1055. 形成字符串的最短路径(贪心)

文章目录1. 题目2. 解题1. 题目 对于任何字符串,我们可以通过删除其中一些字符(也可能不删除)来构造该字符串的子序列。 给定源字符串 source 和目标字符串 target,找出源字符串中能通过串联形成目标字符串的子序列的最小数量。…

html语言重点,HTML 基础重点(1)

什么是 HTML?HTML 全名是「超文本标记语言」(HyperText Markup Language),最初是欧洲核子研究中心为了即时分享研究成果而发明了 www 万维网和 HTML。网页开发,涉及三种技术:HTML、CSS 和 JS。其中 HTML 是用于定义「网页的结构和…

python中文件读取操作及注意事项

我们想要读一些文件,那么可以使用read()函数、readline()函数、或者readlines()函数。 其中read()函数可以一次性读取文件中所有的内容,也可以设置read(100),也就是一次读取100字节内容。读到文件结尾之后,再次调用read()会返回空…

[Kaggle] Housing Prices 房价预测

文章目录1. Baseline1. 特征选择2. 异常值剔除3. 建模预测2. 待优化特征工程房价预测 kaggle 地址 参考文章:kaggle比赛:房价预测(排名前4%) 1. Baseline import numpy as np import pandas as pd %matplotlib inline import m…

鼠标经过超链接文字变色

1、第一种方法 <a href"#" style" text-decoration:none;" onmouseover"javascript:this.style.colorred" onmouseout"javascript:this.style.colorblack">测试文字</a> 2、第二种方法 <style type"text/css"…

python中写入文件数据及文件定位操作命令

如果我们向文件中写入数据的话&#xff0c;我们可以使用write()函数。 写文件: #打开文件 f open("./index.cpp","w") #1. 写入数据 contents "hello world!" write(contents) #关闭文件 f.close() 文件定位&#xff1a; 函数名 含义 f.…

html炫酷弹幕特效,jQuery文字弹幕特效

特效描述&#xff1a;jQuery 文字弹幕特效。jQuery文字弹幕特效代码结构1. 引入JS2. HTML代码弹幕(点我呀&#xff01;&#xff01;)X让我来一个弹幕嘿嘿赞你哈哈51前端$(function(){init_screen();//alert("您好");$("#btn,.d_del").click(function(){$(&…

GridView 添加分害线

GridView没有setDivider方法,添加分割线时只能用spacing方法,但是这与圆角的GridView背景会冲突,百度google无果自己解决 (分割线是不通到边的) String[] sc scope.split(",");//when sc is not times 3, make it times 3.int rowNUM (sc.length%3)0? sc.length/3…

LeetCode 320. 列举单词的全部缩写(回溯/位运算)

文章目录1. 题目2. 解题2.1 回溯2.2 位运算1. 题目 请你写出一个能够举单词全部缩写的函数。 注意&#xff1a;输出的顺序并不重要。 示例&#xff1a; 输入: "word" 输出: ["word", "1ord", "w1rd", "wo1d", "wor1…

python中文件基本操作命令及注意事项

我们如果想通过程序去修改文件的名字、删除文件或文件夹、获得路径下的文件列表等等操作&#xff0c;python提供了有关这些操作的模块(os模块),需要导入模块import os. 1、修改文件名字&#xff0c;删除文件及目录相关操作: 函数名 描述 os.mkdir(dirname) 创建文件夹 os.…

IIS 7.0 安装SSL证书过程

记录一下维瑞的技术人员在IIS 7.0 安装SSL证书过程。本文参照维瑞技术中心SSL证书安装文档所编&#xff1a;http://www.willrey.com/support/ Windows 2008 - IIS 7.0 SSL证书安装指南 在获取SSL证书前要做制作生成CSR文件&#xff0c;也就是SSL证书请求文件&#xff0c;当收到…

华为nova4是不是鸿蒙系统,华为nova 4手机什么时候可以升级鸿蒙系统?鸿蒙系统nova4升级时间介绍...

华为鸿蒙系统已经上线好久了&#xff0c;许多用户都已经抢先一步体验了&#xff0c;而最近有一部分使用华为nova4手机的用户跑来问我&#xff0c;自己的手机什么可以升级鸿蒙系统吗&#xff1f;什么时候才能升级&#xff1f;首先可以肯定的告诉大家&#xff0c;可以。具体内容下…

LeetCode 548. 将数组分割成和相等的子数组(哈希set)

文章目录1. 题目2. 解题1. 题目 给定一个有 n 个整数的数组&#xff0c;你需要找到满足以下条件的三元组 (i, j, k) &#xff1a; 0 < i, i 1 < j, j 1 < k < n - 1子数组 (0, i - 1)&#xff0c;(i 1, j - 1)&#xff0c;(j 1, k - 1)&#xff0c;(k 1, n …

利用python创建学生管理系统软件代码赏析

目录 一、学生管理系统&#xff56;1.0&#xff08;需求&#xff09; 二、代码实现 一、学生管理系统&#xff56;1.0&#xff08;需求&#xff09; 1、添加学生信息 2、删除学生信息 3、查看学生信息 4、修改学生信息 二、代码实现 # 使用字典存储学生信息 students {}# 学…

html 仿ios选择控件,仿ios垂直滚动选择

注&#xff1a;必须在手机模式下才有效组件效果图组件效果图使用示例htmlcss.box{margin: 20px auto 20px auto;height: 188px;width: 90%;position: relative;}.box1{position: absolute;height: 100%;width: 60%;border-right: 1px solid #aaa;left: 0;}.box2{right: 0;posit…