0

我对 CUDA 比较陌生,目前正在进行一个项目,旨在加速连接 gpu 的嵌入式系统中的计算机视觉应用程序(NVIDIA TX1)。我要做的是在两个库之间进行选择:OpenCV 和 VisionWorks(包括 OpenVX)。

目前,我已经编写了运行 Canny Edge Detection 算法的测试代码,两个库显示了不同的执行时间(VisionWorks 实现大约减少了 30~40% 的时间)。

所以,我想知道原因可能是什么,因此分析了花费最多时间的内核:来自 OpenCV4Tegra 的'canny::edgesHysteresisLocalKernel',它占据了整个应用程序的 37.2%(来自 OpenCV 实现和 VisionWorks 实现)和VisionWorks 的“edgesHysteresisLocal”。

我遵循了“引导分析”,分析器建议应用程序都受延迟限制,下面是 VisionWorks 的“edgesHysteresisLocal”和 OpenCV4Tegra 的“canny::edgesHysteresisLocalKernel”的捕获。

OpenCV4Tegra - canny::edgesHysteresisLocalKernel

VisionWorks - 边缘HysteresisLocal

所以,我的问题是,

  • 从分析中,我能看出不同表现的原因是什么?

  • 此外,在分析一般的 CUDA 应用程序时,从哪里开始比较好?我的意思是,有很多指标,很难说要看什么。

  • 是否有一些关于一般分析 CUDA 应用程序的教育材料?(我查看了 NVIDIA 的许多幻灯片,我认为它们只是说明了指标的定义,而不是一般从哪里开始。)

-- 顺便说一下,据我所知,NVIDIA 不提供 VisionWorks 和 OpenCV4Tegra 的源代码。如我错了请纠正我。

预先感谢您的回答。

4

1 回答 1

1

1/ 两个库之间的 shared_memory 使用不同,这可能是性能差异的原因。


2/ 通常使用三个指标来了解我的算法是否适合 CUDA 设备:

  • 内核的内存使用(带宽)
  • 使用的寄存器数量:是否存在寄存器溢出?
  • 共享内存库冲突的数量

3/ 我觉得网上有很多东西....


另一件事 :

如果您只是想限定一个库与另一个库的使用以选择最好的,为什么您需要了解每个实现(这很有趣但不是先决条件,不是吗)?

你为什么不根据一个指标(误报、一组已知结果的平均误差……)用周期时间和产生结果的质量来衡量算法性能

于 2017-05-02T14:54:16.170 回答