ネオンを使ってiPhone4にドット積関数を実装しようとしています。このチュートリアルに基づいて:http : //www.delmarnorth.com/microwave/requirements/neon-test-tutorial.pdfXCode4.5で以下を試しました。nruns = 1に設定すると、機能します。つまり、ネオンから標準のC++バージョンと同じ答えが得られます。ただし、nruns> 1を設定すると、何かが破損してゴミが出てきます(たとえば、dotProduct()を最初に呼び出した後に配列の要素を出力すると、それらが破損します)。私はネオンの経験がないことを告白しなければなりませんが、必要なのはこのドット積を実行できることだけです!誰か考えがありますか?
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 );
}