Ниже приведено IIR code. Мне нужно векторизовать код, чтобы я мог эффективно писать код NEON.Код для векторизации для эффективной реализации
Пример векторизации Non Векторизованных код
for(i=0;i<100;i++)
a[i] =a[i]*b[i]; //only one independent multiplication cannot take
//advantage of multiple multiplication units
Векторизованный код
for(i=0;i<25;i++)
{
a[i*4] =a[i*4]*b[i*4]; //four independent multiplications can use
a[(i+1)*4] =a[(i+1)*4]*b[(i+1)*4]; // multiple multiplication units to perform the
a[(i+2)*4] =a[(i+2)*4]*b[(i+2)*4]; //operation in parallel
a[(i+3)*4] =a[(i+3)*4]*b[(i+3)*4];
}
Пожалуйста, помогите мне в векторизации для цикла ниже, с тем, чтобы эффективно реализовать код, используя векторная способность аппаратного обеспечения (мое оборудование может одновременно выполнять 4 умножения).
main()
{
for(j=0;j<NUMBQUAD;j++)
{
for(i=2;i<SAMPLES+2 ;i++)
{
w[i] = x[i-2] + a1[j]* w[i-1] + a2[j]*w[i-2];
y[i-2] = w[i] + b1[j]* w[i-1] + b2[j]*w[i-2];
}
w[0]=0;
w[1] =0;
}
}
Сначала заставьте его работать. Я могу ошибаться, но, как правило, IIR получают доступ к более чем одному элементу в прямом цикле подачи. Доступ только к x [i-2]. –
Что сказал @Aki - нет смысла пытаться оптимизировать сломанный код. Для фильтров IIR у вас есть проблемные зависимости - на самом деле проще реализовать 4 отдельных фильтра IIR параллельно с 4-сторонним SIMD, а не пытаться применить SIMD к одному фильтру IIR. –
Это другая форма биквады IIR, и уравнения берутся по виду. Http://en.wikipedia.org/wiki/Digital_biquad_filter#Direct_Form_2 – Wolfrum