Я работаю над выполнением сложного умножения между двумя массивами в 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
}