我在实现memcpy(src,dst,sz)时遇到问题;适用于 neon
由于ARM SoC的DMA中没有缓存,从DMA中复制的速度会慢很多。
void my_copy(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");
}
这是一个代码为ARMv7由@蒂莫西米勒ARM/neon memcpy optimized for uncached memory?
由于ARM 64指令集没有VLDM和VSTM,
我使用的是LD和ST。但是,它和C语言中的memcpy()一样慢。
"NEONCopyPLD: \n"
"ld4 {v0.16b, v1.16b, v2.16b, v3.16b}, [%[src]], #64 \n"
"st4 {v0.16b, v1.16b, v2.16b, v3.16b}, [%[dst]], #64 \n"
"SUBS %[sz], %[sz],#0x40\n"
"BGT NEONCopyPLD \n"
在ARM 64中,除了使用LD& ST之外,是否有更好的方法?
1条答案
按热度按时间camsedfj1#
aarch64
具有针对未缓存区域的内存操作。(非临时)下面是我的建议:
对于缓存区域: