向量处理器上的卷积运算向量化

时间:2019-11-07 11:10:49

标签: c vector vectorization simd convolution

背景:我正在尝试使用长度= 36个元素(或系数)的滤波器对512个元素的信号进行卷积,并且此操作需要在矢量处理器(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和滤波器值),这意味着对于该操作,我具有16个复数值元素的矢量len(512/16(复数)= 16)。我必须尝试向量化循环。

  1. 如果我对循环“ k”进行矢量化处理,则它将始终从两个变量中提取vec_len数据,这对于每次迭代都是不需要的,例如j = 0;为了将输出X中的第0个值填充为x [0],我只需要Fil和IFFT变量中的第0个元素。但是,在对其进行矢量化处理时,它将从Fil中提取数据的vec_len(“ k”个索引的vec_len),并从j中减去索引的数据的vec_len(在第一个itr中为0),并将获取IFFT的负索引,这将导致错误。

  2. 如果我对“ j”进行矢量化处理,则x [j]将必须等到“ k”的所有迭代完成。那我该如何安排时间呢?

  3. 另一个问题是Filter长度(36个元素)和输出len(547个元素)不能被16整除(不是完美的向量化)。这是否意味着它无法向量化。

我不确定如何解决此问题。

P.S:这是用C实现的

0 个答案:

没有答案
相关问题