我正在尝试使用霓虹灯在 iPhone 4 上实现点积功能。基于本教程: http: //www.delmarnorth.com/microwave/requirements/neon-test-tutorial.pdf 我在 XCode 4.5 中尝试了以下内容。当我设置 nruns=1 时,它可以工作,即,我从霓虹灯中得到与标准 C++ 版本相同的答案。但是,当我设置 nruns > 1 时,某些东西会损坏并出现垃圾(例如,如果我在第一次调用 dotProduct() 后打印出 a 数组的元素,它们就会损坏)。我不得不承认我没有使用霓虹灯的经验,但我所需要的就是能够做这个点积!有人有什么想法吗?
float dotProduct ( float *a, float *b, int n) {
float sum=0.0f;
__asm__ volatile (
"vmov.f32 q8, #0.0 \n\t"
"vmov.f32 q9, #0.0 \n\t"
"1: \n\t"
"subs %3, %3, #8 \n\t"
"vld1.f32 {d0,d1,d2,d3}, [%1]! \n\t"
"vld1.f32 {d4,d5,d6,d7}, [%2]! \n\t"
"vmla.f32 q8, q0, q2 \n\t"
"vmla.f32 q9, q1, q3 \n\t"
"bgt 1b \n\t"
"vadd.f32 q8, q8, q9 \n\t"
"vpadd.f32 d0, d16, d17 \n\t"
"vadd.f32 %0, s0, s1 \n\t"
: "=w"(sum)
: "+r"(a), "+r"(b), "+r"(n)
: "q0", "q1", "q2", "q3", "q8", "q9");
return sum;
}
void test_dotProduct_neon()
{
int n=16, i, k;
int nruns = 2;
float dp;
float *a = new float[n];
float *b = new float[n];
for (i=0; i < n; i++) {
a[i] = (float) i;
b[i] = (float) (2*i);
}
for (i=0; i<nruns; i++) {
dp=0.0f;
for( k=0; k < n; k++) {
dp += a[k] * b[k];
}
}
printf(" C Result: %f\n", dp );
for (i=0; i<nruns; i++) {
dp = dotProduct( a, b, n);
}
printf(" Neon Result: %f\n", dp );
}