Операция векторизации свертки на векторном процессоре - PullRequest
1 голос
/ 07 ноября 2019

Справочная информация: я пытаюсь свертить сигнал из 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). Я должен попытаться векторизовать циклы.

  1. Если я векторизовать цикл "k", то он всегда будет извлекать данные vec_len из двух переменных, которые не нужны для каждой итерации, например, сj = 0;чтобы заполнить 0-е значение на выходе X как x [0], мне нужен только 0-й элемент из переменных Fil и IFFT. Однако при векторизации он будет извлекать vec_len данных из Fil (vec_len из "k" индексов) и vec_len данных с индексами, вычтенными из j (который равен 0 в 1-м итре), и будет получать отрицательные индексы для IFFT, что приведет кс ошибкой.

  2. Если я векторизовать цикл "j", то x [j] придется ждать, пока все итерации "k" будут завершены. Тогда как мне запланировать это.

  3. Другая проблема, связанная с длиной фильтра (36 элементов) и выходным len (547 элементов), не делится на 16 (не идеальная векторизация). Означает ли это, что его нельзя векторизовать.

Я не уверен, как решить эту проблему.

PS: Это реализовано с C

...