gpt4 book ai didi

c++ - 没有 if-else 语句的一维卷积(非 FFT)?

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:23 24 4
gpt4 key购买 nike

我编写了一个简单的串行一维卷积函数(如下)。我也在试验 GPU 卷积实现。这主要是出于我自己的好奇心;我正在尝试了解各种非 FFT 实现策略之间的性能权衡。

避免分支对我的 GPU 卷积实验很重要,因为在 Nvidia GPU 上分支很昂贵。我的一个 friend 提到有一种方法可以在没有 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 related posts , 但我不太理解避免条件语句的策略。
  • 我还编写了一个 2D 卷积实现,我希望将这篇 SO 帖子的结果也应用到 2D 版本。
  • 这不是家庭作业。它与我们的一个研究项目略有相关,但主要是为了学习。

最佳答案

你为什么不做这样的事情呢?

int lowerBound = std::max( 0, -vecIdx );
int upperBound = std::min( kernel.size(), vec.size() - vecIdx );
for( int kernelIdx = lowerBound; kernelIdx < upperBound; kernelIdx++ )

抱歉,如果我不明白这个问题。

关于c++ - 没有 if-else 语句的一维卷积(非 FFT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com