我的代码模式是:
while(4096){
"ld1 { v8.4s, v9.4s,v10.4s, v11.4s}, [%2], #64 \n" // output"ld1 {v12.4s, v13.4s,v14.4s, v15.4s}, [%2], #64 \n" // output
"sub %1, %1, #128 \n"
"ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [%1], #16 \n" 计算部分;
"st1 {v12.4s, v13.4s,v14.4s, v15.4s}, [%2], #64 \n" // output "st1 { v8.4s, v9.4s, v10.4s, v11.4s},[%2], #64 \n" // output
}
如图所示,为什么存储st1部分所占耗时的比例将近42%?
噢噢,我直接获取PMU的cpu cycles的counter值来的,然后循环多次,所以大体还是蛮准的。
如果方便,是否可以把你的样例代码和测试代码共享出来?这样大家可以更准确的讨论问题。
在我看来,你的样例有一个问题是ld1和st1都会对地址写回,这会增加当前循环的st1和下一个循环的ld1的依赖。如果可以改成无依赖的版本,可能性能会好一些。