memcpy速度太慢該怎么辦

今天就跟大家聊聊有關(guān)memcpy速度太慢該怎么辦,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注于南岸企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城系統(tǒng)網(wǎng)站開發(fā)。南岸網(wǎng)站建設(shè)公司,為南岸等地區(qū)提供建站服務(wù)。全流程專業(yè)公司,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

??memcpy是C/C++的一個(gè)標(biāo)準(zhǔn)函數(shù),原型void *memcpy(void *dest, const void *src, size_t n),用于從源src所指的內(nèi)存地址的起始位置開始拷貝n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。
?neon是適用于ARM Cortex-A系列處理器的一種128位SIMD(Single Instruction, Multiple Data,單指令、多數(shù)據(jù))擴(kuò)展結(jié)構(gòu)。neon支持一次指令處理多個(gè)數(shù)據(jù),比如處理8個(gè)8-bit、4個(gè)16-bit、2個(gè)32-bit或1個(gè)64-bit。正是這個(gè)特性可以用于加速內(nèi)存拷貝。
?在正常情況下memcpy的性能已經(jīng)足夠使用了,但是當(dāng)我們因?yàn)槟承┰蛟诳截惔髢?nèi)存遇到瓶頸的時(shí)候,可以考慮使用neon來加速內(nèi)存拷貝。比如我在使用glMapBufferRange把PBO從GPU內(nèi)存映射到CPU內(nèi)存的時(shí)候遇到了耗時(shí)問題,拷貝921600字節(jié)的數(shù)據(jù)需要30ms,在使用neon后,內(nèi)存拷貝耗時(shí)直接降低到了4ms,相差將近8倍。事實(shí)上,在arm平臺上使用neon指令可以高效提升數(shù)據(jù)并行處理性能,而不僅僅局限于內(nèi)存拷貝。google開源的libyuv內(nèi)部也使用了neon指令來并行處理數(shù)據(jù)。

使用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架構(gòu)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//其它架構(gòu)使用memcpy     memcpy(destBuffer, src, length);#endif

Android mk開啟neon

#arm架構(gòu)增加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=1endif#開啟兩個(gè)架構(gòu)的neon支持(x86可以通過將neon轉(zhuǎn)為sse間接支持)ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86))LOCAL_ARM_NEON := trueendifLOCAL_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)

??事實(shí)上并不是只有arm架構(gòu)才支持SIMD,x86也是支持的(SSE),并且Android也提供了適用于x86的NEON_2_SSE.h。x86并不直接支持neon指令,而是通過這個(gè)頭文件將其轉(zhuǎn)為sse指令,以提供與neon相同的api。

看完上述內(nèi)容,你們對memcpy速度太慢該怎么辦有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

文章名稱:memcpy速度太慢該怎么辦
網(wǎng)站地址:http://www.muchs.cn/article46/pieehg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、企業(yè)建站、品牌網(wǎng)站建設(shè)、網(wǎng)站改版域名注冊、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管