请问自己写了个高效率的memcpy,怎么不使用库里面的memcpy
测试了一下libc.a里面的memcpy和自己用汇编写的memcpy,速度分别为24MB/s 和85MB/s,就想用自己的memcpy代替库里面的memcpy,但是又想使用libc.a里面的其他库函数不知道要怎么做,有知道的朋友吗 my_memcpy原来的因该不是 weak修饰 自己写地memcpy是什么样地 上传学习下 不就是一个FOR循环么?用汇编的话就是几个跳转吧? 按理 通过link参数配置应该能解决吧, 我没有整过, 你可以搜索一下试试 yuyu87 发表于 2021-12-8 11:01
不就是一个FOR循环么?用汇编的话就是几个跳转吧?
for比较慢,应该用的是大块mov。另外x86下面gcc实际会用movs指令,这个指令效率其实没有mmx/sse/avx内存搬运效率高。 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倍 先了解一下 C 怎么调用汇编子程序(函数),然后用个宏定义给自己的函数起个官方的名称,在需要的时候启用宏,不需要的时候注释掉宏。 我现在在工程配置文件里面定义了一个 #definememcpy mymemcpy,
绕路暂时解决了,但总感觉应该有更好的方式去解决,之前有朋友说用__wrap_xxx和__real_xxx,但是我用的时候提示我__wrap不存在是否用__wrapv代替,但是我用__wrapv又不行 本帖最后由 foxpro2005 于 2021-12-8 12:46 编辑
官方那个内部是按字节U8处理的(应该是为了通用性考虑的),自己写的如果是32平台,for循环肯定都比它快
如果有带DMA,直接ram2ram,估计还更快{:lol:}
链接时会优先使用你自己实现的函数,再调用库里面的 smilepppp 发表于 2021-12-8 11:53
我现在在工程配置文件里面定义了一个 #definememcpy mymemcpy,
绕路暂时解决了,但总感觉应该有更好的方式 ...
按照 linux 之父 Linus Torvalds 大佬的说法:
他讨厌在 linux 底层的 C 中引入 C++ 的不确定性,那是一场灾难 ...
所以要看你的目标是什么?
效率和准确,还是优雅与简洁?
俗话说 ~ 字数越少,事情越大! foxpro2005 发表于 2021-12-8 12:44
官方那个内部是按字节U8处理的(应该是为了通用性考虑的),自己写的如果是32平台,for循环肯定都比它快
如 ...
dma我试过,慢得多,内存到内存似乎只能跑到主频的1/20?
不过好在不占用cpu,某些场合可能会有用。 tomzbj 发表于 2021-12-8 13:07
dma我试过,慢得多,内存到内存似乎只能跑到主频的1/20?
不过好在不占用cpu,某些场合可能会有用。 ...
那是因为你DMA级别调的太低,调到最高,比CPU快 yuyu87 发表于 2021-12-8 15:40
那是因为你DMA级别调的太低,调到最高,比CPU快
STM32啥型号?
一般内存-外设模式就算是VeryFast也就能跑到主频的1/6左右, 内存到内存还要慢得多, 总不能把总线全占完吧
你实测了再说吧
用32位Copy或DMA,是会快很多。
看你用来干什么了 实测其实直接用cpu 复制比dma要快一倍 多哦
页:
[1]