use*_*363 6 c optimization performance function
我正在寻找以下功能中最快的优化,而不是进入装配,因为它似乎是我的应用程序的瓶颈.请记住,以下函数已经内联声明.
定义:P = 10,N = 240
void autocorrelation( int32_t *data , float *r){
for ( int m=0 ; m < P+1 ; m++)
{
register float temp = 0;
for ( int n=0 ; n<N-m ; n++)
{
temp += (float)(data[n])*(float)(data[n+m]);
}
r[m] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
谢谢!
编辑:
部件:
temp += (float)(data[n])*(float)(data[n+m]);
800063A8 lddsp R8, SP[0x0]
800063AA add R1, R2, R8<<0
800063AE ld.w R12, R1[R7<<0]
800063B2 mcall 0x80006f58
800063B6 mov R4, R12
800063B8 ld.w R12, R2[R7<<0]
800063BC mcall 0x80006f58
800063C0 mov R11, R12
800063C2 mov R12, R4
800063C4 mcall 0x80006f5c
800063C8 mov R11, R12
800063CA mov R12, R5
800063CC mcall 0x80006f60
800063D0 mov R5, R12
for ( int n=0 ; n<N-m ; n++)
800063D2 sub R6, -1
800063D4 sub R7, -4
800063D6 cp.w R6, R3
800063D8 brne 0x800063ae
r[m] = temp;
800063DA ld.w R10, PC[2954]
800063DE lddsp R9, SP[0x0]
800063E0 st.w R10[R9<<0], R5
800063E4 sub R0, 1
800063E6 sub R9, -4
800063E8 stdsp SP[0x0], R9
for ( int m=0 ; m < P+1 ; m++)
800063EA cp.w R0, 229
800063EE breq 0x800063fc
800063F0 mov R3, R0
for ( int n=0 ; n<N-m ; n++)
800063F2 cp.w R0, 0
800063F4 brgt 0x800063a2
800063F8 mov R5, 0
800063FA rjmp 0x800063da
Run Code Online (Sandbox Code Playgroud)
////////////////////////////////////////////////// //////////////////////////////
所以我将代码更改为:
void autocorrelation( float *data , float *r){
for ( int m=0 ; m < P+1 ; m++)
{
register float temp = 0;
for ( int n=0 ; n<N-m ; n++)
{
temp += data[n]*data[n+m];
}
r[m] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
并将时间减少三分之一(每个刻度为1/16000Hz) - 最初 - 现在108个刻度 - 70个刻度
新装配:
temp += data[n]*data[n+m];
800063C2 add R2, R3, R0<<0
800063C6 ld.w R11, R3[R7<<0]
800063CA ld.w R12, R2[R7<<0]
800063CE mcall 0x80006f68
800063D2 mov R11, R12
800063D4 mov R12, R5
800063D6 mcall 0x80006f6c
800063DA mov R5, R12
for ( int n=0 ; n<N-m ; n++)
800063DC sub R6, -1
800063DE sub R7, -4
800063E0 cp.w R6, R4
800063E2 brne 0x800063c6
r[m] = temp;
800063E4 ld.w R9, PC[2960]
800063E8 st.w R9[R0<<0], R5
800063EC sub R1, 1
800063EE sub R0, -4
for ( int m=0 ; m < P+1 ; m++)
800063F0 cp.w R1, 229
800063F4 breq 0x80006402
800063F6 mov R4, R1
for ( int n=0 ; n<N-m ; n++)
800063F8 cp.w R1, 0
800063FA brgt 0x800063bc
800063FE mov R5, 0
80006400 rjmp 0x800063e4
Run Code Online (Sandbox Code Playgroud)
////////////////////////////////////////////////// //// FINAL最终解决方案:(再次更改)
我结合了标记的解决方案并将循环与我编写的应用程序解开并保持在64位直到最后,性能从最后的60ticks增加到20ticks.超过6个具有相同调整功能的功能,我能够从最初的250个时钟点到50个刻度处开始拉动,我的乒乓缓冲器需要在160个刻度内完成所有操作,所以我有一些头房间:
void fastAutocorrelation( int64_t *data , float *r){
int64_t *temp;
int64_t *datan = data;
int64_t *datanm = data;
*temp = (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
*r++ = (float)(*temp)/int64ToFloat;
datan = data;
datanm = data + 1;
*temp = (*datan++)*(*datanm++);
*temp += (*datan++)*(*datanm++);
...
Run Code Online (Sandbox Code Playgroud)
我发现你通过移除石膏已经减少了一些。如果您正在寻找指针技巧,可以尝试一下这里的技巧。根据您的编译器,您的里程会有所不同:
void autocorrelation( float *restrict data, float *restrict r)
{
float *data_end = data + N;
for ( int m=0 ; m < P+1 ; m++)
{
float temp = 0;
for( float *data_n = data, *data_nm = data + m;
data_nm != data_end;
data_n++, data_nm++ )
{
temp += *data_n * *data_nm;
}
r[m] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了关键字,restrict以便编译器知道data并且r不会重叠或指向同一事物。