【问题标题】:Comparing two images *using the GPU* in C# [closed]在 C# 中比较两个图像*使用 GPU* [关闭]
【发布时间】:2016-02-18 23:18:11
【问题描述】:

无论是使用OpenCV(不喜欢)、DirectX、Direct3D、OpenGL等,我想知道是否有可能使用GPU获得两个图像的差异。所以不关心目标机器是否安装了 Nvidia CUDA 卡,这个库将简单地利用任何 GPU 来对图像执行操作。我已经看了又看,但找不到为 C# 执行此操作的库。

这个问题非常直接且非常具体:哪个 C# 库具有使用 GPU 比较两个图像的函数/API 调用?

(我已经可以在 C# 中使用指针和不安全代码快速完成此操作,但如果以某种方式在 GPU 上完成,速度会快得多)

【问题讨论】:

  • 标记为关闭,因为根据规则不允许,此问题偏离主题:要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题偏离主题对于 Stack Overflow,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。

标签: c# opengl directx gpu direct3d


【解决方案1】:

如果你想在 GPU 上解决这个问题,请仔细考虑。您必须将数据传输到 GPU 并配置和启动 GPU 程序。这需要一些时间。而且由于 GPU 程序将非常小,因此开销可能大于性能增益。因此,首先尝试在 CPU 上并行化您的比较。 GPU 实现可能更慢(但也可能更快)。

有许多 API 可让您对 GPU 进行编程。据我所知,它们都不包含直接可用的 C# 代码。

首先,有图形库(DirectX、OpenGL)。它们允许您通过 Compute Shaders 对 GPU 进行编程。这些 API 有 C# 绑定,例如 SharpDX、SlimDX、OpenTK。但是,计算着色器需要能够支持这些着色器阶段的显卡。

还有纯计算 API,例如 CUDA 或 OpenCL。 CUDA 仅限于 nVidia GPU。 OpenCL 应该在大多数硬件上运行。但是图形设备也有一些限制。不过,它们通常低于计算着色器。 OpenTK 也是 OpenCL 的 C# 包装器。

【讨论】:

  • 进一步扩展,如果您对图像所做的唯一事情是for each pixel { x[i][j] = a[i][j] - b[i][j] } 将其移动到 GPU 几乎总是慢一点。这是因为这种任务会海量IO-bound,将图像移动到GPU可见内存只会增加IO成本。您不会利用 GPU 本身的大量数据并行性和巨大的内存带宽。但是,如果您要对图像执行多项操作,则传输成本可能是值得的。
猜你喜欢
  • 2020-05-09
  • 2021-12-31
  • 2016-10-30
  • 2018-09-19
  • 2017-03-14
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多