日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2024/7/5 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。有興趣的同學可以研究一下。

總結

以上是生活随笔為你收集整理的Android显存到内存拷贝耗时,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。