我需要改进一个循环,因为它被我的应用程序调用了数千次。我想使用Neon来完成这个任务,但我不知道从哪里开始。
假设/前提条件:
- `w` 总是 320 (16/32 的倍数) - `pa` 和 `pb` 是 16 字节对齐的 - `ma` 和 `mb` 是正数。
这个尝试进行向量化的方法效果不佳,也不安全(缺少清除器),但是演示了我想要做的事情:
假设/前提条件:
- `w` 总是 320 (16/32 的倍数) - `pa` 和 `pb` 是 16 字节对齐的 - `ma` 和 `mb` 是正数。
int whileInstruction (const unsigned char *pa,const unsigned char *pb,int ma,int mb,int w)
{
int sum=0;
do {
sum += ((*pa++)-ma)*((*pb++)-mb);
} while(--w);
return sum;
}
这个尝试进行向量化的方法效果不佳,也不安全(缺少清除器),但是演示了我想要做的事情:
int whileInstruction (const unsigned char *pa,const unsigned char *pb,int ma,int mb,int w)
{
asm volatile("lsr %2, %2, #3 \n"
".loop: \n"
"# load 8 elements: \n"
"vld4.8 {d0-d3}, [%1]! \n"
"vld4.8 {d4-d7}, [%2]! \n"
"# do the operation: \n"
"vaddl.u8 q7, d0, r7 \n"
"vaddl.u8 q8, d1, d8 \n"
"vmlal.u8 q7, q7, q8 \n"
"# Sum the vector a save in sum (this is wrong):\n"
"vaddl.u8 q7, d0, r7 \n"
"subs %2, %2, #1 \n" // Decrement iteration count
"bne .loop \n" // Repeat unil iteration count is not zero
:
: "r"(pa), "r"(pb), "r"(w),"r"(ma),"r"(mb),"r"(sum)
: "r4", "r5", "r6","r7","r8","r9"
);
return sum;
}