我编写了一个简单的串行一维卷积函数(如下)。我也在尝试 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;
}
一些简短的说明:
- 我确实找到了some https://stackoverflow.com/questions/10145452/cuda-small-kernel-2d-convolution-how-to-do-it?rq=1 related https://stackoverflow.com/questions/3886836/optimizing-1d-convolution posts https://stackoverflow.com/questions/7237907/1d-fast-convolution-without-fft,但我不太明白避免条件语句的策略。
- 我还编写了一个 2D 卷积实现,我希望也将这篇文章的结果应用到 2D 版本。
- 这不是家庭作业。它与我们的一项研究项目关系不大,但主要是为了学习。
你为什么不做这样的事情呢?
int lowerBound = std::max( 0, -vecIdx );
int upperBound = std::min( kernel.size(), vec.size() - vecIdx );
for( int kernelIdx = lowerBound; kernelIdx < upperBound; kernelIdx++ )
抱歉,如果我不明白这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)