smilepppp 发表于 2021-12-8 08:43:15

请问自己写了个高效率的memcpy,怎么不使用库里面的memcpy

测试了一下libc.a里面的memcpy和自己用汇编写的memcpy,速度分别为24MB/s 和85MB/s,就想用自己的memcpy代替库里面的memcpy,但是又想使用libc.a里面的其他库函数
不知道要怎么做,有知道的朋友吗

442502587 发表于 2021-12-8 08:51:31

my_memcpy原来的因该不是 weak修饰

wowangru 发表于 2021-12-8 10:52:28

自己写地memcpy是什么样地   上传学习下

yuyu87 发表于 2021-12-8 11:01:59

不就是一个FOR循环么?用汇编的话就是几个跳转吧?

fclose 发表于 2021-12-8 11:16:07

按理 通过link参数配置应该能解决吧, 我没有整过, 你可以搜索一下试试

wye11083 发表于 2021-12-8 11:19:40

yuyu87 发表于 2021-12-8 11:01
不就是一个FOR循环么?用汇编的话就是几个跳转吧?

for比较慢,应该用的是大块mov。另外x86下面gcc实际会用movs指令,这个指令效率其实没有mmx/sse/avx内存搬运效率高。

smilepppp 发表于 2021-12-8 11:48:28

memcpy:
        /* determine copy direction */
        cmp                r1, r0
        bcc                .Lmemcpy_backwards

        moveq        r0, #0                                        /* quick abort for len=0 */
        moveq        pc, lr

        stmdb        sp!, {r0, lr}                        /* memcpy() returns dest addr */
        subs        r2, r2, #4
        blt                .Lmemcpy_fl4                        /* less than 4 bytes */
        ands        r12, r0, #3
        bne                .Lmemcpy_fdestul                /* oh unaligned destination addr */
        ands        r12, r1, #3
        bne                .Lmemcpy_fsrcul                        /* oh unaligned source addr */

.Lmemcpy_ft8:
        /* we have aligned source and destination */
        subs        r2, r2, #8
        blt                .Lmemcpy_fl12                        /* less than 12 bytes (4 from above) */
        subs        r2, r2, #0x14         
        blt                .Lmemcpy_fl32                        /* less than 32 bytes (12 from above) */
        stmdb        sp!, {r4}                                /* borrow r4 */

        /* blat 32 bytes at a time */
.Lmemcpy_floop32:       
        ldmia        r1!, {r3, r4, r12, lr}
        stmia        r0!, {r3, r4, r12, lr}
        ldmia        r1!, {r3, r4, r12, lr}
        stmia        r0!, {r3, r4, r12, lr}
        subs        r2, r2, #0x20         
        bge                .Lmemcpy_floop32

        cmn                r2, #0x10
        ldmgeia        r1!, {r3, r4, r12, lr}        /* blat a remaining 16 bytes */
        stmgeia        r0!, {r3, r4, r12, lr}
        subge        r2, r2, #0x10         
        ldmia        sp!, {r4}                                /* return r4 */


这种都是硬件相关的,但是性能测试下来是自带memcpy的5倍

chunjiu 发表于 2021-12-8 11:51:30

先了解一下 C 怎么调用汇编子程序(函数),然后用个宏定义给自己的函数起个官方的名称,在需要的时候启用宏,不需要的时候注释掉宏。

smilepppp 发表于 2021-12-8 11:53:33

我现在在工程配置文件里面定义了一个 #definememcpy mymemcpy,
绕路暂时解决了,但总感觉应该有更好的方式去解决,之前有朋友说用__wrap_xxx和__real_xxx,但是我用的时候提示我__wrap不存在是否用__wrapv代替,但是我用__wrapv又不行

foxpro2005 发表于 2021-12-8 12:44:43

本帖最后由 foxpro2005 于 2021-12-8 12:46 编辑

官方那个内部是按字节U8处理的(应该是为了通用性考虑的),自己写的如果是32平台,for循环肯定都比它快
如果有带DMA,直接ram2ram,估计还更快{:lol:}

liurangzhou 发表于 2021-12-8 12:45:30

链接时会优先使用你自己实现的函数,再调用库里面的

chunjiu 发表于 2021-12-8 12:50:53

smilepppp 发表于 2021-12-8 11:53
我现在在工程配置文件里面定义了一个 #definememcpy mymemcpy,
绕路暂时解决了,但总感觉应该有更好的方式 ...

按照 linux 之父 Linus Torvalds 大佬的说法:

他讨厌在 linux 底层的 C 中引入 C++ 的不确定性,那是一场灾难 ...

所以要看你的目标是什么?

效率和准确,还是优雅与简洁?

俗话说 ~ 字数越少,事情越大!

tomzbj 发表于 2021-12-8 13:07:10

foxpro2005 发表于 2021-12-8 12:44
官方那个内部是按字节U8处理的(应该是为了通用性考虑的),自己写的如果是32平台,for循环肯定都比它快
如 ...

dma我试过,慢得多,内存到内存似乎只能跑到主频的1/20?
不过好在不占用cpu,某些场合可能会有用。

yuyu87 发表于 2021-12-8 15:40:38

tomzbj 发表于 2021-12-8 13:07
dma我试过,慢得多,内存到内存似乎只能跑到主频的1/20?
不过好在不占用cpu,某些场合可能会有用。 ...

那是因为你DMA级别调的太低,调到最高,比CPU快

tomzbj 发表于 2021-12-8 15:50:02

yuyu87 发表于 2021-12-8 15:40
那是因为你DMA级别调的太低,调到最高,比CPU快

STM32啥型号?

一般内存-外设模式就算是VeryFast也就能跑到主频的1/6左右, 内存到内存还要慢得多, 总不能把总线全占完吧
你实测了再说吧

dog 发表于 2021-12-8 16:42:55

用32位Copy或DMA,是会快很多。
看你用来干什么了

smilepppp 发表于 2021-12-8 21:38:18

实测其实直接用cpu 复制比dma要快一倍 多哦
页: [1]
查看完整版本: 请问自己写了个高效率的memcpy,怎么不使用库里面的memcpy