【问题标题】:Using XNA to access GPGPU for image processing使用 XNA 访问 GPGPU 进行图像处理
【发布时间】:2012-05-10 06:32:39
【问题描述】:

我正在使用 C# 进行一些实时图像处理项目,我希望尽可能多地利用 GPU。

具体来说,我有几个 byte[] 包含原始位图数据,我需要对这些 byte[] 执行高通/低通滤波器、边缘检测、掩蔽、膨胀、孔填充、中值滤波器等操作尽可能接近 30 fps(图像非常小,不超过 640x480)

我知道还有其他 GPGPU 库(例如 CudafyGPU.netAccelerator),但它们的 EULA 要么禁止“以盈利为目的”使用该库,要么您需要购买许可证。

目前没有用于许可的资金,因此我正在尝试探索允许商业生产同时不花费任何成本的选项,而 XNA 似乎是我能找到的唯一符合这两个标准的选项。

有没有关于如何在非游戏环境中使用 XNA 访问 GPU 的资源?是否有任何其他选项可用于通过 C# 访问 GPU?

【问题讨论】:

  • 虽然您可以使用 XNA,但它有点乱。 SlimDX 有 DirectCompute 接口和 MIT 许可证,够好吗?

标签: c# image-processing xna gpu gpgpu


【解决方案1】:

我会通过Cloo 看看 OpenCL。它是开源的,并在 MIT 许可下发布,这意味着您可以愉快地将其包含在专有包中。

OpenCL 比 CUDA 更灵活一点,因为内核可以在可用的系统上的 GPU、CPU 和(理论上)单元处理器上运行 - 考虑运行 Mono+Linux+PS3,尽管我没有尝试过组合。

(GPU.NET 很好,因为它允许您用 C# 编写内核,但目前它们只能在 NVidia GPU 上运行。这对我来说是个大问题,因为我的开发笔记本电脑有 AMD 芯片组。)

OpenCL 内核是用 OpenCL 语言编写的,基本上是 C。它也受到 Intel、AMD 和 NVidia 的积极支持。

我将 Cloo/OpenCL+XNA 用于 FDTD(光学/波物理模拟)项目,效果很好。 OpenCL 代码在 GPU 上的 3D 阵列上运行;我会定期将缓冲区复制回主机,以便在 XNA 代码中进行可视化。

可能有一种方法可以在不与 CPU 来回切换的情况下共享该数据,但我还没有找到它,出于可视化目的,至少在我的应用程序中,影响很小。

【讨论】:

    【解决方案2】:

    作为这个库的作者,我是否可以推荐Brahma - 这是CodePlex 上的一个开源、免费用于商业用途的库(在 Eclipse 公共许可下),并自动将 LINQ 转换/运行为 OpenCL?

    当然,如果您希望使用 RAW OpenCL,我在 Codeplex 上还有一个 .NET 友好但原始 API 版本的 OpenCL hereNuget package

    查看here 以获取 Brahma 代码示例(此代码用于 FFT)。

    【讨论】:

    • 感谢您的链接! Brahma 会实时处理数据吗?我知道 HLSL 着色器将实时处理数据,除了它有很多开销(在编码中)。
    • 是的,Brahma 用于实时和高性能计算。请注意,Brahma 中的所有“魔法”都只是“编译”步骤,此时它变成了常规的 OpenCL 查询,并且运行速度一样快。当然,LINQ 语法是某些类型计算的主要限制因素。我正在努力使用 Roslyn 来解决这个问题,但可能需要一段时间才能在那里得到任何具体的东西。您可以尝试示例以查看 .NET 与 OpenCL 代码在 CPU 或 GPU 上的加速效果。
    • 我真的很喜欢你的 OpenCL.Net 项目。我需要原始速度,而 Linq(虽然很棒)是有限的。我会试试这个,看看我能得到什么样的性能提升:) 感谢您将我指向您的项目!看起来不错
    • @ananthonline 今天早上花了一些时间和 Brahma 一起玩 - 非常非常酷。多GPU支持会很好。 :)
    • 谢谢! Brahma 确实支持多 GPU:您只需要使用他们需要定位的设备创建 ComputeProvider(s) - 只需传入多个设备。
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多