【发布时间】:2018-03-15 17:50:36
【问题描述】:
使用 ARM Cortex A15 板,我正在尝试通过使用 NEON 内在函数来优化完美运行的 C 代码。
编译器:ubuntu 12.04 上的 gcc 4.7
标志:-g -O3 -mcpu=cortex-a15 -mfpu=neon-vfpv4 -ftree-vectorize -DDRA7XX_ARM -DARM_PROC -DSL -funroll-loops -ftree-loop-ivcanon -mfloat-abi=hard
我想做下面的函数,它只是一个简单的加载->乘法->存储。
这里有一些参数: *input 是一个指向大小为 40680 的数组的指针,完成循环后,指针应保留当前位置,并通过输入指针对下一个输入流执行相同操作。
float32_t A=0.7;
float32_t *ptr_op=(float*)output[9216];
float32x2_t reg1;
for(i= 0;i< 4608;i+=4){
/*output[(2*i)] = A*(*input); // C version
input++;
output[(2*i)+1] = A*(*input);
input++;*/
reg1=vld1q_f32(input++); //Neon version
R_N=vmulq_n_f32(reg1,A);
vst1q_f32(ptr_op++,R_N);
}
我想知道我在这个循环中哪里出错了,因为它看起来很简单。
这是我的相同的汇编实现。我走的方向正确吗???
__asm__ __volatile__(
"\t mov r4, #0\n"
"\t vdup.32 d1,%3\n"
"Lloop2:\n"
"\t cmp r4, %2\n"
"\t bge Lend2\n"
"\t vld1.32 d0, [%0]!\n"
"\t vmul.f32 d0, d0, d1\n"
"\t vst1.32 d0, [%1]!\n"
"\t add r4, r4, #2\n"
"\t b Lloop2\n"
"Lend2:\n"
: "=r"(input), "=r"(ptr_op), "=r"(length), "=r"(A)
: "0"(input), "1"(ptr_op), "2"(length), "3"(A)
: "cc", "r4", "d1", "d0");
【问题讨论】:
-
问题是什么?有错误要报告吗?
-
您需要从上一个问题中了解 cmets。 NEON 做得不好(正如您在上面所做的那样)不会比标量指令执行得更好。您需要使用大量寄存器来隐藏管道和内存延迟。如果这没有意义,那么您需要在编写 NEON 代码之前了解它。
-
你能解释一下这些问题在我的循环中发生在哪里吗??
标签: gcc arm simd intrinsics neon