Справочная информация: я пытаюсь свертить сигнал из 512 элементов с фильтром длины = 36 элементов (или коэффициентов), и эту операцию необходимо выполнить на векторном процессоре (512-битном SIMD). Ниже приведен псевдокод:
for(i = 0; i < RBs ; i++) // Over Resource Blocks
{
for(j = 0; j < (IFFT_Len + Fil_Len -1); j++) // Over Output Length
{
acc = 0;
for(k = 0; k < Fil_Len; k++) // over conv operation
{
acc += Filter[k + (i * fil_data)] * IFFT[j - k + (i * ifft_data)];
}
x[j] = acc;
}
UFMC_sig += x;
}
Вывод конв. операция = len (A) + len (B) - 1
У меня есть 16-битные входы данных (значения IFFT и фильтра), что означает, что для операции у меня есть вектор len из 16 комплексных элементов (512/16(сложный) = 16). Я должен попытаться векторизовать циклы.
Если я векторизовать цикл "k", то он всегда будет извлекать данные vec_len из двух переменных, которые не нужны для каждой итерации, например, сj = 0;чтобы заполнить 0-е значение на выходе X как x [0], мне нужен только 0-й элемент из переменных Fil и IFFT. Однако при векторизации он будет извлекать vec_len данных из Fil (vec_len из "k" индексов) и vec_len данных с индексами, вычтенными из j (который равен 0 в 1-м итре), и будет получать отрицательные индексы для IFFT, что приведет кс ошибкой.
Если я векторизовать цикл "j", то x [j] придется ждать, пока все итерации "k" будут завершены. Тогда как мне запланировать это.
Другая проблема, связанная с длиной фильтра (36 элементов) и выходным len (547 элементов), не делится на 16 (не идеальная векторизация). Означает ли это, что его нельзя векторизовать.
Я не уверен, как решить эту проблему.
PS: Это реализовано с C