Векторизация сложного векторного умножения с использованием чередующегося формата данных в C / C ++ - PullRequest
1 голос
/ 17 октября 2019

Я работаю над выполнением сложного умножения между двумя массивами в C. Значения хранятся в формате с чередованием с плавающей запятой с действительными значениями при неравномерных индексах и сложными значениями при четных индексах. Я хочу ускорить вычисления, векторизовав умножение. Справочная информация: код должен выполняться в реальном времени и является частью быстрой свертки FFT в частотной области между сигналом X и H.

Ниже вы видите некоторый код. Он работает не так быстро, как мне бы это понадобилось (около 400 мкс для Y_N = 2 ^ 16 на i7-8750H).

Можете ли вы дать мне подсказку, как я могу еще больше ускорить "цикл"?

// dimension
long Y_N;
long Y_Ncpx = 2 * Y_N;

// free memory for interleaved float array containing complex data (real, imaginary, real, imaginary, ....
float *X = (float*)malloc(Y_Ncpx * sizeof(float));
float *H = (float*)malloc(Y_Ncpx * sizeof(float));
float *Y = (float*)malloc(Y_Ncpx * sizeof(float));
// fill in data

// caculate complex multiplication between X array and H array and save in Y array (How do we vectorize those part?)
long nreal;
long nimag;
for (long n = 0; n < Y_N; n++) {
    nreal = 2 * n;
    nimag = nreal + 1;
    Y[nreal] = X[nreal] * H[nreal] - X[nimag] * H[nimag]; // real part
    Y[nimag] = X[nreal] * H[nimag] + X[nimag] * H[nreal]; // imaginary part
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...