首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GLSL能否执行递归公式计算?或者我怎样才能加速这个公式

GLSL能否执行递归公式计算?或者我怎样才能加速这个公式
EN

Stack Overflow用户
提问于 2015-01-10 03:19:10
回答 2查看 269关注 0票数 1

我想在我的iOS应用程序中实现这个公式。有没有办法用GLSL来加速这个公式。或者我能用脑力什么的来加速这个公式吗?

代码语言:javascript
运行
复制
for (k = 0; k < imageSize; k++) {
    imageOut[k] = imageOut[k-1] * a + imageIn[k] * b;
}

OpenCL不可用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-10 12:48:52

正如Dietrich Epp已经指出的那样,你所拥有的是IIR过滤器。在一台计算机上,没有“不有限”这样的东西,你总是受到数字精度、内存、可用计算时间等的限制--即使你无限地执行这个循环,由于你典型的数字表示的精度有限,你会在很早就失去任何对舍入错误有意义的东西。

因此,让我们诚实地说,并调用一个FIR滤波器具有非常长的响应时间。这些可以并行化吗?是的,他们可以,但为此,我们必须离开时间域,并从频域来看它。

假设您可以对系统的响应(=filter)对所有可能的信号进行建模,然后“回放”基于信号的响应给出所需的输出。在频域中,这将是对覆盖所有频率的宽带信号的响应系统的“记录”。但这个信号只是一个简单的冲动。这就是FIR和IIR这两个词的中间位置。

任何应用系统对任意信号的脉冲响应的卷积方法,都会给出系统对信号本身的响应。然而,计算时域卷积与将信号的傅里叶变换与脉冲响应的傅里叶变换相乘,并将结果转化回来是一样的。

代码语言:javascript
运行
复制
s * r = F^-1(F(s) · F(r))

傅立叶变换是可以很好地并行化的事情之一,GPU非常擅长于并行处理。

现在有基于GLSL的傅里叶变换代码,但通常这些代码是用OpenCL或CUDA编写的,以在GPU上运行。

不管怎么说,这是你的食谱:

确定IIR与FIR无法区分的截止k。确定脉冲响应的傅里叶变换(=复谱响应,CSR)。傅里叶变换:信号(=图像)与CSR相乘,然后再进行变换。

票数 2
EN

Stack Overflow用户

发布于 2015-01-10 06:27:48

这是一个典型的IIR过滤器,当将其转换为SIMD代码时,数据依赖会造成问题。这意味着您不能将操作作为简单的转换反馈或呈现到纹理操作。换句话说,GPU被设计为并行处理一堆数据,但是您的公式强制按顺序计算输出(如果不首先计算out[k],就无法计算out[k-1] )。

我看到了两种优化的方法:

不幸的是,没有很容易的翻译到GLSL。也许你可以用金属代替霓虹灯,我不确定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27872530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档