首页 文章

在WPF中显示CUDA处理的图像

提问于
浏览
4

我有一个WPF应用程序,从相机获取图像,处理这些图像,并显示它们 . 处理部分已经成为CPU的负担,所以我已经考虑将这个处理转移到GPU并针对它们运行自定义CUDA内核 . 基本流程如下:

1)从相机获取图像2)将图像加载到GPU上3)调用CUDA内核来处理图像4)显示处理后的图像

我想弄清楚WPF到CUDA到显示控制的策略 . 一旦将图像加载到GPU上,就不必卸载它以便显示,这似乎很自然 . 我已经读过这可以通过OpenGL来完成,但我是否真的需要学习OpenGL并将其包含在我的项目中以便快速显示CUDA处理的图像?

我理解(我认为)从C#调用CUDA内核的问题 . 我的计划是围绕我的CUDA调用构建一个非托管库,我稍后将其包装为C# - 或者 - 尝试决定尝试使用哪个托管包装器(managedCUDA,Cudafy等) . 我担心使用其中一个预制的包装纸,因为它们似乎都得到了轻微的支持......但也许我有错误的印象 .

无论如何,经过几天研究可能的选择后,我感到有点不知所措 . 任何建议将不胜感激 .

2 回答

  • 2

    获取CUDA计算结果并将其直接在设备上用于图形活动的过程称为"interop" . 有OpenGL "interop",还有DirectX "interop" . 有很多CUDA sample codes演示了如何与计算图像进行交互 .

    要直接从设备上的计算数据直接显示,无需访问主机,您将需要使用这两个API之一(OpenGL或DirectX) .

    你提到了我听说过的两个托管接口,所以你似乎意识到了那里的选择 .

    如果处理时间与将图像从主机传输到设备所花费的时间(远大于)相比要大得多,您可以考虑通过将图像从主机传输到设备,处理它,然后将其传回原来开始 . 然后,您可以使用您用过的相同管道来显示它 . 然后,您可以决定互操作的额外工作是否值得 .

    如果您可以对代码进行概要分析,以确定图像处理在主机上花费的时间,然后在设备上对原型进行原型设计以找出它的速度,那将是有益的 .

    您可能会发现处理时间太长,您甚至可以从双重复制安排中受益 . 或者您可能会发现主机上的处理时间太短(与传输到设备的成本相比),CUDA加速无效 .

  • 2

    WPF有一个名为D3DImage的控件,用于直接在屏幕上显示DirectX内容,在managedCuda示例包中,您可以使用它(与SlimDX一起)从Cuda Toolkit中找到原始流体样本的版本 . 你不必使用managedCuda来实现C#中的Cuda,但是你可以看看它是如何实现的:managedCuda samples

相关问题