Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NEON vst存储速度非常慢,具体取决于地址_Assembly_Memory_Optimization_Neon_Imx6 - Fatal编程技术网

Assembly NEON vst存储速度非常慢,具体取决于地址

Assembly NEON vst存储速度非常慢,具体取决于地址,assembly,memory,optimization,neon,imx6,Assembly,Memory,Optimization,Neon,Imx6,我已经在汇编程序中编写了一个霓虹灯优化盒过滤器。它在i.MX6(cortex-a9)上运行。我现在想谈谈机器的内存带宽问题,但这并不能解释我的观察结果: 我的代码(内联汇编程序) 整个画面需要105毫秒,这导致每条指令需要25个cpu周期 只删除vst指令,该算法的速度高达9.5毫秒,这符合我对内存带宽的期望 现在我试着交换输入和输出缓冲区,对于相同数量的加载和存储,不到17毫秒!如果我预期会有不同,那么反过来说,因为输入缓冲区以前已经写入,所以它可能仍然在二级缓存中,可以更快地读取,但是从未缓

我已经在汇编程序中编写了一个霓虹灯优化盒过滤器。它在i.MX6(cortex-a9)上运行。我现在想谈谈机器的内存带宽问题,但这并不能解释我的观察结果:

我的代码(内联汇编程序)

整个画面需要105毫秒,这导致每条指令需要25个cpu周期

只删除vst指令,该算法的速度高达9.5毫秒,这符合我对内存带宽的期望

现在我试着交换输入和输出缓冲区,对于相同数量的加载和存储,不到17毫秒!如果我预期会有不同,那么反过来说,因为输入缓冲区以前已经写入,所以它可能仍然在二级缓存中,可以更快地读取,但是从未缓存的数据读取并存储到缓存中的速度要快6倍

两个缓冲区都有512位对齐,并位于相同的内存区域中,具有相同的缓存策略


您是否知道问题的原因或进一步检查的方法?

首先,这些不是“命令”,而是CPU指令。霓虹灯优化有许多方面你没有考虑到。正如您所观察到的,性能的最大障碍是内存延迟。您需要尽可能“隐藏”内存加载/存储延迟。要做的事情:使用pld指令(正确地)将数据预加载到缓存中,展开循环以留出时间加载/存储数据,交错指令以使寄存器/地址不依赖于最近的指令。@BitBank谢谢!将“命令”改为“指令”;对不起我的英语!我添加了一个新的观察结果:我完全交换了输入和输出缓冲区:17毫秒!!虽然你的提示是绝对正确的,但它们不是只会加快阅读速度吗?但我的问题是写作,而不是阅读。pld如何加速写作?为什么这取决于我用哪个缓冲区读,哪个缓冲区写?我看到还有一个
pldw
,我不知道。我将尝试一下,尽管我对缓存工作原理的了解并不表明这是有希望的。我在下面的循环中为缓冲区位置添加了一个
pldw
,但我没有感觉到任何差异。进一步展开有一点帮助(约2%)。无论如何谢谢你。需要看看你的pld使用-显示你的更新代码。您需要在阅读之前预加载(例如pld[addr]…vld1 xx[addr]不会产生任何效果)。
    "loopSlide: \n\t"
    "vld1.16 {q0-q1}, [%[add]]! \n\t"
    "vld1.16 {q2-q3}, [%[add]]! \n\t"
    "vsra.u16 q6, q0, #5 \n\t"
    "vsra.u16 q7, q1, #5 \n\t"
    "vsra.u16 q8, q2, #5 \n\t"
    "vsra.u16 q9, q3, #5 \n\t"
    "vld1.16 {q0-q1}, [%[sub]]! \n\t"
    "vld1.16 {q2-q3}, [%[sub]]! \n\t"
    "vshr.u16 q0, q0, #5 \n\t"
    "vsub.u16 q6, q6, q0 \n\t"
    "vshr.u16 q1, q1, #5 \n\t"
    "vsub.u16 q7, q7, q1 \n\t"
    "vst1.16 {q6-q7}, [%[sub]]! \n\t"
    "vshr.u16 q2, q2, #5 \n\t"
    "vsub.u16 q8, q8, q2 \n\t"
    "vshr.u16 q3, q3, #5 \n\t"
    "vsub.u16 q9, q9, q3 \n\t"
    "vst1.16 {q8-q9}, [%[sub]]! \n\t"

    "add %[dst], %[dst], %[inc] \n\t"
    "pldw [%[dst]] \n\t"
    "add %[add], %[add], %[inc] \n\t"
    "add %[sub], %[sub], %[inc] \n\t"
    "cmp %[src], %[end] \n\t"
    "bne loopSlide \n\t"