我写了一个简单的串行一维卷积函数(如下)。我也在试验 GPU 卷积实现。这主要是出于我自己的好奇心;我正在尝试学习各种非 FFT 实施策略之间的性能权衡。
避免分支对于我的 GPU 卷积实验很重要,因为在 Nvidia GPU 上分支很昂贵。我的一个朋友提到有一种方法可以在没有if/else
语句的情况下实现下面的代码,但他不记得它是如何工作的。
如何在不使用任何if/else
语句的情况下进行正确的一维卷积实现?
这是我在 C++ 中的基本一维串行代码:
vector<int> myConv1d(vector<int> vec, vector<int> kernel)
{
int paddedLength = vec.size() + kernel.size() - 1;
vector<int> convolved(paddedLength); //zeros
reverse(kernel.begin(), kernel.end()); //flip the kernel (if we don't flip it, then we have correlation instead of convolution)
for(int outputIdx=0; outputIdx<paddedLength; outputIdx++) //index into 'convolved' vector
{
int vecIdx = outputIdx - kernel.size() + 1; //aligns with leftmost element of kernel
for(int kernelIdx=0; kernelIdx<kernel.size(); kernelIdx++)
{
if( (vecIdx+kernelIdx) >= 0 && (vecIdx+kernelIdx) < vec.size() ) //TODO: FIND A WAY TO REMOVE THIS
{
convolved[outputIdx] += kernel[kernelIdx]*vec[vecIdx+kernelIdx];
}
}
}
return convolved;
}
几个快速说明: