gpt4 book ai didi

arm - ARM/ NEON memcpy是否针对*未缓存*内存进行了优化?

转载 作者:行者123 更新时间:2023-12-05 00:29:30 26 4
gpt4 key购买 nike

我正在使用基于Xilinx Zynq 7000 ARM的SoC。我在DMA缓冲区(Need help mapping pre-reserved **cacheable** DMA buffer on Xilinx/ARM SoC (Zynq 7000))方面苦苦挣扎,所以我追求的一件事是更快的memcpy。

我一直在寻找使用Neon指令和内联asm为ARM编写更快的memcpy。无论glibc拥有什么,这都是可怕的,特别是如果我们要从一个精巧的DMA缓冲区进行复制。

我从各种来源整理了自己的复制功能,包括:


Fast ARM NEON memcpy
arm Inline assembly in gcc
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html


对我而言,主要区别在于我试图从未缓存的缓冲区进行复制,因为它是DMA缓冲区,而ARM对缓存的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");
}


我做的主要事情是省去了预取指令,因为我认为这对未缓存的内存毫无用处。

这样做导致glibc memcpy的速度提高了4.7倍。速度从大约70MB /秒增加到大约330MB /秒。

不幸的是,这不快于缓存内存中的memcpy,对于系统memcpy而言,运行速度约为720MB /秒,对于Neon版本,其运行速度约为620MB /秒(可能速度较慢,因为我的memcpy可能不进行预取)。

谁能帮助我找出可以弥补这一性能差距的方法?

我尝试了很多事情,例如一次复制更多,两次加载后再两次存储。我可以尝试预取只是为了证明它没有用。还有其他想法吗?

最佳答案

您可以尝试使用缓冲内存而不是非缓存内存。

关于arm - ARM/ NEON memcpy是否针对*未缓存*内存进行了优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com