Neon で次のループを実装する必要があります。
int jump=4,c[8],i; //c[8] may be declared here
int *src,sum=0; //**EDIT:** src points to a 256 element array
for (i = 0; i < 4; i++)
{
sum = src[ i + 0 * jump] * c[0];//1
sum += src[ i + 1 * jump] * c[1];//2
sum += src[ i + 2 * jump] * c[2];//3
sum += src[ i + 3 * jump] * c[3];//4
sum += src[ i + 4 * jump] * c[4];//5
sum += src[ i + 5 * jump] * c[5];//6
sum += src[ i + 6 * jump] * c[6];//7
sum += src[ i + 7 * jump] * c[7];//8
src += 2; //9
}
**EDIT:**
The code can be shortened as-
int jump=4,c[8],i,j; //initialize array c
int *src,sum,a[256];//initialize array a
src=a;
for (i = 0; i < 4; i++)
{
sum=0;
for (j = 0; j < 8; j++)
{
int *p=src+ i + (j * jump);
sum += (*p)* c[j]; //sum += src[ i + j* jump] * c[j]
}
printf("Sum:%d\n",sum);
src += 2;
}
Just need to know a way to implement something like [%0]=[%0]+4 rather than [%0]!
主な最適化は、NEON のVMLA命令を使用して、1 ~ 8 の番号が付けられた命令を並行して実行することによって行われます。
- これを行うには、配列 c[8] をレジスタ q0 と q1 にロードし、配列 src[256] をレジスタ q2 と q3 にロードします。この後、VMLA、VADD、VPADD を使用して変数 sum の結果を取得します。
- 直面している問題は、配列src の要素を(src[0]、src[4]、src[8] などとして) ロードする方法です。なぜなら、配列をロードする唯一の方法は [%1] によるものだからです。 ! 配列を順番にロードするだけです(src [0]、src [1]、src [2]など)。
また、命令 9 でポインター src を 2 ずつインクリメントするにはどうすればよいでしょうか?