Некоторое время назад я оптимизировал функцию radix2 с использованием встроенных функций SSE, и я почти близок к производительности FFTW. Итак, мой следующий шаг - оптимизировать функцию обратного переупорядочения бит, которую я нашел с помощью конечно, оригинальный код, и я хочу его оптимизировать. Оригинальный код следующим образом:Оптимизация перебора битов в обратном порядке с использованием Intel intrinsics
void bit_reverse_reorder(float *x,float *y, int N)
{
int bits=0;
int i, j, k;
float tempr, tempi;
//MAXPOW = 12
for (i=0; i<MAXPOW; i++)
if (pow_2[i]==N) bits=i;
for (i=0; i<N; i++)
{
j=0;
for (k=0; k<bits; k++)
if (i&pow_2[k]) j+=pow_2[bits-k-1];
if (j>i)
{
tempr=x[i];
tempi=y[i];
x[i]=x[j];
y[i]=y[j];
x[j]=tempr;
y[j]=tempi;
}
}
}
int main()
{
radix2(re,im,N);
bit_reverse_reorder(re,im,N);
}
PS: pow_2 [] представляет собой массив, содержащий предварительно вычисленное полномочия 2 (1,2,4,8,16,32, ...), N является число элементов = 4096, * x и * y представляет соответственно действительную и мнимую части каждого элемента входных данных.
Radix2 генерирует результаты, которые не упорядочены, поэтому заявленная функция изменит порядок результата.
Прежде всего, я не совсем понял, как работает бит-бит! Итак, я думаю, было бы хорошо, если бы кто-нибудь дал мне подсказки о том, как эта функция работает.
Во-вторых, я намерен использовать встроенные функции SSE для повышения производительности этой функции, есть ли какой-либо вектор из двух инструкций, которые могут быть использованы в цикле обмена?
Какова цель bit_reverse_reorder()? Название подразумевает, что он перемещает биты вокруг, но код заменяет элементы в массивах поплавков. Я смущен ... – lyst
Я отредактировал вопрос, чтобы быть более ясным, и для вашего первого вопроса я признаю, что функция выглядит как функция подкачки, а не разворот бит –
Я мог ошибаться, но я думаю, что функция 'bit_reverse_reorder' выполняя шаг [переброски бабочки] (https://en.wikipedia.org/wiki/Butterfly_diagram) этапа БПФ. Если вы не хорошо понимаете этот шаг БПФ, это будет трудно оптимизировать эту функцию. – Cornstalks